@nxtedition/shared 1.2.1 → 1.4.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.
Files changed (2) hide show
  1. package/index.js +69 -30
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -31,7 +31,7 @@ async function* _reader({ sharedState, sharedBuffer }, cb) {
31
31
  if (len === END_OF_PACKET) {
32
32
  readPos = 0
33
33
  } else {
34
- const raw = buffer.slice(readPos + 4, readPos + len)
34
+ const raw = buffer.subarray(readPos + 4, readPos + len)
35
35
  readPos += len
36
36
  if (cb) {
37
37
  const thenable = cb(raw)
@@ -68,23 +68,10 @@ export function writer({ sharedState, sharedBuffer }) {
68
68
  let writePos = 0
69
69
  let flushing = null
70
70
 
71
- function tryWrite(...raw) {
72
- if (Array.isArray(raw[0])) {
73
- raw = raw[0]
74
- }
75
-
76
- if (!raw.length) {
77
- return true
78
- }
79
-
71
+ function tryWrite(maxLen, fn, opaque) {
80
72
  readPos = Atomics.load(state, READ_INDEX)
81
73
 
82
- let maxLen = 4
83
- for (const buf of raw) {
84
- maxLen += buf.byteLength ?? buf.length * 3
85
- }
86
-
87
- assert(maxLen < size / 2)
74
+ maxLen += 4 // len
88
75
 
89
76
  if (size - writePos < maxLen + 4) {
90
77
  if (readPos < maxLen + 4) {
@@ -104,14 +91,7 @@ export function writer({ sharedState, sharedBuffer }) {
104
91
  const lenPos = writePos
105
92
  writePos += 4
106
93
 
107
- for (const buf of raw) {
108
- if (typeof buf === 'string') {
109
- writePos += buffer.write(buf, writePos)
110
- } else {
111
- buffer.set(buf, writePos)
112
- writePos += buf.byteLength
113
- }
114
- }
94
+ writePos += fn(buffer.subarray(writePos, writePos + maxLen), opaque)
115
95
 
116
96
  const len = writePos - lenPos
117
97
 
@@ -125,9 +105,26 @@ export function writer({ sharedState, sharedBuffer }) {
125
105
  return true
126
106
  }
127
107
 
128
- async function flush() {
108
+ function flush() {
109
+ if (queue.length && !flushing) {
110
+ flushing = _flush()
111
+ }
112
+ return flushing
113
+ }
114
+
115
+ async function _flush() {
129
116
  while (queue.length) {
130
- while (!tryWrite(queue[0])) {
117
+ const buf = queue[0]
118
+ while (
119
+ !tryWrite(
120
+ buf.byteLength,
121
+ (dst, buf) => {
122
+ dst.set(buf)
123
+ return buf.byteLength
124
+ },
125
+ buf
126
+ )
127
+ ) {
131
128
  const { async, value } = Atomics.waitAsync(state, READ_INDEX, readPos)
132
129
  if (async) {
133
130
  await value
@@ -139,15 +136,57 @@ export function writer({ sharedState, sharedBuffer }) {
139
136
  flushing = null
140
137
  }
141
138
 
142
- function write(...raw) {
143
- if (!queue.length && tryWrite(...raw)) {
139
+ function write(...args) {
140
+ if (!args.length) {
141
+ return
142
+ }
143
+
144
+ let len
145
+ let fn
146
+ let opaque
147
+
148
+ if (Number.isInteger(args[0])) {
149
+ len = args[0]
150
+ fn = args[1]
151
+ opaque = args[2]
152
+ } else {
153
+ if (Array.isArray(args[0])) {
154
+ args = args[0]
155
+ }
156
+
157
+ len = 0
158
+ for (const buf of args) {
159
+ len += buf.byteLength ?? buf.length * 3
160
+ }
161
+
162
+ fn = (dst, data) => {
163
+ let pos = 0
164
+ for (const buf of data) {
165
+ if (typeof buf === 'string') {
166
+ pos += dst.write(buf, pos)
167
+ } else {
168
+ dst.set(buf, pos)
169
+ pos += buf.byteLength
170
+ }
171
+ }
172
+ return pos
173
+ }
174
+
175
+ opaque = args
176
+ }
177
+
178
+ if (!queue.length && tryWrite(len, fn, opaque)) {
144
179
  return
145
180
  }
146
181
 
147
- queue.push(Buffer.concat(raw))
182
+ const buf = Buffer.allocUnsafe(len)
183
+ queue.push(buf.subarray(0, fn(0, buf)))
148
184
 
149
- return (flushing ??= flush())
185
+ return flush()
150
186
  }
151
187
 
188
+ write.write = write
189
+ write.flush = flush
190
+
152
191
  return write
153
192
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/shared",
3
- "version": "1.2.1",
3
+ "version": "1.4.1",
4
4
  "description": "Ring Buffer for NodeJS cross Worker communication",
5
5
  "main": "index.js",
6
6
  "repository": {