@nxtedition/shared 2.0.13 → 2.0.16

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 -73
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -66,6 +66,18 @@ export function reader(options, cb) {
66
66
  }
67
67
  }
68
68
 
69
+ function arrayWrite(dst, data) {
70
+ let pos = 0
71
+ for (const buf of data) {
72
+ if (typeof buf === 'string') {
73
+ pos += dst.write(buf, pos)
74
+ } else {
75
+ pos += buf.copy(dst, pos)
76
+ }
77
+ }
78
+ return pos
79
+ }
80
+
69
81
  export function writer({ sharedState, sharedBuffer }) {
70
82
  const state = new Int32Array(sharedState)
71
83
  const buffer = Buffer.from(sharedBuffer)
@@ -74,96 +86,59 @@ export function writer({ sharedState, sharedBuffer }) {
74
86
  let readPos = 0
75
87
  let writePos = 0
76
88
 
77
- function _tryWrite(maxLen, fn, opaque) {
78
- assert(maxLen <= size)
89
+ return function write(len, fn, opaque) {
90
+ if (!len) {
91
+ return
92
+ }
79
93
 
80
- readPos = Atomics.load(state, READ_INDEX)
94
+ if (Number.isInteger(len)) {
95
+ assert(len >= 0, `len: ${len} >= 0`)
96
+ assert(typeof fn === 'function', `fn: ${typeof fn} === 'function`)
97
+ } else {
98
+ opaque = Array.isArray(len) ? len : arguments
81
99
 
82
- if (size - writePos < maxLen) {
83
- if (readPos < maxLen) {
84
- return false
100
+ len = 0
101
+ for (const buf of opaque) {
102
+ len += Buffer.byteLength(buf)
85
103
  }
86
104
 
105
+ fn = arrayWrite
106
+ }
107
+
108
+ assert(len <= size)
109
+
110
+ readPos = Atomics.load(state, READ_INDEX)
111
+
112
+ if (size - writePos < len) {
87
113
  buffer.writeInt32LE(-1, writePos)
114
+ writePos += 4
115
+ buffer.subarray(writePos).fill(-4)
88
116
  writePos = 0
89
- } else {
90
- const available = writePos >= readPos ? size - writePos : readPos - writePos
117
+ }
91
118
 
92
- if (available < maxLen) {
93
- return false
119
+ while (true) {
120
+ const available = writePos >= readPos ? size - writePos : readPos - writePos
121
+ if (available >= len) {
122
+ break
94
123
  }
124
+ Atomics.wait(state, READ_INDEX, readPos)
95
125
  }
96
126
 
97
127
  buffer.writeInt32LE(-2, writePos)
98
128
  writePos += 4
99
-
100
129
  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
130
 
106
- buffer.writeInt32LE(len, writePos)
107
- writePos += 4 + len
131
+ const pos = fn(buffer.subarray(writePos + 4, writePos + 4 + len), opaque)
132
+
133
+ assert(pos > 0, `pos: ${pos} > 0`)
134
+ assert(pos <= len, `pos: ${pos} <= len: ${len}`)
135
+ assert(pos <= size, `pos: ${pos} <= size: ${size}`)
136
+
137
+ buffer.writeInt32LE(pos, writePos)
138
+ writePos += 4 + pos
108
139
  buffer.writeInt32LE(-4, writePos)
109
140
 
110
141
  Atomics.store(state, WRITE_INDEX, writePos)
111
142
  Atomics.notify(state, WRITE_INDEX)
112
-
113
- return true
114
143
  }
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) {
129
- if (!args.length) {
130
- return
131
- }
132
-
133
- let maxLen
134
- let fn
135
- let opaque
136
-
137
- if (Number.isInteger(args[0])) {
138
- maxLen = args[0]
139
- fn = args[1]
140
- opaque = args[2]
141
-
142
- assert(maxLen >= 0, `maxLen: ${maxLen} >= 0`)
143
- assert(typeof fn === 'function', `fn: ${typeof fn} === 'function`)
144
- } else {
145
- if (Array.isArray(args[0])) {
146
- args = args[0]
147
- }
148
-
149
- maxLen = 0
150
- for (const buf of args) {
151
- maxLen += Buffer.byteLength(buf)
152
- }
153
-
154
- fn = defaultWrite
155
-
156
- opaque = args
157
- }
158
-
159
- while (!_tryWrite(maxLen, fn, opaque)) {
160
- // TODO (fix): Async? Warn? Timeout?
161
- Atomics.wait(state, READ_INDEX, readPos, 1e3)
162
- }
163
- }
164
-
165
- write.write = write
166
- write.flush = () => {}
167
-
168
- return write
169
144
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/shared",
3
- "version": "2.0.13",
3
+ "version": "2.0.16",
4
4
  "description": "Ring Buffer for NodeJS cross Worker communication",
5
5
  "main": "index.js",
6
6
  "repository": {