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 CHANGED
@@ -8,17 +8,15 @@ npm i bare-worker
8
8
 
9
9
  ## Usage
10
10
 
11
- ``` js
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
- .on('message', console.log)
19
- .on('exit', (code) => {
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 (filename, opts = {}) {
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.start()
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
- async _ononline () {
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
- EXITED: 0x10,
8
- DETACHED: 0x20,
9
- REFED: 0x40
7
+ DETACHED: 0x10,
8
+ REFED: 0x20
10
9
  },
11
10
  message: {
12
11
  MESSAGE: 0,
13
12
  ONLINE: 1,
14
- EXIT: 2,
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 (msg, code, fn = WorkerError) {
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 (msg) {
15
+ static ALREADY_STARTED(msg) {
16
16
  return new WorkerError(msg, 'ALREADY_STARTED', WorkerError.ALREADY_STARTED)
17
17
  }
18
18
  }
@@ -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)
@@ -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 (channel) {
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
- .on('newListener', this._onnewlistener)
18
- .on('removeListener', this._onremovelistener)
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 (message, transferList) {
46
- this._write({ type: constants.message.MESSAGE, value: message }, { transfer: transferList })
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('Worker has already started receiving messages')
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')] (handle) {
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 (data, opts = {}) {
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 _exit (exitCode) {
132
- await this._write({ type: constants.message.EXIT, exitCode })
137
+ async _error(error) {
138
+ await this._write({ type: constants.message.ERROR, error })
133
139
  }
134
140
 
135
- async _error (error) {
136
- await this._write({ type: constants.message.ERROR, error })
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
- await this._onmessage(message.value)
157
+ this._onmessage(message.value)
152
158
  break
153
159
  case constants.message.ONLINE:
154
- await this._ononline()
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
- await this._onerror(message.error)
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
- await this._onterminate()
169
+ this._onterminate()
164
170
  }
165
171
  }
166
172
  }
167
173
 
168
- _onnewlistener (name) {
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 (name) {
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
- async _onmessage (message) {
196
+ _onmessage(message) {
192
197
  this.emit('message', message)
193
198
  }
194
199
 
195
- async _ononline () {
200
+ _ononline() {
196
201
  this._state |= constants.state.ONLINE
202
+ this.emit('online')
197
203
  }
198
204
 
199
- async _onexit () {
200
- await this._port.close()
201
-
202
- this._state |= constants.state.EXITED
205
+ _onerror(err) {
206
+ this._exitCode = 1
207
+ this._terminate()
208
+ this.emit('error', err)
203
209
  }
204
210
 
205
- async _onerror () {}
211
+ _onbeforeexit(exitCode) {
212
+ this._exitCode = exitCode
213
+ }
206
214
 
207
- async _onterminate () {
215
+ _onterminate() {
208
216
  Bare.exit()
209
217
  }
210
218
 
211
219
  static _ports = new Set()
212
220
  }
213
221
 
214
- Bare.on('exit', (exitCode) => {
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
  })
@@ -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(Module.resolve(filename, url.pathToFileURL(os.cwd() + '/')))
23
+ Module.load(
24
+ Module.resolve(filename, url.pathToFileURL(os.cwd() + '/'), {
25
+ imports
26
+ }),
27
+ { imports }
28
+ )
30
29
 
31
- function onnewlistener (name, fn) {
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 (name, fn) {
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 (error) {
50
+ async function onerror(error) {
52
51
  await worker.parentPort._error(error)
53
52
 
54
- Bare.exit(1)
53
+ Bare.exitCode = 1
55
54
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bare-worker",
3
- "version": "2.0.1",
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": "standard && bare test.js"
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": "^4.1.0",
31
+ "bare-channel": "^5.0.5",
35
32
  "bare-events": "^2.2.1",
36
- "bare-module": "^4.0.0",
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
- "standard": "^17.0.0"
39
+ "prettier": "^3.4.1",
40
+ "prettier-config-standard": "^7.0.0"
43
41
  }
44
42
  }