bare-worker 4.0.0 → 4.1.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/global.js ADDED
@@ -0,0 +1,4 @@
1
+ const { MessageChannel, MessagePort } = require('.')
2
+
3
+ global.MessageChannel = MessageChannel
4
+ global.MessagePort = MessagePort
package/index.js CHANGED
@@ -1,24 +1,27 @@
1
+ const Thread = require('bare-thread')
1
2
  const Channel = require('bare-channel')
2
3
  const MessageChannel = require('./lib/message-channel')
3
4
  const MessagePort = require('./lib/message-port')
4
5
  const constants = require('./lib/constants')
5
6
  const preloads = require('./lib/preloads')
6
- const { Thread } = Bare
7
+
8
+ const worker = Thread.prepare(require.resolve('./lib/worker-thread'), { shared: true })
7
9
 
8
10
  module.exports = exports = class Worker extends MessagePort {
9
- constructor(filename, opts = {}) {
11
+ constructor(entry, opts = {}) {
12
+ const { workerData } = opts
13
+
10
14
  const channel = new Channel({ interfaces: [MessagePort] })
11
15
 
12
16
  super(channel)
13
17
 
14
18
  this._state = constants.state.REFED
15
19
 
16
- this._thread = new Thread(require.resolve('./lib/worker-thread'), {
20
+ this._thread = new Thread(worker, {
17
21
  data: {
22
+ source: Thread.prepare(entry, { shared: true }),
18
23
  channel: channel.handle,
19
- filename,
20
- data: opts.workerData,
21
- imports: module.imports,
24
+ workerData,
22
25
  preloads
23
26
  }
24
27
  })
@@ -72,6 +75,6 @@ exports.parentPort = null
72
75
 
73
76
  exports.workerData = null
74
77
 
75
- exports.preload = function preload(filename) {
76
- preloads.add(filename)
78
+ exports.preload = function preload(entry) {
79
+ preloads.set(entry, Thread.prepare(entry, { shared: true }))
77
80
  }
package/lib/errors.js CHANGED
@@ -1,11 +1,10 @@
1
1
  module.exports = class WorkerError extends Error {
2
- constructor(msg, code, fn = WorkerError) {
2
+ constructor(msg, fn = WorkerError, code = fn.name) {
3
3
  super(`${code}: ${msg}`)
4
+
4
5
  this.code = code
5
6
 
6
- if (Error.captureStackTrace) {
7
- Error.captureStackTrace(this, fn)
8
- }
7
+ if (Error.captureStackTrace) Error.captureStackTrace(this, fn)
9
8
  }
10
9
 
11
10
  get name() {
@@ -13,6 +12,6 @@ module.exports = class WorkerError extends Error {
13
12
  }
14
13
 
15
14
  static ALREADY_STARTED(msg) {
16
- return new WorkerError(msg, 'ALREADY_STARTED', WorkerError.ALREADY_STARTED)
15
+ return new WorkerError(msg, WorkerError.ALREADY_STARTED)
17
16
  }
18
17
  }
@@ -13,10 +13,7 @@ module.exports = exports = class MessagePort extends EventEmitter {
13
13
  this._port = null
14
14
  this._exitCode = 0
15
15
 
16
- this.on('newListener', this._onnewlistener).on(
17
- 'removeListener',
18
- this._onremovelistener
19
- )
16
+ this.on('newListener', this._onnewlistener).on('removeListener', this._onremovelistener)
20
17
  }
21
18
 
22
19
  get detached() {
@@ -44,10 +41,7 @@ module.exports = exports = class MessagePort extends EventEmitter {
44
41
  }
45
42
 
46
43
  postMessage(message, transferList) {
47
- this._write(
48
- { type: constants.message.MESSAGE, value: message },
49
- { transfer: transferList }
50
- )
44
+ this._write({ type: constants.message.MESSAGE, value: message }, { transfer: transferList })
51
45
  }
52
46
 
53
47
  close() {
@@ -74,9 +68,7 @@ module.exports = exports = class MessagePort extends EventEmitter {
74
68
 
75
69
  [Symbol.for('bare.detach')]() {
76
70
  if (this._state & constants.state.STARTED) {
77
- throw errors.ALREADY_STARTED(
78
- 'Worker has already started receiving messages'
79
- )
71
+ throw errors.ALREADY_STARTED('Worker has already started receiving messages')
80
72
  }
81
73
 
82
74
  this._state |= constants.state.DETACHED
package/lib/preloads.js CHANGED
@@ -1,6 +1,6 @@
1
- const { Thread } = Bare
1
+ const Thread = require('bare-thread')
2
2
 
3
- const preloads = new Set()
3
+ const preloads = new Map()
4
4
 
5
5
  if (
6
6
  Thread.self &&
@@ -9,7 +9,9 @@ if (
9
9
  typeof Thread.self.data.preloads === 'object' &&
10
10
  Thread.self.data.preloads !== null
11
11
  ) {
12
- for (const filename of Thread.self.data.preloads) preloads.add(filename)
12
+ for (const [entry, source] of Thread.self.data.preloads) {
13
+ preloads.set(entry, source)
14
+ }
13
15
  }
14
16
 
15
17
  module.exports = preloads
@@ -1,33 +1,48 @@
1
1
  const Channel = require('bare-channel')
2
2
  const Module = require('bare-module')
3
- const os = require('bare-os')
4
- const url = require('bare-url')
5
- const MessagePort = require('./message-port')
6
- const worker = require('..')
7
- const { Thread } = Bare
3
+ const Bundle = require('bare-bundle')
8
4
 
9
- const { channel: handle, filename, data, imports, preloads } = Thread.self.data
5
+ const { source, channel: handle, workerData, preloads } = Bare.Thread.self.data
10
6
 
11
- for (const preload of preloads) require(preload)
7
+ const bundle = Bundle.from(source)
12
8
 
13
- const channel = Channel.from(handle, { interfaces: [MessagePort] })
9
+ const protocol = module.protocol.extend({
10
+ postresolve(context, url) {
11
+ return bundle.exists(url.href) ? url : context.postresolve(url)
12
+ },
13
+
14
+ exists(context, url, type) {
15
+ return bundle.exists(url.href) || context.exists(url, type)
16
+ },
17
+
18
+ read(context, url) {
19
+ return bundle.read(url.href) || context.read(url)
20
+ }
21
+ })
22
+
23
+ const { main, imports, resolutions } = bundle
24
+
25
+ const resolved = Module.resolve('bare-worker', new URL(main), { protocol, imports, resolutions })
26
+
27
+ const cache = Object.create(null)
28
+
29
+ const Worker = Module.load(resolved, { protocol, cache }).exports
30
+
31
+ const channel = Channel.from(handle, { interfaces: [Worker.MessagePort] })
32
+
33
+ Worker.parentPort = new Worker.MessagePort(channel)
34
+ Worker.parentPort._online()
35
+
36
+ Worker.workerData = Bare.Thread.self.data = workerData
14
37
 
15
38
  Bare.on('newListener', onnewlistener)
16
39
  .on('removeListener', onremovelistener)
17
40
  .on('uncaughtException', onerror)
18
41
  .on('unhandledRejection', onerror)
19
42
 
20
- worker.parentPort = new MessagePort(channel)
21
- worker.parentPort._online()
22
-
23
- worker.workerData = data
43
+ for (const [entry, source] of preloads) Module.load(new URL(entry), source, { cache })
24
44
 
25
- Module.load(
26
- Module.resolve(filename, url.pathToFileURL(os.cwd() + '/'), {
27
- imports
28
- }),
29
- { imports }
30
- )
45
+ Module.load(new URL('bare:/worker.bundle'), bundle, { cache })
31
46
 
32
47
  function onnewlistener(name, fn) {
33
48
  if (fn === onremovelistener || fn === onerror) return
@@ -50,7 +65,7 @@ function onremovelistener(name, fn) {
50
65
  }
51
66
 
52
67
  async function onerror(error) {
53
- await worker.parentPort._error(error)
68
+ await Worker.parentPort._error(error)
54
69
 
55
70
  Bare.exitCode = 1
56
71
  }
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "bare-worker",
3
- "version": "4.0.0",
3
+ "version": "4.1.1",
4
4
  "description": "Higher-level worker threads for JavaScript",
5
5
  "exports": {
6
6
  ".": "./index.js",
7
7
  "./package": "./package.json",
8
+ "./global": "./global.js",
8
9
  "./constants": "./lib/constants.js",
9
10
  "./errors": "./lib/errors.js",
10
11
  "./message-channel": "./lib/message-channel.js",
@@ -12,6 +13,7 @@
12
13
  },
13
14
  "files": [
14
15
  "index.js",
16
+ "global.js",
15
17
  "lib"
16
18
  ],
17
19
  "scripts": {
@@ -31,12 +33,11 @@
31
33
  "bare-channel": "^5.1.5",
32
34
  "bare-events": "^2.2.1",
33
35
  "bare-module": "^6.0.1",
34
- "bare-os": "^3.0.1",
35
- "bare-url": "^2.0.1"
36
+ "bare-thread": "^1.1.3"
36
37
  },
37
38
  "devDependencies": {
38
39
  "brittle": "^3.2.1",
39
40
  "prettier": "^3.4.1",
40
- "prettier-config-standard": "^7.0.0"
41
+ "prettier-config-holepunch": "^2.0.0"
41
42
  }
42
43
  }