@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.
- package/index.js +69 -30
- 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.
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(...
|
|
143
|
-
if (!
|
|
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
|
-
|
|
182
|
+
const buf = Buffer.allocUnsafe(len)
|
|
183
|
+
queue.push(buf.subarray(0, fn(0, buf)))
|
|
148
184
|
|
|
149
|
-
return
|
|
185
|
+
return flush()
|
|
150
186
|
}
|
|
151
187
|
|
|
188
|
+
write.write = write
|
|
189
|
+
write.flush = flush
|
|
190
|
+
|
|
152
191
|
return write
|
|
153
192
|
}
|