bare-worker 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -6
- package/index.js +8 -21
- package/lib/constants.js +3 -4
- package/lib/errors.js +3 -3
- package/lib/message-channel.js +1 -1
- package/lib/message-port.js +57 -50
- package/lib/worker-thread.js +7 -12
- package/package.json +6 -8
package/README.md
CHANGED
|
@@ -8,17 +8,15 @@ npm i bare-worker
|
|
|
8
8
|
|
|
9
9
|
## Usage
|
|
10
10
|
|
|
11
|
-
```
|
|
11
|
+
```js
|
|
12
12
|
const Worker = require('bare-worker')
|
|
13
13
|
|
|
14
14
|
if (Worker.isMainThread) {
|
|
15
15
|
const worker = new Worker(__filename)
|
|
16
16
|
|
|
17
|
-
worker
|
|
18
|
-
.
|
|
19
|
-
|
|
20
|
-
console.log('Worker exited with code', code)
|
|
21
|
-
})
|
|
17
|
+
worker.on('message', console.log).on('exit', (code) => {
|
|
18
|
+
console.log('Worker exited with code', code)
|
|
19
|
+
})
|
|
22
20
|
} else {
|
|
23
21
|
Worker.parentPort.postMessage('Hello worker')
|
|
24
22
|
}
|
package/index.js
CHANGED
|
@@ -6,7 +6,7 @@ const constants = require('./lib/constants')
|
|
|
6
6
|
const { Thread } = Bare
|
|
7
7
|
|
|
8
8
|
module.exports = exports = class Worker extends MessagePort {
|
|
9
|
-
constructor
|
|
9
|
+
constructor(filename, opts = {}) {
|
|
10
10
|
const channel = new Channel({ interfaces: [MessagePort] })
|
|
11
11
|
|
|
12
12
|
super(channel)
|
|
@@ -21,14 +21,16 @@ module.exports = exports = class Worker extends MessagePort {
|
|
|
21
21
|
}
|
|
22
22
|
})
|
|
23
23
|
|
|
24
|
-
this.
|
|
24
|
+
this._exitCode = 0
|
|
25
|
+
|
|
26
|
+
this.on('close', this._onexit).start()
|
|
25
27
|
}
|
|
26
28
|
|
|
27
|
-
terminate
|
|
29
|
+
terminate() {
|
|
28
30
|
this._terminate()
|
|
29
31
|
}
|
|
30
32
|
|
|
31
|
-
[Symbol.for('bare.inspect')]
|
|
33
|
+
[Symbol.for('bare.inspect')]() {
|
|
32
34
|
return {
|
|
33
35
|
__proto__: { constructor: Worker },
|
|
34
36
|
|
|
@@ -36,24 +38,9 @@ module.exports = exports = class Worker extends MessagePort {
|
|
|
36
38
|
}
|
|
37
39
|
}
|
|
38
40
|
|
|
39
|
-
|
|
40
|
-
await super._ononline()
|
|
41
|
-
|
|
42
|
-
this.emit('online')
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
async _onexit (exitCode) {
|
|
46
|
-
await super._onexit()
|
|
47
|
-
|
|
41
|
+
_onexit() {
|
|
48
42
|
this._thread.join()
|
|
49
|
-
|
|
50
|
-
this.emit('exit', exitCode)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
async _onerror (err) {
|
|
54
|
-
await super._onerror()
|
|
55
|
-
|
|
56
|
-
this.emit('error', err)
|
|
43
|
+
this.emit('exit', this._exitCode)
|
|
57
44
|
}
|
|
58
45
|
}
|
|
59
46
|
|
package/lib/constants.js
CHANGED
|
@@ -4,14 +4,13 @@ module.exports = {
|
|
|
4
4
|
STARTED: 0x2,
|
|
5
5
|
TERMINATING: 0x4,
|
|
6
6
|
CLOSED: 0x8,
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
REFED: 0x40
|
|
7
|
+
DETACHED: 0x10,
|
|
8
|
+
REFED: 0x20
|
|
10
9
|
},
|
|
11
10
|
message: {
|
|
12
11
|
MESSAGE: 0,
|
|
13
12
|
ONLINE: 1,
|
|
14
|
-
|
|
13
|
+
BEFORE_EXIT: 2,
|
|
15
14
|
ERROR: 3,
|
|
16
15
|
TERMINATE: 4
|
|
17
16
|
}
|
package/lib/errors.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
module.exports = class WorkerError extends Error {
|
|
2
|
-
constructor
|
|
2
|
+
constructor(msg, code, fn = WorkerError) {
|
|
3
3
|
super(`${code}: ${msg}`)
|
|
4
4
|
this.code = code
|
|
5
5
|
|
|
@@ -8,11 +8,11 @@ module.exports = class WorkerError extends Error {
|
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
get name
|
|
11
|
+
get name() {
|
|
12
12
|
return 'WorkerError'
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
static ALREADY_STARTED
|
|
15
|
+
static ALREADY_STARTED(msg) {
|
|
16
16
|
return new WorkerError(msg, 'ALREADY_STARTED', WorkerError.ALREADY_STARTED)
|
|
17
17
|
}
|
|
18
18
|
}
|
package/lib/message-channel.js
CHANGED
|
@@ -2,7 +2,7 @@ const Channel = require('bare-channel')
|
|
|
2
2
|
const MessagePort = require('./message-port')
|
|
3
3
|
|
|
4
4
|
module.exports = class MessageChannel {
|
|
5
|
-
constructor
|
|
5
|
+
constructor() {
|
|
6
6
|
const channel = new Channel({ interfaces: [MessagePort] })
|
|
7
7
|
|
|
8
8
|
this.port1 = new MessagePort(channel)
|
package/lib/message-port.js
CHANGED
|
@@ -5,24 +5,26 @@ const constants = require('./constants')
|
|
|
5
5
|
const errors = require('./errors')
|
|
6
6
|
|
|
7
7
|
module.exports = exports = class MessagePort extends EventEmitter {
|
|
8
|
-
constructor
|
|
8
|
+
constructor(channel) {
|
|
9
9
|
super()
|
|
10
10
|
|
|
11
11
|
this._state = 0
|
|
12
12
|
this._inflight = 0
|
|
13
13
|
this._channel = channel
|
|
14
14
|
this._port = null
|
|
15
|
+
this._exitCode = 0
|
|
15
16
|
|
|
16
|
-
this
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
this.on('newListener', this._onnewlistener).on(
|
|
18
|
+
'removeListener',
|
|
19
|
+
this._onremovelistener
|
|
20
|
+
)
|
|
19
21
|
}
|
|
20
22
|
|
|
21
|
-
get detached
|
|
23
|
+
get detached() {
|
|
22
24
|
return (this._state & constants.state.DETACHED) !== 0
|
|
23
25
|
}
|
|
24
26
|
|
|
25
|
-
start
|
|
27
|
+
start() {
|
|
26
28
|
if (this._state & constants.state.STARTED) return
|
|
27
29
|
|
|
28
30
|
this._state |= constants.state.STARTED
|
|
@@ -42,25 +44,28 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
42
44
|
MessagePort._ports.add(this)
|
|
43
45
|
}
|
|
44
46
|
|
|
45
|
-
postMessage
|
|
46
|
-
this._write(
|
|
47
|
+
postMessage(message, transferList) {
|
|
48
|
+
this._write(
|
|
49
|
+
{ type: constants.message.MESSAGE, value: message },
|
|
50
|
+
{ transfer: transferList }
|
|
51
|
+
)
|
|
47
52
|
}
|
|
48
53
|
|
|
49
|
-
close
|
|
54
|
+
close() {
|
|
50
55
|
this._close()
|
|
51
56
|
}
|
|
52
57
|
|
|
53
|
-
ref
|
|
58
|
+
ref() {
|
|
54
59
|
this._state |= constants.state.REFED
|
|
55
60
|
this._ref()
|
|
56
61
|
}
|
|
57
62
|
|
|
58
|
-
unref
|
|
63
|
+
unref() {
|
|
59
64
|
this._state &= ~constants.state.REFED
|
|
60
65
|
this._unref()
|
|
61
66
|
}
|
|
62
67
|
|
|
63
|
-
[Symbol.for('bare.inspect')]
|
|
68
|
+
[Symbol.for('bare.inspect')]() {
|
|
64
69
|
return {
|
|
65
70
|
__proto__: { constructor: MessagePort },
|
|
66
71
|
|
|
@@ -68,9 +73,11 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
68
73
|
}
|
|
69
74
|
}
|
|
70
75
|
|
|
71
|
-
[Symbol.for('bare.detach')]
|
|
76
|
+
[Symbol.for('bare.detach')]() {
|
|
72
77
|
if (this._state & constants.state.STARTED) {
|
|
73
|
-
throw errors.ALREADY_STARTED(
|
|
78
|
+
throw errors.ALREADY_STARTED(
|
|
79
|
+
'Worker has already started receiving messages'
|
|
80
|
+
)
|
|
74
81
|
}
|
|
75
82
|
|
|
76
83
|
this._state |= constants.state.DETACHED
|
|
@@ -82,17 +89,17 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
82
89
|
return handle
|
|
83
90
|
}
|
|
84
91
|
|
|
85
|
-
static [Symbol.for('bare.attach')]
|
|
92
|
+
static [Symbol.for('bare.attach')](handle) {
|
|
86
93
|
return new MessagePort(Channel.from(handle, { interfaces: [MessagePort] }))
|
|
87
94
|
}
|
|
88
95
|
|
|
89
|
-
_close
|
|
96
|
+
_close() {
|
|
90
97
|
if (this._port === null) this.start()
|
|
91
98
|
|
|
92
99
|
this._port.close()
|
|
93
100
|
}
|
|
94
101
|
|
|
95
|
-
_ref
|
|
102
|
+
_ref() {
|
|
96
103
|
if (this._port === null) return
|
|
97
104
|
|
|
98
105
|
if (this._inflight > 0 || (this._state & constants.state.REFED) !== 0) {
|
|
@@ -100,7 +107,7 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
100
107
|
}
|
|
101
108
|
}
|
|
102
109
|
|
|
103
|
-
_unref
|
|
110
|
+
_unref() {
|
|
104
111
|
if (this._port === null) return
|
|
105
112
|
|
|
106
113
|
if (this._inflight === 0 && (this._state & constants.state.REFED) === 0) {
|
|
@@ -108,7 +115,7 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
108
115
|
}
|
|
109
116
|
}
|
|
110
117
|
|
|
111
|
-
async _write
|
|
118
|
+
async _write(data, opts = {}) {
|
|
112
119
|
if (this._port === null) this.start()
|
|
113
120
|
|
|
114
121
|
this._inflight++
|
|
@@ -120,7 +127,7 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
120
127
|
this._unref()
|
|
121
128
|
}
|
|
122
129
|
|
|
123
|
-
async _online
|
|
130
|
+
async _online() {
|
|
124
131
|
if (this._state & constants.state.ONLINE) return
|
|
125
132
|
|
|
126
133
|
this._state |= constants.state.ONLINE
|
|
@@ -128,15 +135,15 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
128
135
|
await this._write({ type: constants.message.ONLINE })
|
|
129
136
|
}
|
|
130
137
|
|
|
131
|
-
async
|
|
132
|
-
await this._write({ type: constants.message.
|
|
138
|
+
async _error(error) {
|
|
139
|
+
await this._write({ type: constants.message.ERROR, error })
|
|
133
140
|
}
|
|
134
141
|
|
|
135
|
-
async
|
|
136
|
-
await this._write({ type: constants.message.
|
|
142
|
+
async _beforeExit(exitCode) {
|
|
143
|
+
await this._write({ type: constants.message.BEFORE_EXIT, exitCode })
|
|
137
144
|
}
|
|
138
145
|
|
|
139
|
-
async _terminate
|
|
146
|
+
async _terminate() {
|
|
140
147
|
if (this._state & constants.state.TERMINATING) return
|
|
141
148
|
|
|
142
149
|
this._state |= constants.state.TERMINATING
|
|
@@ -144,28 +151,28 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
144
151
|
await this._write({ type: constants.message.TERMINATE })
|
|
145
152
|
}
|
|
146
153
|
|
|
147
|
-
async _read
|
|
154
|
+
async _read() {
|
|
148
155
|
for await (const message of this._port) {
|
|
149
156
|
switch (message.type) {
|
|
150
157
|
case constants.message.MESSAGE:
|
|
151
|
-
|
|
158
|
+
this._onmessage(message.value)
|
|
152
159
|
break
|
|
153
160
|
case constants.message.ONLINE:
|
|
154
|
-
|
|
155
|
-
break
|
|
156
|
-
case constants.message.EXIT:
|
|
157
|
-
await this._onexit(message.exitCode)
|
|
161
|
+
this._ononline()
|
|
158
162
|
break
|
|
159
163
|
case constants.message.ERROR:
|
|
160
|
-
|
|
164
|
+
this._onerror(message.error)
|
|
165
|
+
break
|
|
166
|
+
case constants.message.BEFORE_EXIT:
|
|
167
|
+
this._onbeforeexit(message.exitCode)
|
|
161
168
|
break
|
|
162
169
|
case constants.message.TERMINATE:
|
|
163
|
-
|
|
170
|
+
this._onterminate()
|
|
164
171
|
}
|
|
165
172
|
}
|
|
166
173
|
}
|
|
167
174
|
|
|
168
|
-
_onnewlistener
|
|
175
|
+
_onnewlistener(name) {
|
|
169
176
|
if (name !== 'message') return
|
|
170
177
|
|
|
171
178
|
if (this.listenerCount('message') === 0) {
|
|
@@ -174,45 +181,45 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
174
181
|
}
|
|
175
182
|
}
|
|
176
183
|
|
|
177
|
-
_onremovelistener
|
|
184
|
+
_onremovelistener(name) {
|
|
178
185
|
if (name !== 'message') return
|
|
179
186
|
|
|
180
187
|
if (this.listenerCount('message') === 0) this.unref()
|
|
181
188
|
}
|
|
182
189
|
|
|
183
|
-
_onclose
|
|
184
|
-
this._state |= constants.state.CLOSED
|
|
185
|
-
|
|
190
|
+
_onclose() {
|
|
186
191
|
MessagePort._ports.delete(this)
|
|
187
192
|
|
|
193
|
+
this._state |= constants.state.CLOSED
|
|
188
194
|
this.emit('close')
|
|
189
195
|
}
|
|
190
196
|
|
|
191
|
-
|
|
197
|
+
_onmessage(message) {
|
|
192
198
|
this.emit('message', message)
|
|
193
199
|
}
|
|
194
200
|
|
|
195
|
-
|
|
201
|
+
_ononline() {
|
|
196
202
|
this._state |= constants.state.ONLINE
|
|
203
|
+
this.emit('online')
|
|
197
204
|
}
|
|
198
205
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
this.
|
|
206
|
+
_onerror(err) {
|
|
207
|
+
this._exitCode = 1
|
|
208
|
+
this._terminate()
|
|
209
|
+
this.emit('error', err)
|
|
203
210
|
}
|
|
204
211
|
|
|
205
|
-
|
|
212
|
+
_onbeforeexit(exitCode) {
|
|
213
|
+
this._exitCode = exitCode
|
|
214
|
+
}
|
|
206
215
|
|
|
207
|
-
|
|
216
|
+
_onterminate() {
|
|
208
217
|
Bare.exit()
|
|
209
218
|
}
|
|
210
219
|
|
|
211
220
|
static _ports = new Set()
|
|
212
221
|
}
|
|
213
222
|
|
|
214
|
-
Bare.on('
|
|
215
|
-
for (const port of exports._ports)
|
|
216
|
-
port._exit(exitCode)
|
|
217
|
-
}
|
|
223
|
+
Bare.on('beforeExit', (exitCode) => {
|
|
224
|
+
for (const port of exports._ports) port._beforeExit(exitCode)
|
|
218
225
|
})
|
package/lib/worker-thread.js
CHANGED
|
@@ -2,21 +2,16 @@
|
|
|
2
2
|
const Channel = require('bare-channel')
|
|
3
3
|
const Module = require('bare-module')
|
|
4
4
|
const os = require('bare-os')
|
|
5
|
-
const url = require('
|
|
5
|
+
const url = require('bare-url')
|
|
6
6
|
const MessagePort = require('./message-port')
|
|
7
7
|
const worker = require('..')
|
|
8
8
|
const { Thread } = Bare
|
|
9
9
|
|
|
10
|
-
const {
|
|
11
|
-
channel: handle,
|
|
12
|
-
filename,
|
|
13
|
-
data
|
|
14
|
-
} = Thread.self.data
|
|
10
|
+
const { channel: handle, filename, data } = Thread.self.data
|
|
15
11
|
|
|
16
12
|
const channel = Channel.from(handle, { interfaces: [MessagePort] })
|
|
17
13
|
|
|
18
|
-
Bare
|
|
19
|
-
.on('newListener', onnewlistener)
|
|
14
|
+
Bare.on('newListener', onnewlistener)
|
|
20
15
|
.on('removeListener', onremovelistener)
|
|
21
16
|
.on('uncaughtException', onerror)
|
|
22
17
|
.on('unhandledRejection', onerror)
|
|
@@ -28,7 +23,7 @@ worker.workerData = data
|
|
|
28
23
|
|
|
29
24
|
Module.load(Module.resolve(filename, url.pathToFileURL(os.cwd() + '/')))
|
|
30
25
|
|
|
31
|
-
function onnewlistener
|
|
26
|
+
function onnewlistener(name, fn) {
|
|
32
27
|
if (fn === onremovelistener || fn === onerror) return
|
|
33
28
|
|
|
34
29
|
switch (name) {
|
|
@@ -38,7 +33,7 @@ function onnewlistener (name, fn) {
|
|
|
38
33
|
}
|
|
39
34
|
}
|
|
40
35
|
|
|
41
|
-
function onremovelistener
|
|
36
|
+
function onremovelistener(name, fn) {
|
|
42
37
|
if (fn === onremovelistener || fn === onerror) return
|
|
43
38
|
|
|
44
39
|
switch (name) {
|
|
@@ -48,8 +43,8 @@ function onremovelistener (name, fn) {
|
|
|
48
43
|
}
|
|
49
44
|
}
|
|
50
45
|
|
|
51
|
-
async function onerror
|
|
46
|
+
async function onerror(error) {
|
|
52
47
|
await worker.parentPort._error(error)
|
|
53
48
|
|
|
54
|
-
Bare.
|
|
49
|
+
Bare.exitCode = 1
|
|
55
50
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bare-worker",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Higher-level worker threads for JavaScript",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./index.js",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"lib"
|
|
16
16
|
],
|
|
17
17
|
"scripts": {
|
|
18
|
-
"test": "
|
|
18
|
+
"test": "prettier . --check && bare test.js"
|
|
19
19
|
},
|
|
20
20
|
"repository": {
|
|
21
21
|
"type": "git",
|
|
@@ -27,18 +27,16 @@
|
|
|
27
27
|
"url": "https://github.com/holepunchto/bare-worker/issues"
|
|
28
28
|
},
|
|
29
29
|
"homepage": "https://github.com/holepunchto/bare-worker#readme",
|
|
30
|
-
"engines": {
|
|
31
|
-
"bare": ">=1.2.0"
|
|
32
|
-
},
|
|
33
30
|
"dependencies": {
|
|
34
|
-
"bare-channel": "^
|
|
31
|
+
"bare-channel": "^5.0.1",
|
|
35
32
|
"bare-events": "^2.2.1",
|
|
36
33
|
"bare-module": "^4.0.0",
|
|
37
34
|
"bare-os": "^3.0.1",
|
|
38
|
-
"
|
|
35
|
+
"bare-url": "^2.0.1"
|
|
39
36
|
},
|
|
40
37
|
"devDependencies": {
|
|
41
38
|
"brittle": "^3.2.1",
|
|
42
|
-
"
|
|
39
|
+
"prettier": "^3.4.1",
|
|
40
|
+
"prettier-config-standard": "^7.0.0"
|
|
43
41
|
}
|
|
44
42
|
}
|