@nxtedition/shared 2.0.12 → 2.0.15
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 +50 -70
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -74,97 +74,77 @@ 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.writeInt32LE(-1, writePos)
|
|
108
|
+
writePos += 4
|
|
109
|
+
buffer.subarray(writePos).fill(-4)
|
|
110
|
+
writePos = 0
|
|
157
111
|
}
|
|
158
112
|
|
|
159
|
-
while (
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
113
|
+
while (true) {
|
|
114
|
+
const available = writePos >= readPos ? size - writePos : readPos - writePos
|
|
115
|
+
if (available >= len) {
|
|
116
|
+
break
|
|
117
|
+
}
|
|
118
|
+
Atomics.wait(state, READ_INDEX, readPos)
|
|
163
119
|
}
|
|
164
|
-
}
|
|
165
120
|
|
|
166
|
-
|
|
167
|
-
|
|
121
|
+
buffer.writeInt32LE(-2, writePos)
|
|
122
|
+
writePos += 4
|
|
123
|
+
|
|
124
|
+
buffer.writeInt32LE(-3, writePos)
|
|
125
|
+
|
|
126
|
+
let pos = 0
|
|
127
|
+
if (fn) {
|
|
128
|
+
pos += fn(buffer.subarray(writePos + 4, writePos + 4 + len), ...args)
|
|
129
|
+
} else {
|
|
130
|
+
for (const buf of args) {
|
|
131
|
+
if (typeof buf === 'string') {
|
|
132
|
+
pos += buffer.write(buf, writePos + 4 + pos)
|
|
133
|
+
} else {
|
|
134
|
+
pos += buf.copy(buffer, writePos + 4 + pos)
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
assert(pos > 0, `pos: ${pos} > 0`)
|
|
140
|
+
assert(pos <= len, `pos: ${pos} <= len: ${len}`)
|
|
141
|
+
assert(pos <= size, `pos: ${pos} <= size: ${size}`)
|
|
142
|
+
|
|
143
|
+
buffer.writeInt32LE(pos, writePos)
|
|
144
|
+
writePos += 4 + pos
|
|
145
|
+
buffer.writeInt32LE(-4, writePos)
|
|
168
146
|
|
|
169
|
-
|
|
147
|
+
Atomics.store(state, WRITE_INDEX, writePos)
|
|
148
|
+
Atomics.notify(state, WRITE_INDEX)
|
|
149
|
+
}
|
|
170
150
|
}
|