@mblaney/holster 1.0.35 → 1.0.36

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 (67) hide show
  1. package/build/holster.js +3 -3
  2. package/build/holster.js.map +3 -3
  3. package/dist/holster.js +4 -0
  4. package/dist/holster.js.map +7 -0
  5. package/package.json +23 -5
  6. package/src/get.js +6 -18
  7. package/src/ham.js +17 -47
  8. package/src/holster.js +106 -28
  9. package/src/sea.js +0 -52
  10. package/src/store.js +7 -7
  11. package/src/wire.js +7 -1
  12. package/ts/src/array.ts +78 -0
  13. package/ts/src/buffer.ts +441 -0
  14. package/ts/src/dup.ts +49 -0
  15. package/ts/src/get.ts +83 -0
  16. package/ts/src/ham.ts +254 -0
  17. package/ts/src/holster.ts +931 -0
  18. package/ts/src/index.ts +35 -0
  19. package/ts/src/radisk.ts +585 -0
  20. package/ts/src/radix.ts +157 -0
  21. package/ts/src/schemas.ts +519 -0
  22. package/ts/src/sea-utils.ts +103 -0
  23. package/ts/src/sea.ts +388 -0
  24. package/ts/src/store.ts +321 -0
  25. package/ts/src/user.ts +381 -0
  26. package/ts/src/utils.ts +232 -0
  27. package/ts/src/wire.ts +829 -0
  28. package/.dockerignore +0 -9
  29. package/.github/workflows/node.js.yml +0 -31
  30. package/.github/workflows/npm-publish.yml +0 -33
  31. package/Dockerfile +0 -20
  32. package/examples/index.html +0 -33
  33. package/examples/index.js +0 -49
  34. package/examples/user.html +0 -31
  35. package/examples/user.js +0 -93
  36. package/examples/wire.html +0 -27
  37. package/examples/wire.js +0 -55
  38. package/test/holster.get.test.js +0 -94
  39. package/test/holster.lex.test.js +0 -196
  40. package/test/holster.off.test.js +0 -53
  41. package/test/holster.on.test.js +0 -264
  42. package/test/holster.put.test.js +0 -358
  43. package/test/holster.secure.test.js +0 -202
  44. package/test/holster.user.get.test.js +0 -114
  45. package/test/holster.user.lex.test.js +0 -149
  46. package/test/holster.user.off.test.js +0 -73
  47. package/test/holster.user.on.test.js +0 -300
  48. package/test/holster.user.put.test.js +0 -463
  49. package/test/kitty/! +0 -9
  50. package/test/names.js +0 -225
  51. package/test/radisk.cache.test.js +0 -213
  52. package/test/radisk.test.js +0 -331
  53. package/test/radix.test.js +0 -117
  54. package/test/sea.test.js +0 -284
  55. package/test/split.test.js +0 -317
  56. package/test/store.test.js +0 -316
  57. package/test/system/basic.test.js +0 -29
  58. package/test/system/chained-on.test.js +0 -41
  59. package/test/system/concurrent-listeners.test.js +0 -125
  60. package/test/system/immediate-read.test.js +0 -30
  61. package/test/system/listener-before-data.test.js +0 -51
  62. package/test/system/promise-wrapper.test.js +0 -47
  63. package/test/system/user-chained-on.test.js +0 -60
  64. package/test/system/user-concurrent-listeners.test.js +0 -142
  65. package/test/system/user-listener-before-data.test.js +0 -66
  66. package/test/user.test.js +0 -173
  67. package/test/wire.test.js +0 -158
