@nxtedition/shared 2.0.7 → 2.0.10
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 +36 -42
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -33,12 +33,12 @@ async function* _reader({ sharedState, sharedBuffer }, cb) {
|
|
|
33
33
|
continue
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
assert
|
|
36
|
+
assert(tag === -2, `tag: ${tag} === -2`)
|
|
37
37
|
|
|
38
38
|
const len = buffer.readInt32LE(readPos)
|
|
39
39
|
readPos += 4
|
|
40
40
|
|
|
41
|
-
assert(len
|
|
41
|
+
assert(len > 0, `len: ${len} > 0`)
|
|
42
42
|
|
|
43
43
|
const raw = buffer.subarray(readPos, readPos + len)
|
|
44
44
|
readPos += len
|
|
@@ -66,18 +66,18 @@ export function reader(options, cb) {
|
|
|
66
66
|
export function writer({ sharedState, sharedBuffer }) {
|
|
67
67
|
const state = new Int32Array(sharedState)
|
|
68
68
|
const buffer = Buffer.from(sharedBuffer)
|
|
69
|
-
const size = buffer.byteLength
|
|
69
|
+
const size = buffer.byteLength - 64
|
|
70
70
|
|
|
71
71
|
let readPos = 0
|
|
72
72
|
let writePos = 0
|
|
73
73
|
|
|
74
|
-
function
|
|
75
|
-
assert(maxLen
|
|
74
|
+
function _tryWrite(maxLen, fn, opaque) {
|
|
75
|
+
assert(maxLen <= size)
|
|
76
76
|
|
|
77
77
|
readPos = Atomics.load(state, READ_INDEX)
|
|
78
78
|
|
|
79
|
-
if (size - writePos < maxLen
|
|
80
|
-
if (readPos < maxLen
|
|
79
|
+
if (size - writePos < maxLen) {
|
|
80
|
+
if (readPos < maxLen) {
|
|
81
81
|
return false
|
|
82
82
|
}
|
|
83
83
|
|
|
@@ -86,7 +86,7 @@ export function writer({ sharedState, sharedBuffer }) {
|
|
|
86
86
|
} else {
|
|
87
87
|
const available = writePos >= readPos ? size - writePos : readPos - writePos
|
|
88
88
|
|
|
89
|
-
if (available < maxLen
|
|
89
|
+
if (available < maxLen) {
|
|
90
90
|
return false
|
|
91
91
|
}
|
|
92
92
|
}
|
|
@@ -94,15 +94,15 @@ export function writer({ sharedState, sharedBuffer }) {
|
|
|
94
94
|
buffer.writeInt32LE(-2, writePos)
|
|
95
95
|
writePos += 4
|
|
96
96
|
|
|
97
|
-
|
|
98
|
-
writePos
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
assert(len <= maxLen)
|
|
97
|
+
buffer.writeInt32LE(-3, writePos)
|
|
98
|
+
const len = fn(buffer.subarray(writePos + 4, writePos + 4 + maxLen), opaque)
|
|
99
|
+
assert(len > 0, `len: ${len} > 0`)
|
|
100
|
+
assert(len <= maxLen, `len: ${len} <= maxLen: ${maxLen}`)
|
|
101
|
+
assert(len <= size, `len: ${len} <= size: ${size}`)
|
|
104
102
|
|
|
105
|
-
buffer.writeInt32LE(len,
|
|
103
|
+
buffer.writeInt32LE(len, writePos)
|
|
104
|
+
writePos += 4 + len
|
|
105
|
+
buffer.writeInt32LE(-4, writePos)
|
|
106
106
|
|
|
107
107
|
Atomics.store(state, WRITE_INDEX, writePos)
|
|
108
108
|
Atomics.notify(state, WRITE_INDEX)
|
|
@@ -110,46 +110,42 @@ export function writer({ sharedState, sharedBuffer }) {
|
|
|
110
110
|
return true
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
async function _write(
|
|
114
|
-
|
|
115
|
-
buf = buf.subarray(0, fn(buf, opaque))
|
|
113
|
+
// async function _write(maxLen, fn, opaque) {
|
|
114
|
+
// assert(maxLen <= size)
|
|
116
115
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
116
|
+
// const buf = Buffer.allocUnsafe(maxLen)
|
|
117
|
+
// const len = fn(buf, opaque)
|
|
118
|
+
|
|
119
|
+
// while (!_tryWrite(len, (dst, buf) => buf.copy(dst, 0, 0, len))) {
|
|
120
|
+
// const { async, value } = Atomics.waitAsync(state, READ_INDEX, readPos)
|
|
121
|
+
// if (async) {
|
|
122
|
+
// await value
|
|
123
|
+
// }
|
|
124
|
+
// }
|
|
125
|
+
// }
|
|
124
126
|
|
|
125
127
|
function write(...args) {
|
|
126
128
|
if (!args.length) {
|
|
127
129
|
return
|
|
128
130
|
}
|
|
129
131
|
|
|
130
|
-
let
|
|
132
|
+
let maxLen
|
|
131
133
|
let fn
|
|
132
134
|
let opaque
|
|
133
135
|
|
|
134
136
|
if (Number.isInteger(args[0])) {
|
|
135
|
-
|
|
137
|
+
maxLen = args[0]
|
|
136
138
|
fn = args[1]
|
|
137
139
|
opaque = args[2]
|
|
138
140
|
|
|
139
|
-
assert(
|
|
140
|
-
assert(typeof fn === 'function')
|
|
141
|
+
assert(maxLen >= 0, `maxLen: ${maxLen} >= 0`)
|
|
142
|
+
assert(typeof fn === 'function', `fn: ${typeof fn} === 'function`)
|
|
141
143
|
} else {
|
|
142
144
|
if (Array.isArray(args[0])) {
|
|
143
145
|
args = args[0]
|
|
144
146
|
}
|
|
145
147
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
len = 0
|
|
149
|
-
for (const buf of data) {
|
|
150
|
-
len += buf.byteLength ?? buf.length * 3
|
|
151
|
-
}
|
|
152
|
-
|
|
148
|
+
maxLen = args.reduce((len, buf) => len + Buffer.byteLength(buf), 0)
|
|
153
149
|
fn = (dst, data) => {
|
|
154
150
|
let pos = 0
|
|
155
151
|
for (const buf of data) {
|
|
@@ -159,15 +155,13 @@ export function writer({ sharedState, sharedBuffer }) {
|
|
|
159
155
|
pos += buf.copy(dst, pos)
|
|
160
156
|
}
|
|
161
157
|
}
|
|
162
|
-
assert(pos <= len)
|
|
163
158
|
return pos
|
|
164
159
|
}
|
|
165
|
-
|
|
166
|
-
opaque = data
|
|
160
|
+
opaque = args
|
|
167
161
|
}
|
|
168
162
|
|
|
169
|
-
|
|
170
|
-
|
|
163
|
+
while (!_tryWrite(maxLen, fn, opaque)) {
|
|
164
|
+
Atomics.wait(state, READ_INDEX, readPos)
|
|
171
165
|
}
|
|
172
166
|
}
|
|
173
167
|
|