@nxtedition/shared 2.0.5 → 2.0.8

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 +27 -31
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -44,18 +44,14 @@ async function* _reader({ sharedState, sharedBuffer }, cb) {
44
44
  readPos += len
45
45
 
46
46
  if (cb) {
47
- const thenable = cb(raw)
48
- if (typeof thenable?.then === 'function') {
49
- await thenable
50
- }
47
+ await cb(raw)
51
48
  } else {
52
49
  yield raw
53
50
  }
54
51
 
55
52
  Atomics.store(state, READ_INDEX, readPos)
53
+ Atomics.notify(state, READ_INDEX)
56
54
  }
57
-
58
- Atomics.notify(state, READ_INDEX)
59
55
  }
60
56
  }
61
57
 
@@ -70,18 +66,20 @@ export function reader(options, cb) {
70
66
  export function writer({ sharedState, sharedBuffer }) {
71
67
  const state = new Int32Array(sharedState)
72
68
  const buffer = Buffer.from(sharedBuffer)
73
- const size = buffer.byteLength
69
+ const size = buffer.byteLength - 64
74
70
 
75
71
  let readPos = 0
76
72
  let writePos = 0
77
73
 
78
- function tryWrite(maxLen, fn, opaque) {
79
- assert(maxLen < size - 12)
74
+ function _tryWrite(maxLen, fn, opaque) {
75
+ maxLen += 4
76
+
77
+ assert(maxLen <= size)
80
78
 
81
79
  readPos = Atomics.load(state, READ_INDEX)
82
80
 
83
- if (size - writePos < maxLen + 12) {
84
- if (readPos < maxLen + 12) {
81
+ if (size - writePos < maxLen) {
82
+ if (readPos < maxLen) {
85
83
  return false
86
84
  }
87
85
 
@@ -90,7 +88,7 @@ export function writer({ sharedState, sharedBuffer }) {
90
88
  } else {
91
89
  const available = writePos >= readPos ? size - writePos : readPos - writePos
92
90
 
93
- if (available < maxLen + 12) {
91
+ if (available < maxLen) {
94
92
  return false
95
93
  }
96
94
  }
@@ -102,7 +100,10 @@ export function writer({ sharedState, sharedBuffer }) {
102
100
  writePos += 4
103
101
 
104
102
  const len = fn(buffer.subarray(writePos, writePos + maxLen), opaque)
103
+ assert(len <= size)
104
+
105
105
  writePos += len
106
+ buffer.writeInt32LE(-3, writePos)
106
107
 
107
108
  assert(len <= maxLen)
108
109
 
@@ -114,11 +115,13 @@ export function writer({ sharedState, sharedBuffer }) {
114
115
  return true
115
116
  }
116
117
 
117
- async function _write(len, fn, opaque) {
118
- let buf = Buffer.allocUnsafe(len)
119
- buf = buf.subarray(0, fn(buf, opaque))
118
+ async function _write(maxLen, fn, opaque) {
119
+ assert(maxLen <= size)
120
+
121
+ const buf = Buffer.allocUnsafe(maxLen)
122
+ const len = fn(buf, opaque)
120
123
 
121
- while (!tryWrite(len, (dst, buf) => buf.copy(dst), buf)) {
124
+ while (!_tryWrite(len, (dst, buf) => buf.copy(dst, 0, 0, len))) {
122
125
  const { async, value } = Atomics.waitAsync(state, READ_INDEX, readPos)
123
126
  if (async) {
124
127
  await value
@@ -131,29 +134,23 @@ export function writer({ sharedState, sharedBuffer }) {
131
134
  return
132
135
  }
133
136
 
134
- let len
137
+ let maxLen
135
138
  let fn
136
139
  let opaque
137
140
 
138
141
  if (Number.isInteger(args[0])) {
139
- len = args[0]
142
+ maxLen = args[0]
140
143
  fn = args[1]
141
144
  opaque = args[2]
142
145
 
143
- assert(len >= 0)
146
+ assert(maxLen >= 0)
144
147
  assert(typeof fn === 'function')
145
148
  } else {
146
149
  if (Array.isArray(args[0])) {
147
150
  args = args[0]
148
151
  }
149
152
 
150
- const data = args
151
-
152
- len = 0
153
- for (const buf of data) {
154
- len += buf.byteLength ?? buf.length * 3
155
- }
156
-
153
+ maxLen = args.reduce((len, buf) => len + Buffer.byteLength(buf), 0)
157
154
  fn = (dst, data) => {
158
155
  let pos = 0
159
156
  for (const buf of data) {
@@ -163,15 +160,14 @@ export function writer({ sharedState, sharedBuffer }) {
163
160
  pos += buf.copy(dst, pos)
164
161
  }
165
162
  }
166
- assert(pos <= len)
163
+ assert(pos < maxLen)
167
164
  return pos
168
165
  }
169
-
170
- opaque = data
166
+ opaque = args
171
167
  }
172
168
 
173
- if (!tryWrite(len, fn, opaque)) {
174
- return _write(len, fn, opaque)
169
+ if (!_tryWrite(maxLen, fn, opaque)) {
170
+ return _write(maxLen, fn, opaque)
175
171
  }
176
172
  }
177
173
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/shared",
3
- "version": "2.0.5",
3
+ "version": "2.0.8",
4
4
  "description": "Ring Buffer for NodeJS cross Worker communication",
5
5
  "main": "index.js",
6
6
  "repository": {