@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.
Files changed (2) hide show
  1. package/index.js +57 -28
  2. 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 tryWrite(...raw) {
72
- if (Array.isArray(raw[0])) {
73
- raw = raw[0]
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
- let maxLen = 4
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 < maxLen + 4) {
90
- if (readPos < maxLen + 4) {
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 < maxLen + 4) {
90
+ if (available < len + 4) {
100
91
  return false
101
92
  }
102
93
  }
103
94
 
104
- const lenPos = writePos
105
- writePos += 4
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
- writePos += buffer.write(buf, writePos)
138
+ pos += buffer.write(buf, pos)
110
139
  } else {
111
- buffer.set(buf, writePos)
112
- writePos += buf.byteLength
140
+ buffer.set(buf, pos)
141
+ pos += buf.byteLength
113
142
  }
114
143
  }
115
144
 
116
- const len = writePos - lenPos
145
+ assert(pos <= maxLen)
117
146
 
118
- assert(len <= maxLen)
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/shared",
3
- "version": "1.1.2",
3
+ "version": "1.2.0",
4
4
  "description": "Ring Buffer for NodeJS cross Worker communication",
5
5
  "main": "index.js",
6
6
  "repository": {