@nxtedition/shared 2.0.13 → 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.
Files changed (2) hide show
  1. package/index.js +48 -69
  2. 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 _tryWrite(maxLen, fn, opaque) {
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 maxLen
82
+ let len
134
83
  let fn
135
- let opaque
136
84
 
137
85
  if (Number.isInteger(args[0])) {
138
- maxLen = args[0]
139
- fn = args[1]
140
- opaque = args[2]
86
+ len = args.shift()
87
+ fn = args.shift()
141
88
 
142
- assert(maxLen >= 0, `maxLen: ${maxLen} >= 0`)
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
- maxLen = 0
96
+ len = 0
150
97
  for (const buf of args) {
151
- maxLen += Buffer.byteLength(buf)
98
+ len += Buffer.byteLength(buf)
152
99
  }
100
+ }
153
101
 
154
- fn = defaultWrite
102
+ assert(len <= size)
155
103
 
156
- opaque = args
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 (!_tryWrite(maxLen, fn, opaque)) {
160
- // TODO (fix): Async? Warn? Timeout?
161
- Atomics.wait(state, READ_INDEX, readPos, 1e3)
111
+ while (true) {
112
+ const available = writePos >= readPos ? size - writePos : readPos - writePos
113
+ if (available >= len) {
114
+ break
115
+ }
116
+ Atomics.wait(state, READ_INDEX, readPos)
162
117
  }
163
- }
164
118
 
165
- write.write = write
166
- write.flush = () => {}
119
+ buffer.writeInt32LE(-2, writePos)
120
+ writePos += 4
121
+
122
+ buffer.writeInt32LE(-3, writePos)
167
123
 
168
- return write
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/shared",
3
- "version": "2.0.13",
3
+ "version": "2.0.14",
4
4
  "description": "Ring Buffer for NodeJS cross Worker communication",
5
5
  "main": "index.js",
6
6
  "repository": {