teth
Version:
Functional, reactive, pattern matching based, centralized state tree, open source JS library.
61 lines (52 loc) • 1.61 kB
JavaScript
/* Copyright 2017 Ronny Reichmann */
/* RESONATE PRODUCTION implementation provides concurrency */
const auid = require('./auid')
const { context, raise, send, circular, _resonator } = require('./T')
const allRunningWorkers = []
const allThisSideStates = {}
const allOtherSideTransports = {}
const ctx = context()
function resonate (fileName) {
if (window.Worker) {
const worker = new window.Worker(fileName)
worker.onmessage = e => {
const message = e.data
allOtherSideTransports[message.transportId] = message
}
allRunningWorkers.push(worker)
} else {
console.error('Please update your browser to run this application')
}
}
function makeTransport (message) {
return Object.freeze(Object.assign({
transportId: auid()
}, message))
}
function dispatchToWorker (state) {
if (state.index === Object.keys(allThisSideStates).length) {
} else {
const nextWorker = allThisSideStates[state.message.transportId]
nextWorker.postMessage(state.message)
}
}
_resonator(message => {
if (message.transportId) {
if (allOtherSideTransports[message.transportId]) {
// no responder for message from other side
} else {
// someone is using a reserved message property
raise('The property "transportId" is reserved for concurrency messaging', -13)
}
} else {
// fresh this side message
const transportMessage = makeTransport(message)
const state = {
message: transportMessage,
index: 0
}
allThisSideStates[state.message.transportId] = state
dispatchToWorker(state)
}
})
module.exports = resonate