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 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
@@ -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 (filename, opts = {}) {
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.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)
@@ -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 (channel) {
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
- .on('newListener', this._onnewlistener)
18
- .on('removeListener', this._onremovelistener)
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 (message, transferList) {
46
- this._write({ type: constants.message.MESSAGE, value: message }, { transfer: transferList })
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('Worker has already started receiving messages')
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')] (handle) {
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 (data, opts = {}) {
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 _exit (exitCode) {
132
- await this._write({ type: constants.message.EXIT, exitCode })
138
+ async _error(error) {
139
+ await this._write({ type: constants.message.ERROR, error })
133
140
  }
134
141
 
135
- async _error (error) {
136
- await this._write({ type: constants.message.ERROR, error })
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
- await this._onmessage(message.value)
158
+ this._onmessage(message.value)
152
159
  break
153
160
  case constants.message.ONLINE:
154
- await this._ononline()
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
- await this._onerror(message.error)
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
- await this._onterminate()
170
+ this._onterminate()
164
171
  }
165
172
  }
166
173
  }
167
174
 
168
- _onnewlistener (name) {
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 (name) {
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
- async _onmessage (message) {
197
+ _onmessage(message) {
192
198
  this.emit('message', message)
193
199
  }
194
200
 
195
- async _ononline () {
201
+ _ononline() {
196
202
  this._state |= constants.state.ONLINE
203
+ this.emit('online')
197
204
  }
198
205
 
199
- async _onexit () {
200
- await this._port.close()
201
-
202
- this._state |= constants.state.EXITED
206
+ _onerror(err) {
207
+ this._exitCode = 1
208
+ this._terminate()
209
+ this.emit('error', err)
203
210
  }
204
211
 
205
- async _onerror () {}
212
+ _onbeforeexit(exitCode) {
213
+ this._exitCode = exitCode
214
+ }
206
215
 
207
- async _onterminate () {
216
+ _onterminate() {
208
217
  Bare.exit()
209
218
  }
210
219
 
211
220
  static _ports = new Set()
212
221
  }
213
222
 
214
- Bare.on('exit', (exitCode) => {
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
  })
@@ -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('url-file-url')
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 (name, fn) {
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 (name, fn) {
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 (error) {
46
+ async function onerror(error) {
52
47
  await worker.parentPort._error(error)
53
48
 
54
- Bare.exit(1)
49
+ Bare.exitCode = 1
55
50
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bare-worker",
3
- "version": "2.0.0",
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": "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.1",
35
32
  "bare-events": "^2.2.1",
36
33
  "bare-module": "^4.0.0",
37
34
  "bare-os": "^3.0.1",
38
- "url-file-url": "^1.0.2"
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
  }