bare-worker 2.0.1 → 3.0.1
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 +10 -23
- 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 -51
- package/lib/worker-thread.js +12 -13
- 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
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/* global Bare */
|
|
2
1
|
const Channel = require('bare-channel')
|
|
3
2
|
const MessageChannel = require('./lib/message-channel')
|
|
4
3
|
const MessagePort = require('./lib/message-port')
|
|
@@ -6,7 +5,7 @@ const constants = require('./lib/constants')
|
|
|
6
5
|
const { Thread } = Bare
|
|
7
6
|
|
|
8
7
|
module.exports = exports = class Worker extends MessagePort {
|
|
9
|
-
constructor
|
|
8
|
+
constructor(filename, opts = {}) {
|
|
10
9
|
const channel = new Channel({ interfaces: [MessagePort] })
|
|
11
10
|
|
|
12
11
|
super(channel)
|
|
@@ -17,18 +16,21 @@ module.exports = exports = class Worker extends MessagePort {
|
|
|
17
16
|
data: {
|
|
18
17
|
channel: channel.handle,
|
|
19
18
|
filename,
|
|
20
|
-
data: opts.workerData
|
|
19
|
+
data: opts.workerData,
|
|
20
|
+
imports: module.imports
|
|
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
|
@@ -1,28 +1,29 @@
|
|
|
1
|
-
/* global Bare */
|
|
2
1
|
const EventEmitter = require('bare-events')
|
|
3
2
|
const Channel = require('bare-channel')
|
|
4
3
|
const constants = require('./constants')
|
|
5
4
|
const errors = require('./errors')
|
|
6
5
|
|
|
7
6
|
module.exports = exports = class MessagePort extends EventEmitter {
|
|
8
|
-
constructor
|
|
7
|
+
constructor(channel) {
|
|
9
8
|
super()
|
|
10
9
|
|
|
11
10
|
this._state = 0
|
|
12
11
|
this._inflight = 0
|
|
13
12
|
this._channel = channel
|
|
14
13
|
this._port = null
|
|
14
|
+
this._exitCode = 0
|
|
15
15
|
|
|
16
|
-
this
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
this.on('newListener', this._onnewlistener).on(
|
|
17
|
+
'removeListener',
|
|
18
|
+
this._onremovelistener
|
|
19
|
+
)
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
get detached
|
|
22
|
+
get detached() {
|
|
22
23
|
return (this._state & constants.state.DETACHED) !== 0
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
start
|
|
26
|
+
start() {
|
|
26
27
|
if (this._state & constants.state.STARTED) return
|
|
27
28
|
|
|
28
29
|
this._state |= constants.state.STARTED
|
|
@@ -42,25 +43,28 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
42
43
|
MessagePort._ports.add(this)
|
|
43
44
|
}
|
|
44
45
|
|
|
45
|
-
postMessage
|
|
46
|
-
this._write(
|
|
46
|
+
postMessage(message, transferList) {
|
|
47
|
+
this._write(
|
|
48
|
+
{ type: constants.message.MESSAGE, value: message },
|
|
49
|
+
{ transfer: transferList }
|
|
50
|
+
)
|
|
47
51
|
}
|
|
48
52
|
|
|
49
|
-
close
|
|
53
|
+
close() {
|
|
50
54
|
this._close()
|
|
51
55
|
}
|
|
52
56
|
|
|
53
|
-
ref
|
|
57
|
+
ref() {
|
|
54
58
|
this._state |= constants.state.REFED
|
|
55
59
|
this._ref()
|
|
56
60
|
}
|
|
57
61
|
|
|
58
|
-
unref
|
|
62
|
+
unref() {
|
|
59
63
|
this._state &= ~constants.state.REFED
|
|
60
64
|
this._unref()
|
|
61
65
|
}
|
|
62
66
|
|
|
63
|
-
[Symbol.for('bare.inspect')]
|
|
67
|
+
[Symbol.for('bare.inspect')]() {
|
|
64
68
|
return {
|
|
65
69
|
__proto__: { constructor: MessagePort },
|
|
66
70
|
|
|
@@ -68,9 +72,11 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
68
72
|
}
|
|
69
73
|
}
|
|
70
74
|
|
|
71
|
-
[Symbol.for('bare.detach')]
|
|
75
|
+
[Symbol.for('bare.detach')]() {
|
|
72
76
|
if (this._state & constants.state.STARTED) {
|
|
73
|
-
throw errors.ALREADY_STARTED(
|
|
77
|
+
throw errors.ALREADY_STARTED(
|
|
78
|
+
'Worker has already started receiving messages'
|
|
79
|
+
)
|
|
74
80
|
}
|
|
75
81
|
|
|
76
82
|
this._state |= constants.state.DETACHED
|
|
@@ -82,17 +88,17 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
82
88
|
return handle
|
|
83
89
|
}
|
|
84
90
|
|
|
85
|
-
static [Symbol.for('bare.attach')]
|
|
91
|
+
static [Symbol.for('bare.attach')](handle) {
|
|
86
92
|
return new MessagePort(Channel.from(handle, { interfaces: [MessagePort] }))
|
|
87
93
|
}
|
|
88
94
|
|
|
89
|
-
_close
|
|
95
|
+
_close() {
|
|
90
96
|
if (this._port === null) this.start()
|
|
91
97
|
|
|
92
98
|
this._port.close()
|
|
93
99
|
}
|
|
94
100
|
|
|
95
|
-
_ref
|
|
101
|
+
_ref() {
|
|
96
102
|
if (this._port === null) return
|
|
97
103
|
|
|
98
104
|
if (this._inflight > 0 || (this._state & constants.state.REFED) !== 0) {
|
|
@@ -100,7 +106,7 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
100
106
|
}
|
|
101
107
|
}
|
|
102
108
|
|
|
103
|
-
_unref
|
|
109
|
+
_unref() {
|
|
104
110
|
if (this._port === null) return
|
|
105
111
|
|
|
106
112
|
if (this._inflight === 0 && (this._state & constants.state.REFED) === 0) {
|
|
@@ -108,7 +114,7 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
108
114
|
}
|
|
109
115
|
}
|
|
110
116
|
|
|
111
|
-
async _write
|
|
117
|
+
async _write(data, opts = {}) {
|
|
112
118
|
if (this._port === null) this.start()
|
|
113
119
|
|
|
114
120
|
this._inflight++
|
|
@@ -120,7 +126,7 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
120
126
|
this._unref()
|
|
121
127
|
}
|
|
122
128
|
|
|
123
|
-
async _online
|
|
129
|
+
async _online() {
|
|
124
130
|
if (this._state & constants.state.ONLINE) return
|
|
125
131
|
|
|
126
132
|
this._state |= constants.state.ONLINE
|
|
@@ -128,15 +134,15 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
128
134
|
await this._write({ type: constants.message.ONLINE })
|
|
129
135
|
}
|
|
130
136
|
|
|
131
|
-
async
|
|
132
|
-
await this._write({ type: constants.message.
|
|
137
|
+
async _error(error) {
|
|
138
|
+
await this._write({ type: constants.message.ERROR, error })
|
|
133
139
|
}
|
|
134
140
|
|
|
135
|
-
async
|
|
136
|
-
await this._write({ type: constants.message.
|
|
141
|
+
async _beforeExit(exitCode) {
|
|
142
|
+
await this._write({ type: constants.message.BEFORE_EXIT, exitCode })
|
|
137
143
|
}
|
|
138
144
|
|
|
139
|
-
async _terminate
|
|
145
|
+
async _terminate() {
|
|
140
146
|
if (this._state & constants.state.TERMINATING) return
|
|
141
147
|
|
|
142
148
|
this._state |= constants.state.TERMINATING
|
|
@@ -144,28 +150,28 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
144
150
|
await this._write({ type: constants.message.TERMINATE })
|
|
145
151
|
}
|
|
146
152
|
|
|
147
|
-
async _read
|
|
153
|
+
async _read() {
|
|
148
154
|
for await (const message of this._port) {
|
|
149
155
|
switch (message.type) {
|
|
150
156
|
case constants.message.MESSAGE:
|
|
151
|
-
|
|
157
|
+
this._onmessage(message.value)
|
|
152
158
|
break
|
|
153
159
|
case constants.message.ONLINE:
|
|
154
|
-
|
|
155
|
-
break
|
|
156
|
-
case constants.message.EXIT:
|
|
157
|
-
await this._onexit(message.exitCode)
|
|
160
|
+
this._ononline()
|
|
158
161
|
break
|
|
159
162
|
case constants.message.ERROR:
|
|
160
|
-
|
|
163
|
+
this._onerror(message.error)
|
|
164
|
+
break
|
|
165
|
+
case constants.message.BEFORE_EXIT:
|
|
166
|
+
this._onbeforeexit(message.exitCode)
|
|
161
167
|
break
|
|
162
168
|
case constants.message.TERMINATE:
|
|
163
|
-
|
|
169
|
+
this._onterminate()
|
|
164
170
|
}
|
|
165
171
|
}
|
|
166
172
|
}
|
|
167
173
|
|
|
168
|
-
_onnewlistener
|
|
174
|
+
_onnewlistener(name) {
|
|
169
175
|
if (name !== 'message') return
|
|
170
176
|
|
|
171
177
|
if (this.listenerCount('message') === 0) {
|
|
@@ -174,45 +180,45 @@ module.exports = exports = class MessagePort extends EventEmitter {
|
|
|
174
180
|
}
|
|
175
181
|
}
|
|
176
182
|
|
|
177
|
-
_onremovelistener
|
|
183
|
+
_onremovelistener(name) {
|
|
178
184
|
if (name !== 'message') return
|
|
179
185
|
|
|
180
186
|
if (this.listenerCount('message') === 0) this.unref()
|
|
181
187
|
}
|
|
182
188
|
|
|
183
|
-
_onclose
|
|
184
|
-
this._state |= constants.state.CLOSED
|
|
185
|
-
|
|
189
|
+
_onclose() {
|
|
186
190
|
MessagePort._ports.delete(this)
|
|
187
191
|
|
|
192
|
+
this._state |= constants.state.CLOSED
|
|
188
193
|
this.emit('close')
|
|
189
194
|
}
|
|
190
195
|
|
|
191
|
-
|
|
196
|
+
_onmessage(message) {
|
|
192
197
|
this.emit('message', message)
|
|
193
198
|
}
|
|
194
199
|
|
|
195
|
-
|
|
200
|
+
_ononline() {
|
|
196
201
|
this._state |= constants.state.ONLINE
|
|
202
|
+
this.emit('online')
|
|
197
203
|
}
|
|
198
204
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
this.
|
|
205
|
+
_onerror(err) {
|
|
206
|
+
this._exitCode = 1
|
|
207
|
+
this._terminate()
|
|
208
|
+
this.emit('error', err)
|
|
203
209
|
}
|
|
204
210
|
|
|
205
|
-
|
|
211
|
+
_onbeforeexit(exitCode) {
|
|
212
|
+
this._exitCode = exitCode
|
|
213
|
+
}
|
|
206
214
|
|
|
207
|
-
|
|
215
|
+
_onterminate() {
|
|
208
216
|
Bare.exit()
|
|
209
217
|
}
|
|
210
218
|
|
|
211
219
|
static _ports = new Set()
|
|
212
220
|
}
|
|
213
221
|
|
|
214
|
-
Bare.on('
|
|
215
|
-
for (const port of exports._ports)
|
|
216
|
-
port._exit(exitCode)
|
|
217
|
-
}
|
|
222
|
+
Bare.on('beforeExit', (exitCode) => {
|
|
223
|
+
for (const port of exports._ports) port._beforeExit(exitCode)
|
|
218
224
|
})
|
package/lib/worker-thread.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/* global Bare */
|
|
2
1
|
const Channel = require('bare-channel')
|
|
3
2
|
const Module = require('bare-module')
|
|
4
3
|
const os = require('bare-os')
|
|
@@ -7,16 +6,11 @@ const MessagePort = require('./message-port')
|
|
|
7
6
|
const worker = require('..')
|
|
8
7
|
const { Thread } = Bare
|
|
9
8
|
|
|
10
|
-
const {
|
|
11
|
-
channel: handle,
|
|
12
|
-
filename,
|
|
13
|
-
data
|
|
14
|
-
} = Thread.self.data
|
|
9
|
+
const { channel: handle, filename, data, imports } = Thread.self.data
|
|
15
10
|
|
|
16
11
|
const channel = Channel.from(handle, { interfaces: [MessagePort] })
|
|
17
12
|
|
|
18
|
-
Bare
|
|
19
|
-
.on('newListener', onnewlistener)
|
|
13
|
+
Bare.on('newListener', onnewlistener)
|
|
20
14
|
.on('removeListener', onremovelistener)
|
|
21
15
|
.on('uncaughtException', onerror)
|
|
22
16
|
.on('unhandledRejection', onerror)
|
|
@@ -26,9 +20,14 @@ worker.parentPort._online()
|
|
|
26
20
|
|
|
27
21
|
worker.workerData = data
|
|
28
22
|
|
|
29
|
-
Module.load(
|
|
23
|
+
Module.load(
|
|
24
|
+
Module.resolve(filename, url.pathToFileURL(os.cwd() + '/'), {
|
|
25
|
+
imports
|
|
26
|
+
}),
|
|
27
|
+
{ imports }
|
|
28
|
+
)
|
|
30
29
|
|
|
31
|
-
function onnewlistener
|
|
30
|
+
function onnewlistener(name, fn) {
|
|
32
31
|
if (fn === onremovelistener || fn === onerror) return
|
|
33
32
|
|
|
34
33
|
switch (name) {
|
|
@@ -38,7 +37,7 @@ function onnewlistener (name, fn) {
|
|
|
38
37
|
}
|
|
39
38
|
}
|
|
40
39
|
|
|
41
|
-
function onremovelistener
|
|
40
|
+
function onremovelistener(name, fn) {
|
|
42
41
|
if (fn === onremovelistener || fn === onerror) return
|
|
43
42
|
|
|
44
43
|
switch (name) {
|
|
@@ -48,8 +47,8 @@ function onremovelistener (name, fn) {
|
|
|
48
47
|
}
|
|
49
48
|
}
|
|
50
49
|
|
|
51
|
-
async function onerror
|
|
50
|
+
async function onerror(error) {
|
|
52
51
|
await worker.parentPort._error(error)
|
|
53
52
|
|
|
54
|
-
Bare.
|
|
53
|
+
Bare.exitCode = 1
|
|
55
54
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bare-worker",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.1",
|
|
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.5",
|
|
35
32
|
"bare-events": "^2.2.1",
|
|
36
|
-
"bare-module": "^
|
|
33
|
+
"bare-module": "^5.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
|
}
|