
Experiment to reproduce Erlang style processes in browser. The api follows the one from Erlang. All are found on the ProcessSystem
class
Documentation
https://elixirscript.github.io/processes/
Demo
https://elixirscript.github.io/processes/demo/
Usage
-
First, import the ProcessSystem create a new instance of one.
const Processes = require('erlang-processes')
let system = new Processes.default.ProcessSystem()
-
Now you can spawn processes using the system.
A process will switch to other processes when yield is used and will run until it completes.
var pid1 = system.spawn(function*() {
while (true) {
yield system.receive(function(value) {
return console.log(value)
})
system.send(pid2, 'message from 1')
}
})
system.register('Sally', pid1)
var pid2 = system.spawn(function*() {
while (true) {
system.send('Sally', 'message from 2')
yield system.receive(function(value) {
return console.log(value)
})
}
})
API
-
ProcessSystem
spawn(fun*) : pid
- Starts a process represented by the given generator function
spawn(module, fun, args) : pid
- Starts a process using the generator function from the specified module
link(pid) : void
- links the current process with the process from the given pid
unlink(pid) : void
- unlinks the current process from the process from the given pid
register(name, pid) : void
- registers the given name to the pid
whereis(name) : pid
- returns the pid registered by the given name or null if not registered
unregister(pid) : void
- unregisters the names associated with the pid
registered() : Array
- returns the liast of names that are registered
pid()
: pid` - returns the current process's pid
pidof(obj) : pid
- takes the input and tries to find the pid. Input can be a pid
, Process
, or name the pid is associated with
send(pid, msg) : msg
- sends a message the the process represented by the pid
receive(fun, timeout = 0, timeoutFn = () => true)
- Tells the current process to receive a message that the function can handle. If no match then the process is put in the suspended state until a message arrives or the timeout is reached. If the timeout is reached and no msg matches, then the timeoutFn is called
sleep(duration)
- puts the current process to sleep
exit(reason)
- terminates the current process with the given reason.
exit(pid, reason)
- tells the process with the pid to exit with the given reason
error(reason)
- terminates the current process with an error
process_flag(pid, flag, value)
- Sets flags on the given process.
process_flag(flag, value)
- Sets flags on the current process.
- Note: the only flag respected is the
Symbol.for("trap_exit")
flag. If value is true
, then exit signals from linked processes are turned into messages and sent to the current processes mailbox. If value is false
, the exit is treated as normal and terminates the process. Setting it to true
is useful for supervising processes.
put(key, value)
- Adds a value to the current process's dictionary
get(key, default_value = null)
- Gets a value from the current process's dictionary or the default if key not in dictionary
get_process_dict()
- Gets the current process's dictionary
get_keys()
- Gets all the keys from the current process's dictionary
get_keys(value)
- Gets all the keys from the current process's dictionary with the given value
erase(key)
- Removes the key and the associated value from the current process's dictionary
erase()
- Removes all entries from the current process's dictionary
is_alive(pid)
- Returns if the given pid is alive
make_ref()
- Returns a unique reference
list()
- Returns a list of all the pids
monitor(pid)
- Monitors the given process
demonitor(ref)
- Removes the monitor
-
ProcessSystem.run(fun, args, context = null)
- A static generator function used to wrap a normal function or generator. If fun is a function, it returns the value, if it's a generator, then it delegates yielding to the generator.
References