@mblaney/holster 1.0.35 → 2.0.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 (72) 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 +22 -5
  6. package/src/dup.js +4 -5
  7. package/src/get.js +10 -19
  8. package/src/ham.js +22 -49
  9. package/src/holster.js +172 -58
  10. package/src/index.js +1 -1
  11. package/src/radisk.js +89 -86
  12. package/src/sea-utils.js +1 -1
  13. package/src/sea.js +0 -52
  14. package/src/store.js +8 -8
  15. package/src/user.js +0 -4
  16. package/src/wire.js +209 -79
  17. package/ts/src/array.ts +78 -0
  18. package/ts/src/buffer.ts +441 -0
  19. package/ts/src/dup.ts +38 -0
  20. package/ts/src/get.ts +83 -0
  21. package/ts/src/ham.ts +258 -0
  22. package/ts/src/holster.ts +968 -0
  23. package/ts/src/index.ts +35 -0
  24. package/ts/src/radisk.ts +591 -0
  25. package/ts/src/radix.ts +157 -0
  26. package/ts/src/schemas.ts +515 -0
  27. package/ts/src/sea-utils.ts +103 -0
  28. package/ts/src/sea.ts +388 -0
  29. package/ts/src/store.ts +321 -0
  30. package/ts/src/user.ts +377 -0
  31. package/ts/src/utils.ts +232 -0
  32. package/ts/src/wire.ts +961 -0
  33. package/.dockerignore +0 -9
  34. package/.github/workflows/node.js.yml +0 -31
  35. package/.github/workflows/npm-publish.yml +0 -33
  36. package/Dockerfile +0 -20
  37. package/examples/index.html +0 -33
  38. package/examples/index.js +0 -49
  39. package/examples/user.html +0 -31
  40. package/examples/user.js +0 -93
  41. package/examples/wire.html +0 -27
  42. package/examples/wire.js +0 -55
  43. package/test/holster.get.test.js +0 -94
  44. package/test/holster.lex.test.js +0 -196
  45. package/test/holster.off.test.js +0 -53
  46. package/test/holster.on.test.js +0 -264
  47. package/test/holster.put.test.js +0 -358
  48. package/test/holster.secure.test.js +0 -202
  49. package/test/holster.user.get.test.js +0 -114
  50. package/test/holster.user.lex.test.js +0 -149
  51. package/test/holster.user.off.test.js +0 -73
  52. package/test/holster.user.on.test.js +0 -300
  53. package/test/holster.user.put.test.js +0 -463
  54. package/test/kitty/! +0 -9
  55. package/test/names.js +0 -225
  56. package/test/radisk.cache.test.js +0 -213
  57. package/test/radisk.test.js +0 -331
  58. package/test/radix.test.js +0 -117
  59. package/test/sea.test.js +0 -284
  60. package/test/split.test.js +0 -317
  61. package/test/store.test.js +0 -316
  62. package/test/system/basic.test.js +0 -29
  63. package/test/system/chained-on.test.js +0 -41
  64. package/test/system/concurrent-listeners.test.js +0 -125
  65. package/test/system/immediate-read.test.js +0 -30
  66. package/test/system/listener-before-data.test.js +0 -51
  67. package/test/system/promise-wrapper.test.js +0 -47
  68. package/test/system/user-chained-on.test.js +0 -60
  69. package/test/system/user-concurrent-listeners.test.js +0 -142
  70. package/test/system/user-listener-before-data.test.js +0 -66
  71. package/test/user.test.js +0 -173
  72. package/test/wire.test.js +0 -158
