267 lines
8.5 KiB
Haxe
267 lines
8.5 KiB
Haxe
|
/*
|
||
|
* Copyright (C)2014-2020 Haxe Foundation
|
||
|
*
|
||
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||
|
* copy of this software and associated documentation files (the "Software"),
|
||
|
* to deal in the Software without restriction, including without limitation
|
||
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||
|
* and/or sell copies of the Software, and to permit persons to whom the
|
||
|
* Software is furnished to do so, subject to the following conditions:
|
||
|
*
|
||
|
* The above copyright notice and this permission notice shall be included in
|
||
|
* all copies or substantial portions of the Software.
|
||
|
*
|
||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||
|
* DEALINGS IN THE SOFTWARE.
|
||
|
*/
|
||
|
|
||
|
package js.node;
|
||
|
|
||
|
import haxe.DynamicAccess;
|
||
|
import js.node.cluster.Worker;
|
||
|
import js.node.events.EventEmitter;
|
||
|
|
||
|
@:enum abstract ClusterEvent<T:haxe.Constraints.Function>(Event<T>) to Event<T> {
|
||
|
/**
|
||
|
When a new worker is forked the cluster module will emit a 'fork' event.
|
||
|
This can be used to log worker activity, and create your own timeout.
|
||
|
|
||
|
Listener arguments:
|
||
|
* worker:Worker
|
||
|
**/
|
||
|
var Fork:ClusterEvent<Worker->Void> = "fork";
|
||
|
|
||
|
/**
|
||
|
After forking a new worker, the worker should respond with an online message.
|
||
|
When the master receives an online message it will emit this event.
|
||
|
|
||
|
The difference between 'fork' and 'online' is that fork is emitted when the master forks a worker,
|
||
|
and 'online' is emitted when the worker is running.
|
||
|
|
||
|
Listener arguments:
|
||
|
* worker:Worker
|
||
|
**/
|
||
|
var Online:ClusterEvent<Worker->Void> = "online";
|
||
|
|
||
|
/**
|
||
|
After calling `listen` from a worker, when the 'listening' event is emitted on the server,
|
||
|
a listening event will also be emitted on cluster in the master.
|
||
|
|
||
|
The event handler is executed with two arguments, the `worker` contains the worker object and
|
||
|
the `address` object contains the following connection properties: address, port and addressType.
|
||
|
This is very useful if the worker is listening on more than one address.
|
||
|
|
||
|
Listener arguments:
|
||
|
* worker:Worker
|
||
|
* address:ListeningEventAddress
|
||
|
**/
|
||
|
var Listening:ClusterEvent<Worker->ListeningEventAddress->Void> = "listening";
|
||
|
|
||
|
/**
|
||
|
Emitted after the worker IPC channel has disconnected.
|
||
|
|
||
|
This can occur when a worker exits gracefully, is killed,
|
||
|
or is disconnected manually (such as with `Worker.disconnect`).
|
||
|
|
||
|
There may be a delay between the 'disconnect' and 'exit' events.
|
||
|
|
||
|
These events can be used to detect if the process is stuck in a cleanup
|
||
|
or if there are long-living connections.
|
||
|
|
||
|
Listener arguments:
|
||
|
* worker:Worker
|
||
|
**/
|
||
|
var Disconnect:ClusterEvent<Worker->Void> = "disconnect";
|
||
|
|
||
|
/**
|
||
|
When any of the workers die the cluster module will emit the 'exit' event.
|
||
|
This can be used to restart the worker by calling `Cluster.fork` again.
|
||
|
|
||
|
Listener arguments:
|
||
|
* worker:Worker
|
||
|
* code:Int - the exit code, if it exited normally.
|
||
|
* signal:String - the name of the signal (eg. 'SIGHUP') that caused the process to be killed.
|
||
|
**/
|
||
|
var Exit:ClusterEvent<Worker->Int->String->Void> = "exit";
|
||
|
|
||
|
/**
|
||
|
Emitted the first time that `Cluster.setupMaster` is called.
|
||
|
**/
|
||
|
var Setup:ClusterEvent<ClusterSettings->Void> = "setup";
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Structure emitted by 'listening' event.
|
||
|
**/
|
||
|
typedef ListeningEventAddress = {
|
||
|
var address:String;
|
||
|
var port:Int;
|
||
|
var addressType:ListeningEventAddressType;
|
||
|
}
|
||
|
|
||
|
@:enum abstract ListeningEventAddressType(haxe.extern.EitherType<Int, String>) to haxe.extern.EitherType<Int, String> {
|
||
|
var TCPv4 = 4;
|
||
|
var TCPv6 = 6;
|
||
|
var Unix = -1;
|
||
|
var UDPv4 = "udp4";
|
||
|
var UDPv6 = "udp6";
|
||
|
}
|
||
|
|
||
|
@:jsRequire("cluster")
|
||
|
@:enum extern abstract ClusterSchedulingPolicy(Int) {
|
||
|
var SCHED_NONE;
|
||
|
var SCHED_RR;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
A single instance of Node runs in a single thread.
|
||
|
To take advantage of multi-core systems the user will sometimes want to launch a cluster of Node processes to handle the load.
|
||
|
The cluster module allows you to easily create child processes that all share server ports.
|
||
|
|
||
|
This feature was introduced recently, and may change in future versions. Please try it out and provide feedback.
|
||
|
|
||
|
Also note that, on Windows, it is not yet possible to set up a named pipe server in a worker.
|
||
|
**/
|
||
|
@:jsRequire("cluster")
|
||
|
extern class Cluster extends EventEmitter<Cluster> {
|
||
|
/**
|
||
|
A reference to the `Cluster` object returned by node.js module.
|
||
|
|
||
|
It can be imported into module namespace by using: "import js.node.Cluster.instance in cluster"
|
||
|
**/
|
||
|
public static inline var instance:Cluster = cast Cluster;
|
||
|
|
||
|
/**
|
||
|
The scheduling policy, either `SCHED_RR` for round-robin
|
||
|
or `SCHED_NONE` to leave it to the operating system.
|
||
|
|
||
|
This is a global setting and effectively frozen once you spawn the first worker
|
||
|
or call `setupMaster`, whatever comes first.
|
||
|
|
||
|
`SCHED_RR` is the default on all operating systems except Windows.
|
||
|
Windows will change to `SCHED_RR` once libuv is able to effectively distribute IOCP handles
|
||
|
without incurring a large performance hit.
|
||
|
|
||
|
`schedulingPolicy` can also be set through the NODE_CLUSTER_SCHED_POLICY environment variable.
|
||
|
Valid values are "rr" and "none".
|
||
|
**/
|
||
|
var schedulingPolicy:ClusterSchedulingPolicy;
|
||
|
|
||
|
/**
|
||
|
After calling `setupMaster` (or `fork`) this settings object will contain the settings, including the default values.
|
||
|
|
||
|
It is effectively frozen after being set, because `setupMaster` can only be called once.
|
||
|
|
||
|
This object is not supposed to be changed or set manually, by you.
|
||
|
**/
|
||
|
var settings(default, null):ClusterSettings;
|
||
|
|
||
|
/**
|
||
|
True if the process is a master.
|
||
|
This is determined by the process.env.NODE_UNIQUE_ID.
|
||
|
If process.env.NODE_UNIQUE_ID is undefined, then `isMaster` is true.
|
||
|
**/
|
||
|
var isMaster(default, null):Bool;
|
||
|
|
||
|
/**
|
||
|
True if the process is not a master (it is the negation of `isMaster`).
|
||
|
**/
|
||
|
var isWorker(default, null):Bool;
|
||
|
|
||
|
/**
|
||
|
`setupMaster` is used to change the default `fork` behavior.
|
||
|
|
||
|
Once called, the `settings` will be present in `settings`.
|
||
|
|
||
|
Note that:
|
||
|
Only the first call to `setupMaster` has any effect, subsequent calls are ignored
|
||
|
|
||
|
That because of the above, the only attribute of a worker that may be customized per-worker
|
||
|
is the `env` passed to `fork`
|
||
|
|
||
|
`fork` calls `setupMaster` internally to establish the defaults, so to have any effect,
|
||
|
`setupMaster` must be called before any calls to `fork`
|
||
|
**/
|
||
|
function setupMaster(?settings:{?exec:String, ?args:Array<String>, ?silent:Bool}):Void;
|
||
|
|
||
|
/**
|
||
|
Spawn a new worker process.
|
||
|
|
||
|
This can only be called from the master process.
|
||
|
**/
|
||
|
function fork(?env:DynamicAccess<String>):Worker;
|
||
|
|
||
|
/**
|
||
|
Calls `disconnect` on each worker in `workers`.
|
||
|
|
||
|
When they are disconnected all internal handles will be closed,
|
||
|
allowing the master process to die gracefully if no other event is waiting.
|
||
|
|
||
|
The method takes an optional `callback` argument which will be called when finished.
|
||
|
|
||
|
This can only be called from the master process.
|
||
|
**/
|
||
|
function disconnect(?callback:Void->Void):Void;
|
||
|
|
||
|
/**
|
||
|
A reference to the current worker object.
|
||
|
|
||
|
Not available in the master process.
|
||
|
**/
|
||
|
var worker(default, null):Worker;
|
||
|
|
||
|
/**
|
||
|
A hash that stores the active worker objects, keyed by `id` field.
|
||
|
Makes it easy to loop through all the workers.
|
||
|
|
||
|
It is only available in the master process.
|
||
|
|
||
|
A worker is removed from `workers` just before the 'disconnect' or 'exit' event is emitted.
|
||
|
|
||
|
Should you wish to reference a worker over a communication channel, using the worker's unique `id`
|
||
|
is the easiest way to find the worker.
|
||
|
**/
|
||
|
var workers(default, null):DynamicAccess<Worker>;
|
||
|
}
|
||
|
|
||
|
typedef ClusterSettings = {
|
||
|
/**
|
||
|
list of string arguments passed to the node executable.
|
||
|
Default: process.execArgv
|
||
|
**/
|
||
|
@:optional var execArgv(default, null):Array<String>;
|
||
|
|
||
|
/**
|
||
|
file path to worker file.
|
||
|
Default: process.argv[1]
|
||
|
**/
|
||
|
@:optional var exec(default, null):String;
|
||
|
|
||
|
/**
|
||
|
string arguments passed to worker.
|
||
|
Default: process.argv.slice(2)
|
||
|
**/
|
||
|
@:optional var args(default, null):Array<String>;
|
||
|
|
||
|
/**
|
||
|
whether or not to send output to parent's stdio.
|
||
|
Default: false
|
||
|
**/
|
||
|
@:optional var silent(default, null):Bool;
|
||
|
|
||
|
/**
|
||
|
Sets the user identity of the process.
|
||
|
**/
|
||
|
@:optional var uid(default, null):Int;
|
||
|
|
||
|
/**
|
||
|
Sets the group identity of the process.
|
||
|
**/
|
||
|
@:optional var gid(default, null):Int;
|
||
|
}
|