@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,142 +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("system - user concurrent listeners", () => {
8
- const wss = new Server("ws://localhost:9015")
9
- const holster = Holster({
10
- file: "test/system/user-concurrent-listeners",
11
- wss: wss,
12
- wait: 500,
13
- })
14
- const user = holster.user()
15
-
16
- test("user create and auth", (t, done) => {
17
- user.create("testuser", "password", err => {
18
- assert.equal(err, null)
19
- user.auth("testuser", "password", err => {
20
- assert.equal(err, null)
21
- done()
22
- })
23
- })
24
- })
25
-
26
- test("multiple listeners on same path receive data", (t, done) => {
27
- let listener1Called = false
28
- let listener2Called = false
29
-
30
- user.get("key").put({value: "test"}, err => {
31
- assert.equal(err, null)
32
-
33
- // Set up two listeners on the same path
34
- user.get("key").on(data => {
35
- listener1Called = true
36
- assert.notEqual(data, null)
37
- assert.deepEqual(data, {value: "test"})
38
- checkComplete()
39
- }, true)
40
-
41
- user.get("key").on(data => {
42
- listener2Called = true
43
- assert.notEqual(data, null)
44
- assert.deepEqual(data, {value: "test"})
45
- checkComplete()
46
- }, true)
47
-
48
- function checkComplete() {
49
- if (listener1Called && listener2Called) {
50
- done()
51
- }
52
- }
53
- })
54
- })
55
-
56
- test("nested listeners on parent and child paths", (t, done) => {
57
- let parentCalled = false
58
- let childCalled = false
59
-
60
- user.get("parent").put({value: "parent-value"}, err => {
61
- assert.equal(err, null)
62
-
63
- user
64
- .get("parent")
65
- .next("child")
66
- .put({value: "child-value"}, err => {
67
- assert.equal(err, null)
68
-
69
- // Listen on parent
70
- user.get("parent").on(data => {
71
- parentCalled = true
72
- assert.notEqual(data, null)
73
- assert.equal(data.value, "parent-value")
74
- // Parent includes child as a rel
75
- assert.notEqual(data.child, undefined)
76
- checkComplete()
77
- }, true)
78
-
79
- // Listen on child
80
- user
81
- .get("parent")
82
- .next("child")
83
- .on(data => {
84
- childCalled = true
85
- assert.notEqual(data, null)
86
- assert.deepEqual(data, {value: "child-value"})
87
- checkComplete()
88
- }, true)
89
-
90
- function checkComplete() {
91
- if (parentCalled && childCalled) {
92
- done()
93
- }
94
- }
95
- })
96
- })
97
- })
98
-
99
- test("listener race condition - data before and after listener setup", (t, done) => {
100
- const results = []
101
-
102
- // Put data first
103
- user.get("race").put({value: "first"}, err => {
104
- assert.equal(err, null)
105
-
106
- // Set up listener with _get=true to read existing data
107
- // The listener will be called with the existing data via the get request
108
- user.get("race").on(data => {
109
- results.push(data?.value)
110
- }, true)
111
-
112
- // Immediately put new data - listener will fire for this put as well
113
- setTimeout(() => {
114
- user.get("race").put({value: "second"}, err => {
115
- assert.equal(err, null)
116
-
117
- setTimeout(() => {
118
- // Should have received both values - one from get, one from put
119
- assert.equal(
120
- results.length >= 1,
121
- true,
122
- "Should receive at least initial value from get",
123
- )
124
- assert.equal(results[0], "first", "First value should be 'first'")
125
- done()
126
- }, 100)
127
- })
128
- }, 50)
129
- })
130
- })
131
-
132
- test("cleanup", (t, done) => {
133
- fs.rm(
134
- "test/system/user-concurrent-listeners",
135
- {recursive: true, force: true},
136
- err => {
137
- assert.equal(err, null)
138
- done()
139
- },
140
- )
141
- })
142
- })
@@ -1,66 +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("system - user listener before data", () => {
8
- const wss = new Server("ws://localhost:9017")
9
- const holster = Holster({
10
- file: "test/system/user-listener-before-data",
11
- wss: wss,
12
- wait: 500,
13
- })
14
- const user = holster.user()
15
-
16
- test("user create and auth", (t, done) => {
17
- user.create("testuser", "password", err => {
18
- assert.equal(err, null)
19
- user.auth("testuser", "password", err => {
20
- assert.equal(err, null)
21
- done()
22
- })
23
- })
24
- })
25
-
26
- test("listener set up before data exists receives data when populated", (t, done) => {
27
- const results = []
28
-
29
- // Set up listener first before data exists
30
- user.get("testkey").on(data => {
31
- results.push(data)
32
- })
33
-
34
- // Give listener time to set up
35
- setTimeout(() => {
36
- user.get("testkey").put({value: "test"}, err => {
37
- assert.equal(err, null)
38
-
39
- // Give listener time to fire
40
- setTimeout(() => {
41
- // With the new behavior, listener fires after data is stored
42
- // Should have received the test value from the put
43
- const nonNull = results.filter(r => r !== null)
44
- assert.equal(
45
- nonNull.length >= 1,
46
- true,
47
- "Should have at least one non-null result",
48
- )
49
- assert.deepEqual(nonNull[0], {value: "test"})
50
- done()
51
- }, 200)
52
- })
53
- }, 100)
54
- })
55
-
56
- test("cleanup", (t, done) => {
57
- fs.rm(
58
- "test/system/user-listener-before-data",
59
- {recursive: true, force: true},
60
- err => {
61
- assert.equal(err, null)
62
- done()
63
- },
64
- )
65
- })
66
- })
package/test/user.test.js DELETED
@@ -1,173 +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 User from "../src/user.js"
6
-
7
- describe("user", () => {
8
- const wss = new Server("ws://localhost:1234")
9
- const user = User({file: "test/user", wss: wss, maxAge: 100, wait: 500})
10
-
11
- test("create", (t, done) => {
12
- user.create("alice", "password", err => {
13
- assert.equal(err, null)
14
- done()
15
- })
16
- })
17
-
18
- test("create no username", (t, done) => {
19
- user.create("", "password", err => {
20
- assert.equal(err, "Please provide a username")
21
- done()
22
- })
23
- })
24
-
25
- test("create no password", (t, done) => {
26
- user.create("alice", "", err => {
27
- assert.equal(err, "Please provide a password")
28
- done()
29
- })
30
- })
31
-
32
- test("username already exists", (t, done) => {
33
- user.create("alice", "password", err => {
34
- assert.equal(err, "Username already exists")
35
- done()
36
- })
37
- })
38
-
39
- test("user is already being created", (t, done) => {
40
- user.create("bob", "password", err => {
41
- assert.equal(err, null)
42
- done()
43
- })
44
- user.create("bob", "password", err => {
45
- assert.equal(err, "User is already being created")
46
- })
47
- })
48
-
49
- test("auth", (t, done) => {
50
- user.auth("alice", "password", err => {
51
- assert.equal(err, null)
52
- assert.equal(user.is.username, "alice")
53
- done()
54
- })
55
- })
56
-
57
- test("auth no username", (t, done) => {
58
- user.auth("", "password", err => {
59
- assert.equal(err, "Please provide a username")
60
- assert.equal(user.is, null)
61
- done()
62
- })
63
- })
64
-
65
- test("auth no password", (t, done) => {
66
- user.auth("alice", "", err => {
67
- assert.equal(err, "Please provide a password")
68
- assert.equal(user.is, null)
69
- done()
70
- })
71
- })
72
-
73
- test("auth wrong username", (t, done) => {
74
- user.auth("wrong", "password", err => {
75
- assert.equal(err, "Wrong username or password")
76
- assert.equal(user.is, null)
77
- done()
78
- })
79
- })
80
-
81
- test("auth wrong password", (t, done) => {
82
- user.auth("alice", "wrong", err => {
83
- assert.equal(err, "Wrong username or password")
84
- assert.equal(user.is, null)
85
- done()
86
- })
87
- })
88
-
89
- test("user is already authenticating", (t, done) => {
90
- user.auth("bob", "password", err => {
91
- assert.equal(err, null)
92
- assert.equal(user.is.username, "bob")
93
- done()
94
- })
95
- user.auth("bob", "password", err => {
96
- assert.equal(err, "User is already authenticating")
97
- assert.equal(user.is, null)
98
- })
99
- })
100
-
101
- test("change", (t, done) => {
102
- user.change("alice", "password", "new password", err => {
103
- assert.equal(err, null)
104
- assert.equal(user.is.username, "alice")
105
- done()
106
- })
107
- })
108
-
109
- test("change no username", (t, done) => {
110
- user.change("", "password", "new password", err => {
111
- assert.equal(err, "Please provide a username")
112
- assert.equal(user.is, null)
113
- done()
114
- })
115
- })
116
-
117
- test("change no password", (t, done) => {
118
- user.change("alice", "", "new password", err => {
119
- assert.equal(err, "Please provide a password")
120
- assert.equal(user.is, null)
121
- done()
122
- })
123
- })
124
-
125
- test("change no new password", (t, done) => {
126
- user.change("alice", "password", "", err => {
127
- assert.equal(err, "Please provide a new password")
128
- assert.equal(user.is, null)
129
- done()
130
- })
131
- })
132
-
133
- test("check password change and leave", (t, done) => {
134
- user.auth("alice", "new password", err => {
135
- assert.equal(err, null)
136
- assert.equal(user.is.username, "alice")
137
- user.leave()
138
- assert.equal(user.is, null)
139
- done()
140
- })
141
- })
142
-
143
- test("delete wrong password", (t, done) => {
144
- user.delete("alice", "password", err => {
145
- assert.equal(err, "Wrong username or password")
146
- assert.equal(user.is, null)
147
- done()
148
- })
149
- })
150
-
151
- test("delete", (t, done) => {
152
- user.delete("alice", "new password", err => {
153
- assert.equal(err, null)
154
- assert.equal(user.is, null)
155
- done()
156
- })
157
- })
158
-
159
- test("auth after delete", (t, done) => {
160
- user.auth("alice", "new password", err => {
161
- assert.equal(err, "Wrong username or password")
162
- assert.equal(user.is, null)
163
- done()
164
- })
165
- })
166
-
167
- test("cleanup", (t, done) => {
168
- fs.rm("test/user", {recursive: true, force: true}, err => {
169
- assert.equal(err, null)
170
- done()
171
- })
172
- })
173
- })
package/test/wire.test.js DELETED
@@ -1,158 +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 Wire from "../src/wire.js"
6
-
7
- describe("wire", () => {
8
- // Need different websocket servers otherwise data on file will sync up.
9
- const wss1 = new Server("ws://localhost:1234")
10
- const kitty = Wire({file: "test/kitty", wss: wss1, maxAge: 10})
11
-
12
- const wss2 = new Server("ws://localhost:1235")
13
- const wire = Wire({file: "test/wire", wss: wss2, maxAge: 10})
14
-
15
- const ws = new WebSocket("ws://localhost:1235")
16
- ws.onmessage = m => {
17
- const msg = JSON.parse(m.data)
18
- if (msg.get) {
19
- const soul = msg.get["#"]
20
- const put = {
21
- [soul]: {
22
- _: {"#": soul, ">": {test: 1}},
23
- test: "property",
24
- },
25
- }
26
- let track = "item"
27
- if (!msg.get["."]) {
28
- put[soul]._[">"].other = 2
29
- put[soul].other = "value"
30
- track = "node"
31
- }
32
- ws.send(
33
- JSON.stringify({
34
- "#": track,
35
- "@": msg["#"],
36
- put: put,
37
- }),
38
- )
39
- }
40
- }
41
-
42
- test("get node", (t, done) => {
43
- kitty.get({"#": "FDSA"}, msg => {
44
- assert.deepEqual(msg, {
45
- err: undefined,
46
- put: {
47
- FDSA: {
48
- _: {
49
- "#": "FDSA",
50
- ">": {
51
- color: 3,
52
- name: 2,
53
- slave: 2,
54
- species: 2,
55
- },
56
- },
57
- color: "ginger",
58
- name: "Fluffy",
59
- slave: {"#": "ASDF"},
60
- species: "felis silvestris",
61
- },
62
- },
63
- })
64
- done()
65
- })
66
- })
67
-
68
- test("get item", (t, done) => {
69
- kitty.get({"#": "FDSA", ".": "species"}, msg => {
70
- assert.deepEqual(msg, {
71
- err: undefined,
72
- put: {
73
- FDSA: {
74
- _: {
75
- "#": "FDSA",
76
- ">": {species: 2},
77
- },
78
- species: "felis silvestris",
79
- },
80
- },
81
- })
82
- done()
83
- })
84
- })
85
-
86
- test("get node from wire", (t, done) => {
87
- wire.get({"#": "not on disk"}, msg => {
88
- assert.deepEqual(msg, {
89
- put: {
90
- "not on disk": {
91
- _: {
92
- "#": "not on disk",
93
- ">": {test: 1, other: 2},
94
- },
95
- test: "property",
96
- other: "value",
97
- },
98
- },
99
- })
100
- done()
101
- })
102
- })
103
-
104
- test("get item from wire", (t, done) => {
105
- wire.get({"#": "not on disk", ".": "test"}, msg => {
106
- assert.deepEqual(msg, {
107
- put: {
108
- "not on disk": {
109
- _: {
110
- "#": "not on disk",
111
- ">": {test: 1},
112
- },
113
- test: "property",
114
- },
115
- },
116
- })
117
- done()
118
- })
119
- })
120
-
121
- test("put and get new node", (t, done) => {
122
- const update = {
123
- key: {
124
- _: {"#": "key", ">": {value: 1, otherValue: 1}},
125
- value: "wire test",
126
- otherValue: false,
127
- },
128
- }
129
- wire.put(update, err => {
130
- assert.deepEqual(err, null)
131
-
132
- wire.get({"#": "key", ".": "value"}, msg => {
133
- assert.deepEqual(msg, {
134
- put: {
135
- key: {
136
- _: {
137
- "#": "key",
138
- ">": {value: 1},
139
- },
140
- value: "wire test",
141
- },
142
- },
143
- })
144
- done()
145
- })
146
- })
147
- })
148
-
149
- test("cleanup", (t, done) => {
150
- // Timeout to let extra wire sends finish before tests end.
151
- setTimeout(() => {
152
- fs.rm("test/wire", {recursive: true, force: true}, err => {
153
- assert.equal(err, null)
154
- done()
155
- })
156
- }, 100)
157
- })
158
- })