@@ -1,53 +0,0 @@
1
- import fs from "fs"
2
- import {Server} from "mock-socket"
3
- import {describe, test} from "node:test"
4
- import assert from "node:assert/strict"
5
- import Holster from "../src/holster.js"
6
-
7
- describe("holster.off", () => {
8
- const wss = new Server("ws://localhost:1234")
9
- const holster = Holster({file: "test/holster.off", wss: wss, maxAge: 100})
10
-
11
- test("calling off without get callback null", (t, done) => {
12
- holster.off(data => {
13
- assert.equal(data, null)
14
- done()
15
- })
16
- })
17
-
18
- test("off with cb for property on root then update - no event", (t, done) => {
19
- const cb = data => {
20
- console.log("should not be called for key:", data)
21
- done()
22
- }
23
- holster.get("key").on(cb)
24
- holster.get("key").off(cb)
25
-
26
- holster.get("key").put("value", err => {
27
- assert.equal(err, null)
28
- done()
29
- })
30
- })
31
-
32
- test("off no cb for property on root then update - no event", (t, done) => {
33
- holster.get("key1").on(data => {
34
- console.log("should not be called for key1:", data)
35
- done()
36
- })
37
- setTimeout(() => {
38
- holster.get("key1").off()
39
-
40
- holster.get("key1").put("value1", err => {
41
- assert.equal(err, null)
42
- done()
43
- })
44
- }, 10)
45
- })
46
-
47
- test("cleanup", (t, done) => {
48
- fs.rm("test/holster.off", {recursive: true, force: true}, err => {
49
- assert.equal(err, null)
50
- done()
51
- })
52
- })
53
- })
@@ -1,264 +0,0 @@
1
- import fs from "fs"
2
- import {Server} from "mock-socket"
3
- import {describe, test} from "node:test"
4
- import assert from "node:assert/strict"
5
- import Holster from "../src/holster.js"
6
-
7
- describe("holster.on", () => {
8
- const wss = new Server("ws://localhost:1234")
9
- const holster = Holster({file: "test/holster.on", wss: wss, maxAge: 100})
10
-
11
- test("calling on without get callback null", (t, done) => {
12
- holster.on(data => {
13
- assert.equal(data, null)
14
- done()
15
- })
16
- })
17
-
18
- test("on for property on root then update - event", (t, done) => {
19
- // Listener is now called for initial put and updates
20
- let callCount = 0
21
- holster.get("key").on(data => {
22
- callCount++
23
- if (callCount === 1) {
24
- assert.equal(data, "value")
25
- } else if (callCount === 2) {
26
- assert.equal(data, "update")
27
- done()
28
- }
29
- })
30
-
31
- holster.get("key").put("value", err => {
32
- assert.equal(err, null)
33
-
34
- holster.get("key").put("update", err => {
35
- assert.equal(err, null)
36
- })
37
- })
38
- })
39
-
40
- test("on for property then update - two listeners", (t, done) => {
41
- let done1 = false
42
- let done2 = false
43
-
44
- let callback1Count = 0
45
- const callback1 = data => {
46
- callback1Count++
47
- if (callback1Count === 2) {
48
- assert.equal(data, "update")
49
- holster.get("two").off(callback1)
50
- if (done2) done()
51
- else done1 = true
52
- }
53
- }
54
- holster.get("two").on(callback1)
55
-
56
- let callback2Count = 0
57
- const callback2 = data => {
58
- callback2Count++
59
- if (callback2Count === 2) {
60
- assert.equal(data, "update")
61
- holster.get("two").off(callback2)
62
- if (done1) done()
63
- else done2 = true
64
- }
65
- }
66
- holster.get("two").on(callback2)
67
-
68
- holster.get("two").put("value", err => {
69
- assert.equal(err, null)
70
-
71
- holster.get("two").put("update", err => {
72
- assert.equal(err, null)
73
- })
74
- })
75
- })
76
-
77
- test("on for different property on root - no event", (t, done) => {
78
- holster.get("key1").on(data => {
79
- console.log("should not be called for key1:", data)
80
- done() // This done is not called and test would fail if it was.
81
- })
82
-
83
- setTimeout(() => {
84
- holster.get("key2").put("value2", err => {
85
- assert.equal(err, null)
86
- done()
87
- })
88
- }, 100)
89
- })
90
-
91
- test("on for property on root two updates - two events", (t, done) => {
92
- holster.get("key3").put("value3", err => {
93
- assert.equal(err, null)
94
-
95
- let callCount = 0
96
- holster.get("key3").on(data => {
97
- callCount++
98
- if (callCount === 1) {
99
- assert.equal(data, "update1")
100
- } else if (callCount === 2) {
101
- assert.equal(data, "update2")
102
- done()
103
- }
104
- })
105
-
106
- holster.get("key3").put("update1", err => {
107
- assert.equal(err, null)
108
- })
109
-
110
- setTimeout(() => {
111
- holster.get("key3").put("update2", err => {
112
- assert.equal(err, null)
113
- })
114
- }, 200)
115
- })
116
- })
117
-
118
- test("on for properties on root in for loop", (t, done) => {
119
- for (let i = 0; i < 5; i++) {
120
- holster.get("for" + i).put(i, err => {
121
- assert.equal(err, null)
122
- })
123
- }
124
-
125
- // Need to wait until after all initial puts are done to set on listeners.
126
- setTimeout(() => {
127
- let completed = 0
128
- for (let i = 0; i < 5; i++) {
129
- const idx = i // Capture value
130
- holster.get("for" + idx).on(data => {
131
- // Listener fires for updates (initial puts already completed before listener setup)
132
- assert.equal(data, "update" + idx)
133
- completed++
134
- if (completed === 5) done()
135
- })
136
- }
137
-
138
- setTimeout(() => {
139
- for (let i = 0; i < 5; i++) {
140
- holster.get("for" + i).put("update" + i, err => {
141
- assert.equal(err, null)
142
- })
143
- }
144
- }, 100)
145
- }, 500)
146
- })
147
-
148
- test("on with get flag set - data returned", (t, done) => {
149
- holster.get("key4").put("value4", err => {
150
- assert.equal(err, null)
151
-
152
- setTimeout(() => {
153
- holster.get("key4").on(data => {
154
- assert.equal(data, "value4")
155
- done()
156
- }, true)
157
- }, 100)
158
- })
159
- })
160
-
161
- test("chained next before on", (t, done) => {
162
- // The node needs to exist before it can be listend to for updates.
163
- holster
164
- .get("hello")
165
- .next("world!")
166
- .put("ok", err => {
167
- assert.equal(err, null)
168
-
169
- holster
170
- .get("hello")
171
- .next("world!")
172
- .on(data => {
173
- // Listener fires for updates (initial put already completed before listener setup)
174
- assert.equal(data, "update")
175
- holster.get("hello").next("world!").off()
176
- done()
177
- })
178
-
179
- setTimeout(() => {
180
- holster
181
- .get("hello")
182
- .next("world!")
183
- .put("update", err => {
184
- assert.equal(err, null)
185
- })
186
- }, 10)
187
- })
188
- })
189
-
190
- test("on and put object on root in graph format", (t, done) => {
191
- const plain = {
192
- key: "plain value",
193
- number: 42,
194
- }
195
- holster.get("plain").put(plain, err => {
196
- assert.equal(err, null)
197
-
198
- const update = {
199
- key: "update",
200
- number: 42,
201
- }
202
- holster.get("plain").on(data => {
203
- // Listener fires for updates (initial put already completed before listener setup)
204
- assert.deepEqual(data, update)
205
- done()
206
- })
207
-
208
- setTimeout(() => {
209
- holster.get("plain").put(update, err => {
210
- assert.equal(err, null)
211
- })
212
- }, 10)
213
- })
214
- })
215
-
216
- test("on and put nested object", (t, done) => {
217
- const nested = {
218
- key: "nested key",
219
- child: {
220
- has: "child key",
221
- },
222
- }
223
- // The node needs to exist before it can be listend to for updates.
224
- holster.get("nested").put(nested, err => {
225
- assert.equal(err, null)
226
-
227
- const update = {
228
- child: {
229
- has: "child update",
230
- },
231
- }
232
- let parentFired = false
233
- holster.get("nested").on(data => {
234
- // Listener fires for updates (initial put already completed before listener setup)
235
- if (!parentFired) {
236
- parentFired = true
237
- assert.deepEqual(data, {key: nested.key, ...update})
238
- }
239
- })
240
-
241
- holster
242
- .get("nested")
243
- .next("child")
244
- .on(data => {
245
- // Listener fires for updates (initial put already completed before listener setup)
246
- assert.deepEqual(data, update.child)
247
- done()
248
- })
249
-
250
- setTimeout(() => {
251
- holster.get("nested").put(update, err => {
252
- assert.equal(err, null)
253
- })
254
- }, 10)
255
- })
256
- })
257
-
258
- test("cleanup", (t, done) => {
259
- fs.rm("test/holster.on", {recursive: true, force: true}, err => {
260
- assert.equal(err, null)
261
- done()
262
- })
263
- })
264
- })
@@ -1,358 +0,0 @@
1
- import fs from "fs"
2
- import {Server} from "mock-socket"
3
- import {describe, test} from "node:test"
4
- import assert from "node:assert/strict"
5
- import Holster from "../src/holster.js"
6
-
7
- describe("holster.put", () => {
8
- const wss = new Server("ws://localhost:1234")
9
- const holster = Holster({file: "test/holster.put", wss: wss, maxAge: 100})
10
-
11
- test("put and get string on root", (t, done) => {
12
- holster.get("key").put("value", err => {
13
- assert.equal(err, null)
14
-
15
- holster.get("key", data => {
16
- assert.equal(data, "value")
17
- done()
18
- })
19
- })
20
- })
21
-
22
- test("put value to null on root", (t, done) => {
23
- holster.get("key").put(null, err => {
24
- assert.equal(err, null)
25
-
26
- holster.get("key", data => {
27
- assert.equal(data, null)
28
- done()
29
- })
30
- })
31
- })
32
-
33
- test("put and get true on root", (t, done) => {
34
- holster.get("true").put(true, err => {
35
- assert.equal(err, null)
36
-
37
- holster.get("true", data => {
38
- assert.equal(data, true)
39
- done()
40
- })
41
- })
42
- })
43
-
44
- test("put and get false on root", (t, done) => {
45
- holster.get("false").put(false, err => {
46
- assert.equal(err, null)
47
-
48
- holster.get("false", data => {
49
- assert.equal(data, false)
50
- done()
51
- })
52
- })
53
- })
54
-
55
- test("put and get number on root", (t, done) => {
56
- holster.get("pi").put(3.14159, err => {
57
- assert.equal(err, null)
58
-
59
- holster.get("pi", data => {
60
- assert.equal(data, 3.14159)
61
- done()
62
- })
63
- })
64
- })
65
-
66
- test("put and get values in for loop on root", (t, done) => {
67
- for (let i = 0; i < 5; i++) {
68
- holster.get("for" + i).put(i, err => {
69
- assert.equal(err, null)
70
- })
71
- }
72
-
73
- setTimeout(() => {
74
- let count = 0
75
- for (let i = 0; i < 5; i++) {
76
- holster.get("for" + i, data => {
77
- assert.equal(data, i)
78
- count++
79
- })
80
- }
81
- setTimeout(() => {
82
- if (count === 5) done()
83
- }, 200)
84
- }, 200)
85
- })
86
-
87
- test("chained get before put", (t, done) => {
88
- holster
89
- .get("hello")
90
- .next("world!")
91
- .put("ok", err => {
92
- assert.equal(err, null)
93
-
94
- holster.get("hello").next("world!", data => {
95
- assert.equal(data, "ok")
96
- done()
97
- })
98
- })
99
- })
100
-
101
- test("more chained gets before put", (t, done) => {
102
- holster
103
- .get("1")
104
- .next("2")
105
- .next("3")
106
- .put("4", err => {
107
- assert.equal(err, null)
108
-
109
- holster
110
- .get("1")
111
- .next("2")
112
- .next("3", data => {
113
- assert.equal(data, "4")
114
- done()
115
- })
116
- })
117
- })
118
-
119
- test("put and get object on root in graph format", (t, done) => {
120
- const plain = {
121
- key: "plain value",
122
- true: true,
123
- false: false,
124
- number: 42,
125
- }
126
- holster.get("plain").put(plain, err => {
127
- assert.equal(err, null)
128
-
129
- holster.get("plain", data => {
130
- assert.deepEqual(data, plain)
131
- done()
132
- })
133
- })
134
- })
135
-
136
- test("put object to null on root", (t, done) => {
137
- holster.get("plain").put(null, err => {
138
- assert.equal(err, null)
139
-
140
- holster.get("plain", data => {
141
- assert.equal(data, null)
142
- done()
143
- })
144
- })
145
- })
146
-
147
- test("chained get before put object in graph format", (t, done) => {
148
- const plain = {
149
- key: "hello plain value",
150
- }
151
- holster
152
- .get("hello")
153
- .next("plain")
154
- .put(plain, err => {
155
- assert.equal(err, null)
156
-
157
- holster.get("hello").next("plain", data => {
158
- assert.deepEqual(data, plain)
159
- done()
160
- })
161
- })
162
- })
163
-
164
- test("put and get nested object", (t, done) => {
165
- const nested = {
166
- key: "nested value",
167
- child: {
168
- has: "child value",
169
- },
170
- }
171
- holster.get("nested").put(nested, err => {
172
- assert.equal(err, null)
173
-
174
- // Getting a nested object requires waiting for radisk to write to disk,
175
- // as it will batch the writes. (Default wait is 1 millisecond.)
176
- setTimeout(() => {
177
- holster.get("nested", data => {
178
- assert.deepEqual(data, nested)
179
-
180
- holster.get("nested").next("key", data => {
181
- assert.equal(data, "nested value")
182
-
183
- holster.get("nested").next("child", data => {
184
- assert.deepEqual(data, {has: "child value"})
185
- done()
186
- })
187
- })
188
- })
189
- }, 2)
190
- })
191
- })
192
-
193
- test("chained get before put nested object", (t, done) => {
194
- const nested = {
195
- key: "hello nested value",
196
- child: {
197
- has: "hello child value",
198
- },
199
- }
200
- holster
201
- .get("hello")
202
- .next("nested")
203
- .put(nested, err => {
204
- assert.equal(err, null)
205
-
206
- setTimeout(() => {
207
- holster.get("hello").next("nested", data => {
208
- assert.deepEqual(data, nested)
209
-
210
- holster
211
- .get("hello")
212
- .next("nested")
213
- .next("key", data => {
214
- assert.equal(data, "hello nested value")
215
-
216
- holster
217
- .get("hello")
218
- .next("nested")
219
- .next("child", data => {
220
- assert.deepEqual(data, {has: "hello child value"})
221
- done()
222
- })
223
- })
224
- })
225
- }, 2)
226
- })
227
- })
228
-
229
- test("put and get two nested objects", (t, done) => {
230
- const two = {
231
- key: "two nested values",
232
- child1: {
233
- has: "child value 1",
234
- },
235
- child2: {
236
- has: "child value 2",
237
- },
238
- }
239
- holster.get("two").put(two, err => {
240
- assert.equal(err, null)
241
-
242
- setTimeout(() => {
243
- holster.get("two", data => {
244
- assert.deepEqual(data, two)
245
-
246
- holster.get("two").next("child1", data => {
247
- assert.deepEqual(data, {has: "child value 1"})
248
-
249
- holster.get("two").next("child2", data => {
250
- assert.deepEqual(data, {has: "child value 2"})
251
- done()
252
- })
253
- })
254
- })
255
- }, 2)
256
- })
257
- })
258
-
259
- test("put and get multiple nested object", (t, done) => {
260
- const multiple = {
261
- key: "multiple nested values",
262
- child: {
263
- has: "child value",
264
- grandchild: {
265
- has: "grandchild value",
266
- other: "(not returned in lex query)",
267
- },
268
- },
269
- }
270
- holster.get("multiple").put(multiple, err => {
271
- assert.equal(err, null)
272
-
273
- setTimeout(() => {
274
- holster.get("multiple", data => {
275
- assert.deepEqual(data, multiple)
276
-
277
- holster.get("multiple").next("child", {".": "has"}, data => {
278
- assert.deepEqual(data, {has: "child value"})
279
-
280
- holster
281
- .get("multiple")
282
- .next("child")
283
- .next("grandchild", {".": "has"}, data => {
284
- assert.deepEqual(data, {has: "grandchild value"})
285
- done()
286
- })
287
- })
288
- })
289
- }, 2)
290
- })
291
- })
292
-
293
- test("put string with set", (t, done) => {
294
- holster.get("set").put("first", true, err => {
295
- assert.equal(err, null)
296
-
297
- holster.get("set", data => {
298
- assert.equal(Object.values(data)[0], "first")
299
-
300
- setTimeout(() => {
301
- holster.get("set").put("second", true, err => {
302
- assert.equal(err, null)
303
-
304
- holster.get("set", data => {
305
- for (const value of Object.values(data)) {
306
- assert.ok(value === "first" || value === "second")
307
- }
308
- done()
309
- })
310
- })
311
- }, 2)
312
- })
313
- })
314
- })
315
-
316
- test("put object with set", (t, done) => {
317
- const set1 = {
318
- key: "value 1",
319
- child: "child value 1",
320
- }
321
- const set2 = {
322
- key: "value 2",
323
- child: "child value 2",
324
- }
325
- holster.get("set2").put(set1, true, err => {
326
- assert.equal(err, null)
327
-
328
- holster.get("set2", data => {
329
- assert.deepEqual(Object.values(data)[0], set1)
330
-
331
- setTimeout(() => {
332
- holster.get("set2").put(set2, true, err => {
333
- assert.equal(err, null)
334
-
335
- holster.get("set2", data => {
336
- for (const value of Object.values(data)) {
337
- if (value.key === "value 1") {
338
- assert.deepEqual(value, set1)
339
- }
340
- if (value.key === "value 2") {
341
- assert.deepEqual(value, set2)
342
- }
343
- }
344
- done()
345
- })
346
- })
347
- }, 2)
348
- })
349
- })
350
- })
351
-
352
- test("cleanup", (t, done) => {
353
- fs.rm("test/holster.put", {recursive: true, force: true}, err => {
354
- assert.equal(err, null)
355
- done()
356
- })
357
- })
358
- })