@nxtedition/shared 2.0.11 → 2.0.14
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 +47 -68
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -74,96 +74,75 @@ export function writer({ sharedState, sharedBuffer }) {
|
|
|
74
74
|
let readPos = 0
|
|
75
75
|
let writePos = 0
|
|
76
76
|
|
|
77
|
-
function
|
|
78
|
-
assert(maxLen <= size)
|
|
79
|
-
|
|
80
|
-
readPos = Atomics.load(state, READ_INDEX)
|
|
81
|
-
|
|
82
|
-
if (size - writePos < maxLen) {
|
|
83
|
-
if (readPos < maxLen) {
|
|
84
|
-
return false
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
buffer.writeInt32LE(-1, writePos)
|
|
88
|
-
writePos = 0
|
|
89
|
-
} else {
|
|
90
|
-
const available = writePos >= readPos ? size - writePos : readPos - writePos
|
|
91
|
-
|
|
92
|
-
if (available < maxLen) {
|
|
93
|
-
return false
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
buffer.writeInt32LE(-2, writePos)
|
|
98
|
-
writePos += 4
|
|
99
|
-
|
|
100
|
-
buffer.writeInt32LE(-3, writePos)
|
|
101
|
-
const len = fn(buffer.subarray(writePos + 4, writePos + 4 + maxLen), opaque)
|
|
102
|
-
assert(len > 0, `len: ${len} > 0`)
|
|
103
|
-
assert(len <= maxLen, `len: ${len} <= maxLen: ${maxLen}`)
|
|
104
|
-
assert(len <= size, `len: ${len} <= size: ${size}`)
|
|
105
|
-
|
|
106
|
-
buffer.writeInt32LE(len, writePos)
|
|
107
|
-
writePos += 4 + len
|
|
108
|
-
buffer.writeInt32LE(-4, writePos)
|
|
109
|
-
|
|
110
|
-
Atomics.store(state, WRITE_INDEX, writePos)
|
|
111
|
-
Atomics.notify(state, WRITE_INDEX)
|
|
112
|
-
|
|
113
|
-
return true
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
function defaultWrite(dst, data) {
|
|
117
|
-
let pos = 0
|
|
118
|
-
for (const buf of data) {
|
|
119
|
-
if (typeof buf === 'string') {
|
|
120
|
-
pos += dst.write(buf, pos)
|
|
121
|
-
} else {
|
|
122
|
-
pos += buf.copy(dst, pos)
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
return pos
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
function write(...args) {
|
|
77
|
+
return function write(...args) {
|
|
129
78
|
if (!args.length) {
|
|
130
79
|
return
|
|
131
80
|
}
|
|
132
81
|
|
|
133
|
-
let
|
|
82
|
+
let len
|
|
134
83
|
let fn
|
|
135
|
-
let opaque
|
|
136
84
|
|
|
137
85
|
if (Number.isInteger(args[0])) {
|
|
138
|
-
|
|
139
|
-
fn = args
|
|
140
|
-
opaque = args[2]
|
|
86
|
+
len = args.shift()
|
|
87
|
+
fn = args.shift()
|
|
141
88
|
|
|
142
|
-
assert(
|
|
89
|
+
assert(len >= 0, `len: ${len} >= 0`)
|
|
143
90
|
assert(typeof fn === 'function', `fn: ${typeof fn} === 'function`)
|
|
144
91
|
} else {
|
|
145
92
|
if (Array.isArray(args[0])) {
|
|
146
93
|
args = args[0]
|
|
147
94
|
}
|
|
148
95
|
|
|
149
|
-
|
|
96
|
+
len = 0
|
|
150
97
|
for (const buf of args) {
|
|
151
|
-
|
|
98
|
+
len += Buffer.byteLength(buf)
|
|
152
99
|
}
|
|
100
|
+
}
|
|
153
101
|
|
|
154
|
-
|
|
102
|
+
assert(len <= size)
|
|
155
103
|
|
|
156
|
-
|
|
104
|
+
readPos = Atomics.load(state, READ_INDEX)
|
|
105
|
+
|
|
106
|
+
if (size - writePos < len) {
|
|
107
|
+
buffer.subarray(writePos).fill(-1)
|
|
108
|
+
writePos = 0
|
|
157
109
|
}
|
|
158
110
|
|
|
159
|
-
while (
|
|
160
|
-
|
|
111
|
+
while (true) {
|
|
112
|
+
const available = writePos >= readPos ? size - writePos : readPos - writePos
|
|
113
|
+
if (available >= len) {
|
|
114
|
+
break
|
|
115
|
+
}
|
|
161
116
|
Atomics.wait(state, READ_INDEX, readPos)
|
|
162
117
|
}
|
|
163
|
-
}
|
|
164
118
|
|
|
165
|
-
|
|
166
|
-
|
|
119
|
+
buffer.writeInt32LE(-2, writePos)
|
|
120
|
+
writePos += 4
|
|
121
|
+
|
|
122
|
+
buffer.writeInt32LE(-3, writePos)
|
|
167
123
|
|
|
168
|
-
|
|
124
|
+
let pos = 0
|
|
125
|
+
if (fn) {
|
|
126
|
+
pos += fn(buffer.subarray(writePos + 4, writePos + 4 + len), ...args)
|
|
127
|
+
} else {
|
|
128
|
+
for (const buf of args) {
|
|
129
|
+
if (typeof buf === 'string') {
|
|
130
|
+
pos += buffer.write(buf, writePos + 4 + pos)
|
|
131
|
+
} else {
|
|
132
|
+
pos += buf.copy(buffer, writePos + 4 + pos)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
assert(pos > 0, `pos: ${pos} > 0`)
|
|
138
|
+
assert(pos <= len, `pos: ${pos} <= len: ${len}`)
|
|
139
|
+
assert(pos <= size, `pos: ${pos} <= size: ${size}`)
|
|
140
|
+
|
|
141
|
+
buffer.writeInt32LE(pos, writePos)
|
|
142
|
+
writePos += 4 + pos
|
|
143
|
+
buffer.writeInt32LE(-4, writePos)
|
|
144
|
+
|
|
145
|
+
Atomics.store(state, WRITE_INDEX, writePos)
|
|
146
|
+
Atomics.notify(state, WRITE_INDEX)
|
|
147
|
+
}
|
|
169
148
|
}
|