@nxtedition/shared 2.0.7 → 2.0.10

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 +36 -42
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -33,12 +33,12 @@ async function* _reader({ sharedState, sharedBuffer }, cb) {
33
33
  continue
34
34
  }
35
35
 
36
- assert.equal(tag, -2)
36
+ assert(tag === -2, `tag: ${tag} === -2`)
37
37
 
38
38
  const len = buffer.readInt32LE(readPos)
39
39
  readPos += 4
40
40
 
41
- assert(len >= 0)
41
+ assert(len > 0, `len: ${len} > 0`)
42
42
 
43
43
  const raw = buffer.subarray(readPos, readPos + len)
44
44
  readPos += len
@@ -66,18 +66,18 @@ export function reader(options, cb) {
66
66
  export function writer({ sharedState, sharedBuffer }) {
67
67
  const state = new Int32Array(sharedState)
68
68
  const buffer = Buffer.from(sharedBuffer)
69
- const size = buffer.byteLength
69
+ const size = buffer.byteLength - 64
70
70
 
71
71
  let readPos = 0
72
72
  let writePos = 0
73
73
 
74
- function tryWrite(maxLen, fn, opaque) {
75
- assert(maxLen < size - 12)
74
+ function _tryWrite(maxLen, fn, opaque) {
75
+ assert(maxLen <= size)
76
76
 
77
77
  readPos = Atomics.load(state, READ_INDEX)
78
78
 
79
- if (size - writePos < maxLen + 12) {
80
- if (readPos < maxLen + 12) {
79
+ if (size - writePos < maxLen) {
80
+ if (readPos < maxLen) {
81
81
  return false
82
82
  }
83
83
 
@@ -86,7 +86,7 @@ export function writer({ sharedState, sharedBuffer }) {
86
86
  } else {
87
87
  const available = writePos >= readPos ? size - writePos : readPos - writePos
88
88
 
89
- if (available < maxLen + 12) {
89
+ if (available < maxLen) {
90
90
  return false
91
91
  }
92
92
  }
@@ -94,15 +94,15 @@ export function writer({ sharedState, sharedBuffer }) {
94
94
  buffer.writeInt32LE(-2, writePos)
95
95
  writePos += 4
96
96
 
97
- const lenPos = writePos
98
- writePos += 4
99
-
100
- const len = fn(buffer.subarray(writePos, writePos + maxLen), opaque)
101
- writePos += len
102
-
103
- assert(len <= maxLen)
97
+ buffer.writeInt32LE(-3, writePos)
98
+ const len = fn(buffer.subarray(writePos + 4, writePos + 4 + maxLen), opaque)
99
+ assert(len > 0, `len: ${len} > 0`)
100
+ assert(len <= maxLen, `len: ${len} <= maxLen: ${maxLen}`)
101
+ assert(len <= size, `len: ${len} <= size: ${size}`)
104
102
 
105
- buffer.writeInt32LE(len, lenPos)
103
+ buffer.writeInt32LE(len, writePos)
104
+ writePos += 4 + len
105
+ buffer.writeInt32LE(-4, writePos)
106
106
 
107
107
  Atomics.store(state, WRITE_INDEX, writePos)
108
108
  Atomics.notify(state, WRITE_INDEX)
@@ -110,46 +110,42 @@ export function writer({ sharedState, sharedBuffer }) {
110
110
  return true
111
111
  }
112
112
 
113
- async function _write(len, fn, opaque) {
114
- let buf = Buffer.allocUnsafe(len)
115
- buf = buf.subarray(0, fn(buf, opaque))
113
+ // async function _write(maxLen, fn, opaque) {
114
+ // assert(maxLen <= size)
116
115
 
117
- while (!tryWrite(len, (dst, buf) => buf.copy(dst), buf)) {
118
- const { async, value } = Atomics.waitAsync(state, READ_INDEX, readPos)
119
- if (async) {
120
- await value
121
- }
122
- }
123
- }
116
+ // const buf = Buffer.allocUnsafe(maxLen)
117
+ // const len = fn(buf, opaque)
118
+
119
+ // while (!_tryWrite(len, (dst, buf) => buf.copy(dst, 0, 0, len))) {
120
+ // const { async, value } = Atomics.waitAsync(state, READ_INDEX, readPos)
121
+ // if (async) {
122
+ // await value
123
+ // }
124
+ // }
125
+ // }
124
126
 
125
127
  function write(...args) {
126
128
  if (!args.length) {
127
129
  return
128
130
  }
129
131
 
130
- let len
132
+ let maxLen
131
133
  let fn
132
134
  let opaque
133
135
 
134
136
  if (Number.isInteger(args[0])) {
135
- len = args[0]
137
+ maxLen = args[0]
136
138
  fn = args[1]
137
139
  opaque = args[2]
138
140
 
139
- assert(len >= 0)
140
- assert(typeof fn === 'function')
141
+ assert(maxLen >= 0, `maxLen: ${maxLen} >= 0`)
142
+ assert(typeof fn === 'function', `fn: ${typeof fn} === 'function`)
141
143
  } else {
142
144
  if (Array.isArray(args[0])) {
143
145
  args = args[0]
144
146
  }
145
147
 
146
- const data = args
147
-
148
- len = 0
149
- for (const buf of data) {
150
- len += buf.byteLength ?? buf.length * 3
151
- }
152
-
148
+ maxLen = args.reduce((len, buf) => len + Buffer.byteLength(buf), 0)
153
149
  fn = (dst, data) => {
154
150
  let pos = 0
155
151
  for (const buf of data) {
@@ -159,15 +155,13 @@ export function writer({ sharedState, sharedBuffer }) {
159
155
  pos += buf.copy(dst, pos)
160
156
  }
161
157
  }
162
- assert(pos <= len)
163
158
  return pos
164
159
  }
165
-
166
- opaque = data
160
+ opaque = args
167
161
  }
168
162
 
169
- if (!tryWrite(len, fn, opaque)) {
170
- return _write(len, fn, opaque)
163
+ while (!_tryWrite(maxLen, fn, opaque)) {
164
+ Atomics.wait(state, READ_INDEX, readPos)
171
165
  }
172
166
  }
173
167
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/shared",
3
- "version": "2.0.7",
3
+ "version": "2.0.10",
4
4
  "description": "Ring Buffer for NodeJS cross Worker communication",
5
5
  "main": "index.js",
6
6
  "repository": {