@nxtedition/shared 1.1.2 → 1.2.0
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 +57 -28
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -68,26 +68,17 @@ export function writer({ sharedState, sharedBuffer }) {
|
|
|
68
68
|
let writePos = 0
|
|
69
69
|
let flushing = null
|
|
70
70
|
|
|
71
|
-
function
|
|
72
|
-
if (
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
if (!raw.length) {
|
|
77
|
-
return true
|
|
71
|
+
function acquire(len) {
|
|
72
|
+
if (!len) {
|
|
73
|
+
return Buffer.alloc(0)
|
|
78
74
|
}
|
|
79
75
|
|
|
80
76
|
readPos = Atomics.load(state, READ_INDEX)
|
|
81
77
|
|
|
82
|
-
|
|
83
|
-
for (const buf of raw) {
|
|
84
|
-
maxLen += buf.byteLength ?? buf.length * 3
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
assert(maxLen < size / 2)
|
|
78
|
+
assert(len < size / 2)
|
|
88
79
|
|
|
89
|
-
if (size - writePos <
|
|
90
|
-
if (readPos <
|
|
80
|
+
if (size - writePos < len + 4) {
|
|
81
|
+
if (readPos < len + 4) {
|
|
91
82
|
return false
|
|
92
83
|
}
|
|
93
84
|
|
|
@@ -96,31 +87,64 @@ export function writer({ sharedState, sharedBuffer }) {
|
|
|
96
87
|
} else {
|
|
97
88
|
const available = writePos >= readPos ? size - writePos : readPos - writePos
|
|
98
89
|
|
|
99
|
-
if (available <
|
|
90
|
+
if (available < len + 4) {
|
|
100
91
|
return false
|
|
101
92
|
}
|
|
102
93
|
}
|
|
103
94
|
|
|
104
|
-
|
|
105
|
-
|
|
95
|
+
return buffer.subarray(writePos + 4, writePos + 4 + len)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function acquireSync (len) {
|
|
99
|
+
while (true) {
|
|
100
|
+
const buf = acquire(len)
|
|
101
|
+
if (buf) {
|
|
102
|
+
return buf
|
|
103
|
+
}
|
|
104
|
+
Atomics.wait(state, READ_INDEX, readPos)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function release(len) {
|
|
109
|
+
buffer.writeInt32LE(len, writePos)
|
|
110
|
+
writePos += 4 + len
|
|
111
|
+
|
|
112
|
+
Atomics.store(state, WRITE_INDEX, writePos)
|
|
113
|
+
Atomics.notify(state, WRITE_INDEX)
|
|
114
|
+
}
|
|
106
115
|
|
|
116
|
+
function tryWrite(...raw) {
|
|
117
|
+
if (Array.isArray(raw[0])) {
|
|
118
|
+
raw = raw[0]
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (!raw.length) {
|
|
122
|
+
return true
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
let maxLen = 4
|
|
126
|
+
for (const buf of raw) {
|
|
127
|
+
maxLen += buf.byteLength ?? buf.length * 3
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const dst = acquire(maxLen)
|
|
131
|
+
if (!dst) {
|
|
132
|
+
return false
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
let pos = 0
|
|
107
136
|
for (const buf of raw) {
|
|
108
137
|
if (typeof buf === 'string') {
|
|
109
|
-
|
|
138
|
+
pos += buffer.write(buf, pos)
|
|
110
139
|
} else {
|
|
111
|
-
buffer.set(buf,
|
|
112
|
-
|
|
140
|
+
buffer.set(buf, pos)
|
|
141
|
+
pos += buf.byteLength
|
|
113
142
|
}
|
|
114
143
|
}
|
|
115
144
|
|
|
116
|
-
|
|
145
|
+
assert(pos <= maxLen)
|
|
117
146
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
buffer.writeInt32LE(len, lenPos)
|
|
121
|
-
|
|
122
|
-
Atomics.store(state, WRITE_INDEX, writePos)
|
|
123
|
-
Atomics.notify(state, WRITE_INDEX)
|
|
147
|
+
release(pos)
|
|
124
148
|
|
|
125
149
|
return true
|
|
126
150
|
}
|
|
@@ -149,5 +173,10 @@ export function writer({ sharedState, sharedBuffer }) {
|
|
|
149
173
|
return (flushing ??= flush())
|
|
150
174
|
}
|
|
151
175
|
|
|
176
|
+
write.acquireSync = acquireSync
|
|
177
|
+
write.acquire = acquire
|
|
178
|
+
write.release = release
|
|
179
|
+
write.flush = flush
|
|
180
|
+
|
|
152
181
|
return write
|
|
153
182
|
}
|