@live-change/db-store-localstorage 0.6.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.
@@ -0,0 +1,168 @@
1
+ const test = require('tape')
2
+
3
+ require('fake-indexeddb/auto.js')
4
+ const idb = require('idb')
5
+ const Store = require('../lib/Store.js')
6
+
7
+ const nextTick = () => new Promise(resolve => {
8
+ console.log("WAIT!")
9
+ setTimeout(resolve, 100)
10
+ })
11
+
12
+ test("store broadcast range changes", t => {
13
+ t.plan(5)
14
+
15
+ let writeStore
16
+ let readStore
17
+
18
+ t.test("create stores", async t => {
19
+ t.plan(2)
20
+ readStore = new Store('test-broadcast-object-changes', 'test', 'local')
21
+ await readStore.open()
22
+ t.pass('read store created')
23
+ writeStore = new Store('test-broadcast-object-changes', 'test', 'local')
24
+ await writeStore.open()
25
+ t.pass('write store created')
26
+ })
27
+
28
+ t.test("put objects", async t => {
29
+ t.plan(1)
30
+ await writeStore.put({ v: 1, id: 'a' })
31
+ await writeStore.put({ v: 3, id: 'c' })
32
+ t.pass('objects written')
33
+ })
34
+
35
+ let nextValueResolve
36
+ let gotNextValue
37
+ const getNextValue = () => {
38
+ if(gotNextValue) {
39
+ gotNextValue = false
40
+ return rangeObservable.list
41
+ }
42
+ return new Promise((resolve, reject) => nextValueResolve = resolve)
43
+ }
44
+ let rangeObservable
45
+ const rangeObserver = (signal, value, ...rest) => {
46
+ console.log("SIGNAL", signal, value, ...rest)
47
+ if(nextValueResolve) {
48
+ nextValueResolve(rangeObservable.list)
49
+ } else {
50
+ gotNextValue = true
51
+ }
52
+ }
53
+
54
+ t.test("observe range [a,z]", t => {
55
+ t.plan(6)
56
+
57
+
58
+ let values
59
+
60
+ t.test("get values", async t => {
61
+ t.plan(1)
62
+ await nextTick()
63
+ rangeObservable = readStore.rangeObservable({ gte: 'a', lte: 'z' })
64
+ rangeObservable.observe(rangeObserver)
65
+ values = await getNextValue()
66
+ t.deepEqual(values, [{v: 1, id: 'a'}, {v: 3, id: 'c'}], 'range value')
67
+ })
68
+
69
+ t.test("remove object 'a' from observed range", async t => {
70
+ t.plan(1)
71
+ await nextTick()
72
+ await writeStore.delete('a')
73
+ let values = await getNextValue()
74
+ t.deepEqual(values, [ { v: 3, id: 'c' } ], 'range value' )
75
+ })
76
+
77
+ t.test("add object 'a' to observed range", async t => {
78
+ t.plan(1)
79
+ await nextTick()
80
+ await writeStore.put({ id: 'a', v: 4 })
81
+ let values = await getNextValue()
82
+ t.deepEqual(values, [ { v: 4, id: 'a' }, { v: 3, id: 'c' } ], 'range value' )
83
+ })
84
+
85
+ t.test("add object 'b' to observed range", async t => {
86
+ t.plan(1)
87
+ await nextTick()
88
+ await writeStore.put({ id: 'b', v: 5 })
89
+ let values = await getNextValue()
90
+ t.deepEqual(values, [ { v: 4, id: 'a' }, { v: 5, id: 'b' }, { v: 3, id: 'c' } ], 'range value' )
91
+ })
92
+
93
+ t.test("add object 'd' to observed range", async t => {
94
+ t.plan(1)
95
+ await nextTick()
96
+ await writeStore.put({ id: 'd', v: 6 })
97
+ let values = await getNextValue()
98
+ t.deepEqual(values, [ { v: 4, id: 'a' }, { v: 5, id: 'b' }, { v: 3, id: 'c' }, { v: 6, id: 'd' } ], 'range value' )
99
+ })
100
+
101
+ t.test("unobserve range", async t => {
102
+ t.plan(1)
103
+ await nextTick()
104
+ rangeObservable.unobserve(rangeObserver)
105
+ t.pass('unobserved')
106
+ })
107
+ })
108
+
109
+ t.test("observe range (a,d)", t => {
110
+ t.plan(6)
111
+
112
+ let values
113
+
114
+ t.test("get values", async t => {
115
+ t.plan(1)
116
+ await nextTick()
117
+ rangeObservable = readStore.rangeObservable({ gt: 'a', lt: 'd' })
118
+ rangeObservable.observe(rangeObserver)
119
+ values = await getNextValue()
120
+ t.deepEqual(values, [{v: 5, id: 'b'}, {v: 3, id: 'c'}], 'range value')
121
+ })
122
+
123
+ t.test("remove object 'd' outside observed range", async t => {
124
+ t.plan(1)
125
+ await nextTick()
126
+ await writeStore.delete('d')
127
+ t.pass('deleted')
128
+ })
129
+
130
+ t.test("remove object 'a' outside observed range", async t => {
131
+ t.plan(1)
132
+ await nextTick()
133
+ await writeStore.delete('a')
134
+ t.pass('deleted')
135
+ })
136
+
137
+ t.test("add object 'ab' to observed range", async t => {
138
+ t.plan(1)
139
+ await nextTick()
140
+ await writeStore.put({ id: 'ab', v: 7 })
141
+ let values = await getNextValue()
142
+ t.deepEqual(values, [ { v: 7, id: 'ab' }, { v: 5, id: 'b' }, { v: 3, id: 'c' } ], 'range value' )
143
+ })
144
+
145
+ t.test("remove object 'ab' from observed range", async t => {
146
+ t.plan(1)
147
+ await nextTick()
148
+ await writeStore.delete('ab')
149
+ let values = await getNextValue()
150
+ t.deepEqual(values, [ { v: 5, id: 'b' }, { v: 3, id: 'c' } ], 'range value' )
151
+ })
152
+
153
+ t.test("unobserve range", async t => {
154
+ t.plan(1)
155
+ await nextTick()
156
+ rangeObservable.unobserve(rangeObserver)
157
+ t.pass('unobserved')
158
+ })
159
+ })
160
+
161
+ t.test("close database", async t => {
162
+ await readStore.close()
163
+ await writeStore.close()
164
+ t.pass('closed')
165
+ t.end()
166
+ })
167
+
168
+ })
@@ -0,0 +1,176 @@
1
+ const test = require('tape')
2
+
3
+ require('fake-indexeddb/auto.js')
4
+ const idb = require('idb')
5
+ const Store = require('../lib/Store.js')
6
+
7
+ test("store limited range observable", t => {
8
+ t.plan(5)
9
+
10
+ let store
11
+
12
+ t.test("create store", async t => {
13
+ t.plan(1)
14
+ store = new Store('test-limited-range-observable', 'test', 'local')
15
+ await store.open()
16
+ t.pass('store created')
17
+ })
18
+
19
+ let objects = []
20
+
21
+ t.test("put objects", async t => {
22
+ t.plan(1)
23
+ store.put({ id: 'a_0', v: 1 })
24
+ for(let i = 0; i < 10; i++) {
25
+ let obj = { id: 'b_' + i, v: i }
26
+ objects.push(obj)
27
+ await store.put(obj)
28
+ }
29
+ await store.put({ id: 'c_0', v: 1 })
30
+ t.pass('objects written')
31
+ })
32
+
33
+ let nextValueResolve
34
+ let gotNextValue
35
+ const getNextValue = () => {
36
+ if(gotNextValue) {
37
+ gotNextValue = false
38
+ return rangeObservable.list
39
+ }
40
+ return new Promise((resolve, reject) => nextValueResolve = resolve)
41
+ }
42
+ let rangeObservable
43
+ const rangeObserver = (signal, value, ...rest) => {
44
+ console.log("SIGNAL", signal, value, ...rest)
45
+ gotNextValue = true
46
+ if(nextValueResolve) nextValueResolve(rangeObservable.list)
47
+ }
48
+
49
+ t.test("observe range [b_0,b_9]", t => {
50
+ t.plan(7)
51
+ rangeObservable = store.rangeObservable({ gte: 'b_0', lte: 'b_9', limit: 5 })
52
+ rangeObservable.observe(rangeObserver)
53
+
54
+ let values
55
+
56
+ t.test("get values", async t => {
57
+ t.plan(1)
58
+ values = await getNextValue()
59
+ t.deepEqual(values, objects.slice(0,5), 'range value')
60
+ })
61
+
62
+ t.test("remove object 'b_3' from observed range", async t => {
63
+ t.plan(1)
64
+ await store.delete('b_3')
65
+ objects.splice(3, 1)
66
+ await getNextValue() // one shorter
67
+ let values = await getNextValue()
68
+ t.deepEqual(values, objects.slice(0, 5), 'range value' )
69
+ })
70
+
71
+ t.test("add object 'b_3' to observed range", async t => {
72
+ t.plan(1)
73
+ const obj = { id: 'b_3', v: 10 }
74
+ await store.put(obj)
75
+ objects.splice(3, 0, obj)
76
+ let values = await getNextValue()
77
+ t.deepEqual(values, objects.slice(0, 5), 'range value' )
78
+ })
79
+
80
+ t.test("add object 'b_32' to observed range", async t => {
81
+ t.plan(1)
82
+ const obj = { id: 'b_32', v: 11 }
83
+ await store.put(obj)
84
+ objects.splice(4, 0, obj)
85
+ let values = await getNextValue()
86
+ t.deepEqual(values, objects.slice(0, 5), 'range value' )
87
+ })
88
+
89
+ t.test("add object 'b_35' outside observed range limits", async t => {
90
+ t.plan(1)
91
+ const obj = { id: 'b_35', v: 11 }
92
+ await store.put(obj)
93
+ objects.splice(5, 0, obj)
94
+ t.pass('added')
95
+ })
96
+
97
+ t.test("delete object 'b_32' so b_35 will enter into range limits", async t => {
98
+ t.plan(1)
99
+ await store.delete('b_32')
100
+ objects.splice(4, 1)
101
+ await getNextValue()
102
+ let values = await getNextValue()
103
+ t.deepEqual(values, objects.slice(0, 5), 'range value' )
104
+ })
105
+
106
+ t.test("unobserve range", async t => {
107
+ t.plan(1)
108
+ rangeObservable.unobserve(rangeObserver)
109
+ t.pass('unobserved')
110
+ })
111
+ })
112
+
113
+ t.test("observe range (b_0,b_5)", t => {
114
+ t.plan(7)
115
+ gotNextValue = false
116
+ rangeObservable = store.rangeObservable({ gt: 'b_0', lt: 'b_5', limit: 3 })
117
+ rangeObservable.observe(rangeObserver)
118
+
119
+ let values
120
+
121
+ t.test("get values", async t => {
122
+ t.plan(1)
123
+ values = await getNextValue()
124
+ t.deepEqual(values, objects.slice(1,4), 'range value')
125
+ })
126
+
127
+ t.test("remove object 'b_0' outside observed range", async t => {
128
+ t.plan(1)
129
+ await store.delete('b_0')
130
+ t.pass('deleted')
131
+ })
132
+
133
+ t.test("remove object 'b_5' outside observed range", async t => {
134
+ t.plan(1)
135
+ await store.delete('b_5')
136
+ t.pass('deleted')
137
+ })
138
+
139
+ t.test("remove object 'b_4' outside observed range limits", async t => {
140
+ t.plan(1)
141
+ await store.delete('b_4')
142
+ t.pass('deleted')
143
+ })
144
+
145
+ t.test("add object 'b_12' to observed range", async t => {
146
+ t.plan(1)
147
+ const obj = { id: 'b_12', v: 7 }
148
+ await store.put(obj)
149
+ objects.splice(2, 0, obj)
150
+ let values = await getNextValue()
151
+ t.deepEqual(values, objects.slice(1,4), 'range value' )
152
+ })
153
+
154
+ t.test("remove object 'b_12' from observed range", async t => {
155
+ t.plan(1)
156
+ await store.delete('b_12')
157
+ objects.splice(2, 1)
158
+ await getNextValue()
159
+ let values = await getNextValue()
160
+ t.deepEqual(values, objects.slice(1,4) , 'range value' )
161
+ })
162
+
163
+ t.test("unobserve range", async t => {
164
+ t.plan(1)
165
+ rangeObservable.unobserve(rangeObserver)
166
+ t.pass('unobserved')
167
+ })
168
+ })
169
+
170
+ t.test("close database", async t => {
171
+ await store.close()
172
+ t.pass('closed')
173
+ t.end()
174
+ })
175
+
176
+ })
@@ -0,0 +1,175 @@
1
+ const test = require('tape')
2
+
3
+ require('fake-indexeddb/auto.js')
4
+ const idb = require('idb')
5
+ const Store = require('../lib/Store.js')
6
+
7
+ test("store limited reverse range observable", t => {
8
+ t.plan(5)
9
+
10
+ let store
11
+
12
+ t.test("create store", async t => {
13
+ t.plan(1)
14
+ store = new Store('test-limited-reverse-range-observable', 'test', 'local')
15
+ await store.open()
16
+ t.pass('store created')
17
+ })
18
+
19
+ let objects = []
20
+
21
+ t.test("put objects", async t => {
22
+ t.plan(1)
23
+ await store.put({ id: 'a_0', v: 1 })
24
+ for(let i = 0; i < 10; i++) {
25
+ let obj = { id: 'b_' + i, v: i }
26
+ objects.unshift(obj)
27
+ await store.put(obj)
28
+ }
29
+ await store.put({ id: 'c_0', v: 1 })
30
+ t.pass('objects written')
31
+ })
32
+
33
+ let nextValueResolve
34
+ let gotNextValue
35
+ const getNextValue = () => {
36
+ if(gotNextValue) {
37
+ gotNextValue = false
38
+ return rangeObservable.list
39
+ }
40
+ return new Promise((resolve, reject) => nextValueResolve = resolve)
41
+ }
42
+ let rangeObservable
43
+ const rangeObserver = (signal, value, ...rest) => {
44
+ console.log("SIGNAL", signal, value, ...rest)
45
+ gotNextValue = true
46
+ if(nextValueResolve) nextValueResolve(rangeObservable.list)
47
+ }
48
+
49
+ t.test("observe reverse range [b_9,b_0]", t => {
50
+ t.plan(7)
51
+ rangeObservable = store.rangeObservable({ gte: 'b_0', lte: 'b_9', limit: 5, reverse: true })
52
+ rangeObservable.observe(rangeObserver)
53
+
54
+ let values
55
+
56
+ t.test("get values", async t => {
57
+ t.plan(1)
58
+ values = await getNextValue()
59
+ t.deepEqual(values, objects.slice(0,5), 'range value')
60
+ })
61
+
62
+ t.test("remove object 'b_6' from observed range", async t => {
63
+ t.plan(1)
64
+ await store.delete('b_6')
65
+ objects.splice(3, 1)
66
+ await getNextValue() // one shorter
67
+ let values = await getNextValue()
68
+ t.deepEqual(values, objects.slice(0, 5), 'range value' )
69
+ })
70
+
71
+ t.test("add object 'b_6' to observed range", async t => {
72
+ t.plan(1)
73
+ const obj = { id: 'b_6', v: 10 }
74
+ await store.put(obj)
75
+ objects.splice(3, 0, obj)
76
+ let values = await getNextValue()
77
+ t.deepEqual(values, objects.slice(0, 5), 'range value' )
78
+ })
79
+
80
+ t.test("add object 'b_58' to observed range", async t => {
81
+ t.plan(1)
82
+ const obj = { id: 'b_58', v: 11 }
83
+ await store.put(obj)
84
+ objects.splice(4, 0, obj)
85
+ let values = await getNextValue()
86
+ t.deepEqual(values, objects.slice(0, 5), 'range value' )
87
+ })
88
+
89
+ t.test("add object 'b_52' outside observed range limits", async t => {
90
+ t.plan(1)
91
+ const obj = { id: 'b_52', v: 11 }
92
+ await store.put(obj)
93
+ objects.splice(5, 0, obj)
94
+ t.pass('added')
95
+ })
96
+
97
+ t.test("delete object 'b_58' so b_52 will enter into range limits", async t => {
98
+ t.plan(1)
99
+ await store.delete('b_58')
100
+ objects.splice(4, 1)
101
+ await getNextValue()
102
+ let values = await getNextValue()
103
+ t.deepEqual(values, objects.slice(0, 5), 'range value' )
104
+ })
105
+
106
+ t.test("unobserve range", async t => {
107
+ t.plan(1)
108
+ rangeObservable.unobserve(rangeObserver)
109
+ t.pass('unobserved')
110
+ })
111
+ })
112
+
113
+ t.test("observe reverse range (b_5,b_0)", t => {
114
+ t.plan(7)
115
+ gotNextValue = false
116
+ rangeObservable = store.rangeObservable({ gt: 'b_0', lt: 'b_5', limit: 3, reverse: true })
117
+ rangeObservable.observe(rangeObserver)
118
+
119
+ let values
120
+ t.test("get values", async t => {
121
+ t.plan(1)
122
+ values = await getNextValue()
123
+ t.deepEqual(values, objects.slice(6,9), 'range value')
124
+ })
125
+
126
+ t.test("remove object 'b_5' outside observed range", async t => {
127
+ t.plan(1)
128
+ await store.delete('b_5')
129
+ t.pass('deleted')
130
+ })
131
+
132
+ t.test("remove object 'b_0' outside observed range", async t => {
133
+ t.plan(1)
134
+ await store.delete('b_0')
135
+ t.pass('deleted')
136
+ })
137
+
138
+ t.test("remove object 'b_1' outside observed range limits", async t => {
139
+ t.plan(1)
140
+ await store.delete('b_1')
141
+ t.pass('deleted')
142
+ })
143
+
144
+ t.test("add object 'b_48' to observed range", async t => {
145
+ t.plan(1)
146
+ const obj = { id: 'b_48', v: 7 }
147
+ await store.put(obj)
148
+ objects.splice(6, 0, obj)
149
+ let values = await getNextValue()
150
+ t.deepEqual(values, objects.slice(6,9), 'range value' )
151
+ })
152
+
153
+ t.test("remove object 'b_48' from observed range", async t => {
154
+ t.plan(1)
155
+ await store.delete('b_48')
156
+ objects.splice(6, 1)
157
+ await getNextValue()
158
+ let values = await getNextValue()
159
+ t.deepEqual(values, objects.slice(6,9) , 'range value' )
160
+ })
161
+
162
+ t.test("unobserve range", async t => {
163
+ t.plan(1)
164
+ rangeObservable.unobserve(rangeObserver)
165
+ t.pass('unobserved')
166
+ })
167
+ })
168
+
169
+ t.test("close database", async t => {
170
+ await store.close()
171
+ t.pass('closed')
172
+ t.end()
173
+ })
174
+
175
+ })
@@ -0,0 +1,68 @@
1
+ const test = require('tape')
2
+
3
+ require('fake-indexeddb/auto.js')
4
+ const idb = require('idb')
5
+ const Store = require('../lib/Store.js')
6
+
7
+ test("store object observable", t => {
8
+ t.plan(3)
9
+
10
+ let store
11
+
12
+ t.test("create store", async t => {
13
+ t.plan(1)
14
+ store = new Store('test-object-observable', 'test', 'local')
15
+ await store.open()
16
+ t.pass('store created')
17
+ })
18
+
19
+ let nextValueResolve
20
+ let gotNextValue
21
+ const getNextValue = () => {
22
+ if(gotNextValue) {
23
+ gotNextValue = false
24
+ return objectObservable.value
25
+ }
26
+ return new Promise((resolve, reject) => nextValueResolve = resolve)
27
+ }
28
+
29
+ let objectObservable
30
+ const objectObserver = (signal, value, ...rest) => {
31
+ console.log("SIGNAL", signal, value, ...rest)
32
+ gotNextValue = true
33
+ if(nextValueResolve) nextValueResolve(value)
34
+ }
35
+
36
+ t.test('observe object A', t => {
37
+ t.plan(3)
38
+ objectObservable = store.objectObservable('A')
39
+ objectObservable.observe(objectObserver)
40
+
41
+ t.test('get value', async t => {
42
+ t.plan(1)
43
+ let value = await getNextValue()
44
+ t.deepEqual(value, null, 'found null')
45
+ })
46
+
47
+ t.test("add object A", async t => {
48
+ t.plan(1)
49
+ await store.put({ id: 'A', a: 1 })
50
+ let value = await getNextValue()
51
+ t.deepEqual(value, { id: 'A', a: 1 } , 'found object' )
52
+ })
53
+
54
+ t.test("delete object A", async t => {
55
+ t.plan(1)
56
+ await store.delete('A')
57
+ let value = await getNextValue()
58
+ t.deepEqual(value, null , 'found null' )
59
+ })
60
+ })
61
+
62
+ t.test("close database", async t => {
63
+ await store.close()
64
+ t.pass('closed')
65
+ t.end()
66
+ })
67
+
68
+ })