@nxtedition/shared 1.1.0 → 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 +56 -17
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import assert from 'node:assert'
|
|
2
|
+
|
|
1
3
|
const WRITE_INDEX = 0
|
|
2
4
|
const READ_INDEX = 1
|
|
3
5
|
const END_OF_PACKET = -1
|
|
@@ -66,21 +68,14 @@ export function writer({ sharedState, sharedBuffer }) {
|
|
|
66
68
|
let writePos = 0
|
|
67
69
|
let flushing = null
|
|
68
70
|
|
|
69
|
-
function
|
|
70
|
-
if (
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
if (!raw.length) {
|
|
75
|
-
return true
|
|
71
|
+
function acquire(len) {
|
|
72
|
+
if (!len) {
|
|
73
|
+
return Buffer.alloc(0)
|
|
76
74
|
}
|
|
77
75
|
|
|
78
76
|
readPos = Atomics.load(state, READ_INDEX)
|
|
79
77
|
|
|
80
|
-
|
|
81
|
-
for (const buf of raw) {
|
|
82
|
-
len += buf.byteLength ?? Buffer.byteLength(buf)
|
|
83
|
-
}
|
|
78
|
+
assert(len < size / 2)
|
|
84
79
|
|
|
85
80
|
if (size - writePos < len + 4) {
|
|
86
81
|
if (readPos < len + 4) {
|
|
@@ -97,20 +92,59 @@ export function writer({ sharedState, sharedBuffer }) {
|
|
|
97
92
|
}
|
|
98
93
|
}
|
|
99
94
|
|
|
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) {
|
|
100
109
|
buffer.writeInt32LE(len, writePos)
|
|
101
|
-
writePos += 4
|
|
110
|
+
writePos += 4 + len
|
|
111
|
+
|
|
112
|
+
Atomics.store(state, WRITE_INDEX, writePos)
|
|
113
|
+
Atomics.notify(state, WRITE_INDEX)
|
|
114
|
+
}
|
|
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
|
+
}
|
|
102
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
|
|
103
136
|
for (const buf of raw) {
|
|
104
137
|
if (typeof buf === 'string') {
|
|
105
|
-
|
|
138
|
+
pos += buffer.write(buf, pos)
|
|
106
139
|
} else {
|
|
107
|
-
buffer.set(buf,
|
|
108
|
-
|
|
140
|
+
buffer.set(buf, pos)
|
|
141
|
+
pos += buf.byteLength
|
|
109
142
|
}
|
|
110
143
|
}
|
|
111
144
|
|
|
112
|
-
|
|
113
|
-
|
|
145
|
+
assert(pos <= maxLen)
|
|
146
|
+
|
|
147
|
+
release(pos)
|
|
114
148
|
|
|
115
149
|
return true
|
|
116
150
|
}
|
|
@@ -139,5 +173,10 @@ export function writer({ sharedState, sharedBuffer }) {
|
|
|
139
173
|
return (flushing ??= flush())
|
|
140
174
|
}
|
|
141
175
|
|
|
176
|
+
write.acquireSync = acquireSync
|
|
177
|
+
write.acquire = acquire
|
|
178
|
+
write.release = release
|
|
179
|
+
write.flush = flush
|
|
180
|
+
|
|
142
181
|
return write
|
|
143
182
|
}
|