@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.
- package/index.js +27 -31
- 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
|
-
|
|
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
|
|
79
|
-
|
|
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
|
|
84
|
-
if (readPos < maxLen
|
|
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
|
|
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(
|
|
118
|
-
|
|
119
|
-
|
|
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 (!
|
|
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
|
|
137
|
+
let maxLen
|
|
135
138
|
let fn
|
|
136
139
|
let opaque
|
|
137
140
|
|
|
138
141
|
if (Number.isInteger(args[0])) {
|
|
139
|
-
|
|
142
|
+
maxLen = args[0]
|
|
140
143
|
fn = args[1]
|
|
141
144
|
opaque = args[2]
|
|
142
145
|
|
|
143
|
-
assert(
|
|
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
|
-
|
|
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
|
|
163
|
+
assert(pos < maxLen)
|
|
167
164
|
return pos
|
|
168
165
|
}
|
|
169
|
-
|
|
170
|
-
opaque = data
|
|
166
|
+
opaque = args
|
|
171
167
|
}
|
|
172
168
|
|
|
173
|
-
if (!
|
|
174
|
-
return _write(
|
|
169
|
+
if (!_tryWrite(maxLen, fn, opaque)) {
|
|
170
|
+
return _write(maxLen, fn, opaque)
|
|
175
171
|
}
|
|
176
172
|
}
|
|
177
173
|
|