@nxtedition/shared 2.0.9 → 2.0.12

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.
Files changed (2) hide show
  1. package/index.js +28 -28
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -38,11 +38,16 @@ async function* _reader({ sharedState, sharedBuffer }, cb) {
38
38
  const len = buffer.readInt32LE(readPos)
39
39
  readPos += 4
40
40
 
41
+ assert(len > 0, `len: ${len} > 0`)
42
+
41
43
  const raw = buffer.subarray(readPos, readPos + len)
42
44
  readPos += len
43
45
 
44
46
  if (cb) {
45
- await cb(raw)
47
+ const thenable = cb(raw)
48
+ if (thenable) {
49
+ await thenable
50
+ }
46
51
  } else {
47
52
  yield raw
48
53
  }
@@ -70,8 +75,6 @@ export function writer({ sharedState, sharedBuffer }) {
70
75
  let writePos = 0
71
76
 
72
77
  function _tryWrite(maxLen, fn, opaque) {
73
- maxLen += 4
74
-
75
78
  assert(maxLen <= size)
76
79
 
77
80
  readPos = Atomics.load(state, READ_INDEX)
@@ -94,13 +97,15 @@ export function writer({ sharedState, sharedBuffer }) {
94
97
  buffer.writeInt32LE(-2, writePos)
95
98
  writePos += 4
96
99
 
100
+ buffer.writeInt32LE(-3, writePos)
97
101
  const len = fn(buffer.subarray(writePos + 4, writePos + 4 + maxLen), opaque)
98
- assert(len <= maxLen - 4, `len: ${len} <= maxLen: ${maxLen - 4}`)
102
+ assert(len > 0, `len: ${len} > 0`)
103
+ assert(len <= maxLen, `len: ${len} <= maxLen: ${maxLen}`)
99
104
  assert(len <= size, `len: ${len} <= size: ${size}`)
100
105
 
101
106
  buffer.writeInt32LE(len, writePos)
102
107
  writePos += 4 + len
103
- buffer.writeInt32LE(-3, writePos)
108
+ buffer.writeInt32LE(-4, writePos)
104
109
 
105
110
  Atomics.store(state, WRITE_INDEX, writePos)
106
111
  Atomics.notify(state, WRITE_INDEX)
@@ -108,18 +113,16 @@ export function writer({ sharedState, sharedBuffer }) {
108
113
  return true
109
114
  }
110
115
 
111
- async function _write(maxLen, fn, opaque) {
112
- assert(maxLen <= size)
113
-
114
- const buf = Buffer.allocUnsafe(maxLen)
115
- const len = fn(buf, opaque)
116
-
117
- while (!_tryWrite(len, (dst, buf) => buf.copy(dst, 0, 0, len))) {
118
- const { async, value } = Atomics.waitAsync(state, READ_INDEX, readPos)
119
- if (async) {
120
- await value
116
+ function defaultWrite(dst, data) {
117
+ let pos = 0
118
+ for (const buf of data) {
119
+ if (typeof buf === 'string') {
120
+ pos += dst.write(buf, pos)
121
+ } else {
122
+ pos += buf.copy(dst, pos)
121
123
  }
122
124
  }
125
+ return pos
123
126
  }
124
127
 
125
128
  function write(...args) {
@@ -143,23 +146,20 @@ export function writer({ sharedState, sharedBuffer }) {
143
146
  args = args[0]
144
147
  }
145
148
 
146
- maxLen = args.reduce((len, buf) => len + Buffer.byteLength(buf), 0)
147
- fn = (dst, data) => {
148
- let pos = 0
149
- for (const buf of data) {
150
- if (typeof buf === 'string') {
151
- pos += dst.write(buf, pos)
152
- } else {
153
- pos += buf.copy(dst, pos)
154
- }
155
- }
156
- return pos
149
+ maxLen = 0
150
+ for (const buf of args) {
151
+ maxLen += Buffer.byteLength(buf)
157
152
  }
153
+
154
+ fn = defaultWrite
155
+
158
156
  opaque = args
159
157
  }
160
158
 
161
- if (!_tryWrite(maxLen, fn, opaque)) {
162
- return _write(maxLen, fn, opaque)
159
+ while (!_tryWrite(maxLen, fn, opaque)) {
160
+ // TODO (fix): Async? Warn? Timeout?
161
+ const result = Atomics.wait(state, READ_INDEX, readPos, 1e3)
162
+ assert(result !== 'timed-out')
163
163
  }
164
164
  }
165
165
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/shared",
3
- "version": "2.0.9",
3
+ "version": "2.0.12",
4
4
  "description": "Ring Buffer for NodeJS cross Worker communication",
5
5
  "main": "index.js",
6
6
  "repository": {