@@ -1,202 +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.secure", () => {
8
- const wss = new Server("ws://localhost:1234")
9
- const holster = Holster({
10
- file: "test/holster.secure",
11
- wss: wss,
12
- maxAge: 100,
13
- secure: true,
14
- })
15
- const user = holster.user()
16
- const expect = "error putting data on root: user required in secure mode"
17
-
18
- test("empty key callback null", (t, done) => {
19
- holster.get("", data => {
20
- assert.equal(data, null)
21
- done()
22
- })
23
- })
24
-
25
- test("null key callback null", (t, done) => {
26
- holster.get(null, data => {
27
- assert.equal(data, null)
28
- done()
29
- })
30
- })
31
-
32
- test("underscore as key callback null", (t, done) => {
33
- holster.get("_", data => {
34
- assert.equal(data, null)
35
- done()
36
- })
37
- })
38
-
39
- test("get unknown key callback null", (t, done) => {
40
- holster.get("unknown", data => {
41
- assert.equal(data, null)
42
- done()
43
- })
44
- })
45
-
46
- test("next chained unknown keys callback null", (t, done) => {
47
- holster.get("chained").next("unknown", data => {
48
- assert.equal(data, null)
49
- done()
50
- })
51
- })
52
-
53
- test("put string on root error", (t, done) => {
54
- holster.get("key").put("value", err => {
55
- assert.equal(err, expect)
56
- done()
57
- })
58
- })
59
-
60
- test("chained get before put", (t, done) => {
61
- holster
62
- .get("hello")
63
- .next("world!")
64
- .put("ok", err => {
65
- assert.equal(err, expect)
66
- done()
67
- })
68
- })
69
-
70
- test("chained get before put object in graph format", (t, done) => {
71
- const plain = {
72
- key: "hello plain value",
73
- }
74
- holster
75
- .get("hello")
76
- .next("plain")
77
- .put(plain, err => {
78
- assert.equal(err, expect)
79
- done()
80
- })
81
- })
82
-
83
- test("user create", (t, done) => {
84
- user.create("alice", "password", err => {
85
- assert.equal(err, null)
86
- done()
87
- })
88
- })
89
-
90
- test("user auth", (t, done) => {
91
- user.auth("alice", "password", err => {
92
- assert.equal(err, null)
93
- done()
94
- })
95
- })
96
-
97
- test("user put and get string", (t, done) => {
98
- user.get("key").put("value", err => {
99
- assert.equal(err, null)
100
-
101
- user.get("key", data => {
102
- assert.equal(data, "value")
103
- done()
104
- })
105
- })
106
- })
107
-
108
- test("user chained get before put", (t, done) => {
109
- user
110
- .get("hello")
111
- .next("world!")
112
- .put("ok", err => {
113
- assert.equal(err, null)
114
-
115
- user.get("hello").next("world!", data => {
116
- assert.equal(data, "ok")
117
- done()
118
- })
119
- })
120
- })
121
-
122
- test("user put and get object in graph format", (t, done) => {
123
- const plain = {
124
- key: "plain value",
125
- true: true,
126
- false: false,
127
- number: 42,
128
- }
129
- user.get("plain").put(plain, err => {
130
- assert.equal(err, null)
131
-
132
- user.get("plain", data => {
133
- assert.deepEqual(data, plain)
134
- done()
135
- })
136
- })
137
- })
138
-
139
- test("user put object to null", (t, done) => {
140
- user.get("plain").put(null, err => {
141
- assert.equal(err, null)
142
-
143
- user.get("plain", data => {
144
- assert.equal(data, null)
145
- done()
146
- })
147
- })
148
- })
149
-
150
- test("user chained get before put object in graph format", (t, done) => {
151
- const plain = {
152
- key: "hello plain value",
153
- }
154
- user
155
- .get("hello")
156
- .next("plain")
157
- .put(plain, err => {
158
- assert.equal(err, null)
159
-
160
- user.get("hello").next("plain", data => {
161
- assert.deepEqual(data, plain)
162
- done()
163
- })
164
- })
165
- })
166
-
167
- test("user put and get nested object", (t, done) => {
168
- const nested = {
169
- key: "nested value",
170
- child: {
171
- has: "child value",
172
- },
173
- }
174
- user.get("nested").put(nested, err => {
175
- assert.equal(err, null)
176
-
177
- // Getting a nested object requires waiting for radisk to write to disk,
178
- // as it will batch the writes. (Default wait is 1 millisecond.)
179
- setTimeout(() => {
180
- user.get("nested", data => {
181
- assert.deepEqual(data, nested)
182
-
183
- user.get("nested").next("key", data => {
184
- assert.equal(data, "nested value")
185
-
186
- user.get("nested").next("child", data => {
187
- assert.deepEqual(data, {has: "child value"})
188
- done()
189
- })
190
- })
191
- })
192
- }, 2)
193
- })
194
- })
195
-
196
- test("cleanup", (t, done) => {
197
- fs.rm("test/holster.secure", {recursive: true, force: true}, err => {
198
- assert.equal(err, null)
199
- done()
200
- })
201
- })
202
- })
@@ -1,114 +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.user.get", () => {
8
- const wss = new Server("ws://localhost:1234")
9
- const holster = Holster({
10
- file: "test/holster.user.get",
11
- wss: wss,
12
- maxAge: 100,
13
- wait: 500,
14
- })
15
- const user = holster.user()
16
-
17
- test("user is not authenticated", (t, done) => {
18
- user.get("test", data => {
19
- assert.equal(data, null)
20
- done()
21
- })
22
- })
23
-
24
- test("user create", (t, done) => {
25
- user.create("alice", "password", err => {
26
- assert.equal(err, null)
27
- done()
28
- })
29
- })
30
-
31
- test("user auth", (t, done) => {
32
- user.auth("alice", "password", err => {
33
- assert.equal(err, null)
34
- done()
35
- })
36
- })
37
-
38
- test("empty key callback null", (t, done) => {
39
- user.get("", data => {
40
- assert.equal(data, null)
41
- done()
42
- })
43
- })
44
-
45
- test("null key callback null", (t, done) => {
46
- user.get(null, data => {
47
- assert.equal(data, null)
48
- done()
49
- })
50
- })
51
-
52
- test("underscore as key callback null", (t, done) => {
53
- user.get("_", data => {
54
- assert.equal(data, null)
55
- done()
56
- })
57
- })
58
-
59
- test("get unknown key callback null", (t, done) => {
60
- user.get("unknown", data => {
61
- assert.equal(data, null)
62
- done()
63
- })
64
- })
65
-
66
- test("get unknown keys in for loop callbacks null", (t, done) => {
67
- let count = 0
68
- for (let i = 0; i < 5; i++) {
69
- user.get("unknown" + i, data => {
70
- assert.equal(data, null)
71
- count++
72
- })
73
- }
74
- setTimeout(() => {
75
- if (count === 5) done()
76
- }, 200)
77
- })
78
-
79
- test("nested get unknown key callback null", (t, done) => {
80
- user.get("unknown", data => {
81
- assert.equal(data, null)
82
-
83
- user.get("unknown", data => {
84
- assert.equal(data, null)
85
- done()
86
- })
87
- })
88
- })
89
-
90
- test("next chained unknown keys callback null", (t, done) => {
91
- user.get("chained").next("unknown", data => {
92
- assert.equal(data, null)
93
- done()
94
- })
95
- })
96
-
97
- test("nested next chained unknown keys callback null", (t, done) => {
98
- user.get("chained").next("unknown", data => {
99
- assert.equal(data, null)
100
-
101
- user.get("chained").next("unknown", data => {
102
- assert.equal(data, null)
103
- done()
104
- })
105
- })
106
- })
107
-
108
- test("cleanup", (t, done) => {
109
- fs.rm("test/holster.user.get", {recursive: true, force: true}, err => {
110
- assert.equal(err, null)
111
- done()
112
- })
113
- })
114
- })
@@ -1,149 +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.user.lex", () => {
8
- const wss = new Server("ws://localhost:1234")
9
- const holster = Holster({
10
- file: "test/holster.user.lex",
11
- wss: wss,
12
- maxAge: 100,
13
- wait: 500,
14
- })
15
- const user = holster.user()
16
-
17
- test("user create", (t, done) => {
18
- user.create("alice", "password", err => {
19
- assert.equal(err, null)
20
- done()
21
- })
22
- })
23
-
24
- test("user auth", (t, done) => {
25
- user.auth("alice", "password", err => {
26
- assert.equal(err, null)
27
- assert.equal(user.is.username, "alice")
28
- done()
29
- })
30
- })
31
-
32
- test("put and get object in graph format", (t, done) => {
33
- const plain = {
34
- key: "plain value",
35
- true: true,
36
- false: false,
37
- number: 42,
38
- }
39
- user.get("plain").put(plain, err => {
40
- assert.equal(err, null)
41
-
42
- // Prefix tests. (Need to be sequential to match return values.)
43
- user.get("plain", {".": {"*": "k"}}, data => {
44
- assert.deepEqual(data, {key: "plain value"})
45
-
46
- user.get("plain", {".": {"*": "t"}}, data => {
47
- assert.deepEqual(data, {true: true})
48
-
49
- user.get("plain", {".": {"*": "f"}}, data => {
50
- assert.deepEqual(data, {false: false})
51
-
52
- user.get("plain", {".": {"*": "n"}}, data => {
53
- assert.deepEqual(data, {number: 42})
54
- })
55
-
56
- // Both less than and greater than.
57
- user.get("plain", {".": {"<": "n", ">": "falsy"}}, data => {
58
- assert.deepEqual(data, {key: "plain value"})
59
-
60
- // Only less than.
61
- user.get("plain", {".": {"<": "k"}}, data => {
62
- assert.deepEqual(data, {false: false})
63
-
64
- // Only greater than.
65
- user.get("plain", {".": {">": "numbers"}}, data => {
66
- assert.deepEqual(data, {true: true})
67
- done()
68
- })
69
- })
70
- })
71
- })
72
- })
73
- })
74
- })
75
- })
76
-
77
- test("put and get nested object", (t, done) => {
78
- const nested = {
79
- key: "nested value",
80
- other: "other value",
81
- child: {
82
- has: "child value",
83
- other: "other child value",
84
- },
85
- }
86
-
87
- user.get("nested").put(nested, err => {
88
- assert.equal(err, null)
89
-
90
- // Getting a nested object requires waiting for radisk to write to disk,
91
- // as it will batch the writes. (Default wait is 1 millisecond.)
92
- setTimeout(() => {
93
- user.get("nested", {".": {"*": "k"}}, data => {
94
- assert.deepEqual(data, {key: "nested value"})
95
-
96
- user.get("nested").next("child", {".": {"*": "h"}}, data => {
97
- assert.deepEqual(data, {has: "child value"})
98
-
99
- user.get("nested").next("child", {".": {"<": "has"}}, data => {
100
- // Less than means less than or equal to in lex.
101
- assert.deepEqual(data, {has: "child value"})
102
- done()
103
- })
104
- })
105
- })
106
- }, 2)
107
- })
108
- })
109
-
110
- test("on and put nested object", (t, done) => {
111
- const nested = {
112
- key: "nested key",
113
- child: {
114
- has: "child key",
115
- },
116
- }
117
- // The node needs to exist before it can be listend to for updates.
118
- user.get("on-nested").put(nested, err => {
119
- assert.equal(err, null)
120
-
121
- const update = {
122
- child: {
123
- has: "child update",
124
- },
125
- }
126
-
127
- user
128
- .get("on-nested")
129
- .next("child")
130
- .on({".": {">": "h"}}, data => {
131
- assert.deepEqual(data, update.child)
132
- done()
133
- })
134
-
135
- setTimeout(() => {
136
- user.get("on-nested").put(update, err => {
137
- assert.equal(err, null)
138
- })
139
- }, 10)
140
- })
141
- })
142
-
143
- test("cleanup", (t, done) => {
144
- fs.rm("test/holster.user.lex", {recursive: true, force: true}, err => {
145
- assert.equal(err, null)
146
- done()
147
- })
148
- })
149
- })
@@ -1,73 +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.user.off", () => {
8
- const wss = new Server("ws://localhost:1234")
9
- const holster = Holster({
10
- file: "test/holster.user.off",
11
- wss: wss,
12
- maxAge: 100,
13
- wait: 500,
14
- })
15
- const user = holster.user()
16
-
17
- test("user create", (t, done) => {
18
- user.create("alice", "password", err => {
19
- assert.equal(err, null)
20
- done()
21
- })
22
- })
23
-
24
- test("user auth", (t, done) => {
25
- user.auth("alice", "password", err => {
26
- assert.equal(err, null)
27
- done()
28
- })
29
- })
30
-
31
- test("calling off without get callback null", (t, done) => {
32
- user.off(data => {
33
- assert.equal(data, null)
34
- done()
35
- })
36
- })
37
-
38
- test("off with cb for property then update - no event", (t, done) => {
39
- const cb = data => {
40
- console.log("should not be called for key:", data)
41
- done()
42
- }
43
- user.get("key").on(cb)
44
- user.get("key").off(cb)
45
-
46
- user.get("key").put("value", err => {
47
- assert.equal(err, null)
48
- done()
49
- })
50
- })
51
-
52
- test("off no cb for property then update - no event", (t, done) => {
53
- user.get("key1").on(data => {
54
- console.log("should not be called for key1:", data)
55
- done()
56
- })
57
- setTimeout(() => {
58
- user.get("key1").off()
59
-
60
- user.get("key1").put("value1", err => {
61
- assert.equal(err, null)
62
- done()
63
- })
64
- }, 10)
65
- })
66
-
67
- test("cleanup", (t, done) => {
68
- fs.rm("test/holster.user.off", {recursive: true, force: true}, err => {
69
- assert.equal(err, null)
70
- done()
71
- })
72
- })
73
- })