@optimystic/db-p2p-storage-rn 0.13.0 → 0.13.5

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 (45) hide show
  1. package/dist/src/identity.d.ts +18 -0
  2. package/dist/src/identity.d.ts.map +1 -0
  3. package/dist/src/identity.js +27 -0
  4. package/dist/src/identity.js.map +1 -0
  5. package/dist/src/index.d.ts +4 -2
  6. package/dist/src/index.d.ts.map +1 -1
  7. package/dist/src/index.js +4 -2
  8. package/dist/src/index.js.map +1 -1
  9. package/dist/src/keys.d.ts +55 -0
  10. package/dist/src/keys.d.ts.map +1 -0
  11. package/dist/src/keys.js +126 -0
  12. package/dist/src/keys.js.map +1 -0
  13. package/dist/src/leveldb-kv-store.d.ts +21 -0
  14. package/dist/src/leveldb-kv-store.d.ts.map +1 -0
  15. package/dist/src/leveldb-kv-store.js +39 -0
  16. package/dist/src/leveldb-kv-store.js.map +1 -0
  17. package/dist/src/leveldb-like.d.ts +68 -0
  18. package/dist/src/leveldb-like.d.ts.map +1 -0
  19. package/dist/src/leveldb-like.js +34 -0
  20. package/dist/src/leveldb-like.js.map +1 -0
  21. package/dist/src/{mmkv-storage.d.ts → leveldb-storage.d.ts} +19 -32
  22. package/dist/src/leveldb-storage.d.ts.map +1 -0
  23. package/dist/src/leveldb-storage.js +138 -0
  24. package/dist/src/leveldb-storage.js.map +1 -0
  25. package/dist/src/rn-opener.d.ts +73 -0
  26. package/dist/src/rn-opener.d.ts.map +1 -0
  27. package/dist/src/rn-opener.js +200 -0
  28. package/dist/src/rn-opener.js.map +1 -0
  29. package/package.json +13 -7
  30. package/src/identity.ts +33 -0
  31. package/src/index.ts +14 -3
  32. package/src/keys.ts +139 -0
  33. package/src/leveldb-kv-store.ts +43 -0
  34. package/src/leveldb-like.ts +84 -0
  35. package/src/leveldb-storage.ts +155 -0
  36. package/src/rn-opener.ts +274 -0
  37. package/dist/src/mmkv-kv-store.d.ts +0 -13
  38. package/dist/src/mmkv-kv-store.d.ts.map +0 -1
  39. package/dist/src/mmkv-kv-store.js +0 -25
  40. package/dist/src/mmkv-kv-store.js.map +0 -1
  41. package/dist/src/mmkv-storage.d.ts.map +0 -1
  42. package/dist/src/mmkv-storage.js +0 -138
  43. package/dist/src/mmkv-storage.js.map +0 -1
  44. package/src/mmkv-kv-store.ts +0 -26
  45. package/src/mmkv-storage.ts +0 -181
@@ -1,13 +0,0 @@
1
- import type { MMKV } from './mmkv-storage.js';
2
- import type { IKVStore } from '@optimystic/db-p2p';
3
- /** MMKV-backed IKVStore adapter for React Native. */
4
- export declare class MMKVKVStore implements IKVStore {
5
- private readonly mmkv;
6
- private readonly prefix;
7
- constructor(mmkv: MMKV, prefix?: string);
8
- get(key: string): Promise<string | undefined>;
9
- set(key: string, value: string): Promise<void>;
10
- delete(key: string): Promise<void>;
11
- list(prefix: string): Promise<string[]>;
12
- }
13
- //# sourceMappingURL=mmkv-kv-store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mmkv-kv-store.d.ts","sourceRoot":"","sources":["../../src/mmkv-kv-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,qDAAqD;AACrD,qBAAa,WAAY,YAAW,QAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAQ,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAnC,IAAI,EAAE,IAAI,EAAmB,MAAM,SAAoB;IAE9E,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAI7C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAM7C"}
@@ -1,25 +0,0 @@
1
- /** MMKV-backed IKVStore adapter for React Native. */
2
- export class MMKVKVStore {
3
- mmkv;
4
- prefix;
5
- constructor(mmkv, prefix = 'optimystic:txn:') {
6
- this.mmkv = mmkv;
7
- this.prefix = prefix;
8
- }
9
- async get(key) {
10
- return this.mmkv.getString(this.prefix + key);
11
- }
12
- async set(key, value) {
13
- this.mmkv.set(this.prefix + key, value);
14
- }
15
- async delete(key) {
16
- this.mmkv.remove(this.prefix + key);
17
- }
18
- async list(prefix) {
19
- const fullPrefix = this.prefix + prefix;
20
- return this.mmkv.getAllKeys()
21
- .filter(k => k.startsWith(fullPrefix))
22
- .map(k => k.slice(this.prefix.length));
23
- }
24
- }
25
- //# sourceMappingURL=mmkv-kv-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mmkv-kv-store.js","sourceRoot":"","sources":["../../src/mmkv-kv-store.ts"],"names":[],"mappings":"AAGA,qDAAqD;AACrD,MAAM,OAAO,WAAW;IACM;IAA6B;IAA1D,YAA6B,IAAU,EAAmB,SAAS,iBAAiB;QAAvD,SAAI,GAAJ,IAAI,CAAM;QAAmB,WAAM,GAAN,MAAM,CAAoB;IAAG,CAAC;IAExF,KAAK,CAAC,GAAG,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;QACnC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;aAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;aACrC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,CAAC;CACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mmkv-storage.d.ts","sourceRoot":"","sources":["../../src/mmkv-storage.ts"],"names":[],"mappings":"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"}
@@ -1,138 +0,0 @@
1
- import { createLogger } from './logger.js';
2
- const log = createLogger('storage:mmkv');
3
- export class MMKVRawStorage {
4
- mmkv;
5
- prefix;
6
- constructor(options) {
7
- this.mmkv = options.mmkv;
8
- this.prefix = options.prefix ?? 'optimystic:';
9
- }
10
- async getMetadata(blockId) {
11
- return this.getJson(this.metadataKey(blockId));
12
- }
13
- async saveMetadata(blockId, metadata) {
14
- this.setJson(this.metadataKey(blockId), metadata);
15
- }
16
- async getRevision(blockId, rev) {
17
- return this.mmkv.getString(this.revisionKey(blockId, rev));
18
- }
19
- async saveRevision(blockId, rev, actionId) {
20
- this.mmkv.set(this.revisionKey(blockId, rev), actionId);
21
- }
22
- async getPendingTransaction(blockId, actionId) {
23
- return this.getJson(this.pendingKey(blockId, actionId));
24
- }
25
- async savePendingTransaction(blockId, actionId, transform) {
26
- this.setJson(this.pendingKey(blockId, actionId), transform);
27
- this.addToPendingIndex(blockId, actionId);
28
- }
29
- async deletePendingTransaction(blockId, actionId) {
30
- this.mmkv.remove(this.pendingKey(blockId, actionId));
31
- this.removeFromPendingIndex(blockId, actionId);
32
- }
33
- async *listPendingTransactions(blockId) {
34
- const index = this.getPendingIndex(blockId);
35
- for (const actionId of index) {
36
- if (this.mmkv.contains(this.pendingKey(blockId, actionId))) {
37
- yield actionId;
38
- }
39
- }
40
- }
41
- async getTransaction(blockId, actionId) {
42
- return this.getJson(this.transactionKey(blockId, actionId));
43
- }
44
- async saveTransaction(blockId, actionId, transform) {
45
- this.setJson(this.transactionKey(blockId, actionId), transform);
46
- }
47
- async *listRevisions(blockId, startRev, endRev) {
48
- const ascending = startRev <= endRev;
49
- for (let rev = startRev; ascending ? rev <= endRev : rev >= endRev; ascending ? ++rev : --rev) {
50
- const actionId = await this.getRevision(blockId, rev);
51
- if (actionId) {
52
- yield { actionId, rev };
53
- }
54
- }
55
- }
56
- async getMaterializedBlock(blockId, actionId) {
57
- return this.getJson(this.materializedKey(blockId, actionId));
58
- }
59
- async saveMaterializedBlock(blockId, actionId, block) {
60
- const key = this.materializedKey(blockId, actionId);
61
- if (block) {
62
- this.setJson(key, block);
63
- }
64
- else {
65
- this.mmkv.remove(key);
66
- }
67
- }
68
- async getApproximateBytesUsed() {
69
- let total = 0;
70
- for (const key of this.mmkv.getAllKeys()) {
71
- if (!key.startsWith(this.prefix))
72
- continue;
73
- total += key.length + (this.mmkv.getString(key)?.length ?? 0);
74
- }
75
- return total;
76
- }
77
- async promotePendingTransaction(blockId, actionId) {
78
- const pendingKey = this.pendingKey(blockId, actionId);
79
- const content = this.mmkv.getString(pendingKey);
80
- if (!content) {
81
- throw new Error(`Pending action ${actionId} not found for block ${blockId}`);
82
- }
83
- this.mmkv.set(this.transactionKey(blockId, actionId), content);
84
- this.mmkv.remove(pendingKey);
85
- this.removeFromPendingIndex(blockId, actionId);
86
- }
87
- metadataKey(blockId) {
88
- return `${this.prefix}${blockId}:meta`;
89
- }
90
- revisionKey(blockId, rev) {
91
- return `${this.prefix}${blockId}:rev:${rev}`;
92
- }
93
- pendingKey(blockId, actionId) {
94
- return `${this.prefix}${blockId}:pend:${actionId}`;
95
- }
96
- transactionKey(blockId, actionId) {
97
- return `${this.prefix}${blockId}:trx:${actionId}`;
98
- }
99
- materializedKey(blockId, actionId) {
100
- return `${this.prefix}${blockId}:block:${actionId}`;
101
- }
102
- pendingIndexKey(blockId) {
103
- return `${this.prefix}${blockId}:pend-idx`;
104
- }
105
- getJson(key) {
106
- const value = this.mmkv.getString(key);
107
- if (!value)
108
- return undefined;
109
- try {
110
- return JSON.parse(value);
111
- }
112
- catch (err) {
113
- log('Failed to parse JSON for key %s: %o', key, err);
114
- return undefined;
115
- }
116
- }
117
- setJson(key, value) {
118
- this.mmkv.set(key, JSON.stringify(value));
119
- }
120
- getPendingIndex(blockId) {
121
- return this.getJson(this.pendingIndexKey(blockId)) ?? [];
122
- }
123
- addToPendingIndex(blockId, actionId) {
124
- const index = this.getPendingIndex(blockId);
125
- if (!index.includes(actionId)) {
126
- index.push(actionId);
127
- this.setJson(this.pendingIndexKey(blockId), index);
128
- }
129
- }
130
- removeFromPendingIndex(blockId, actionId) {
131
- const index = this.getPendingIndex(blockId);
132
- const filtered = index.filter(id => id !== actionId);
133
- if (filtered.length !== index.length) {
134
- this.setJson(this.pendingIndexKey(blockId), filtered);
135
- }
136
- }
137
- }
138
- //# sourceMappingURL=mmkv-storage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mmkv-storage.js","sourceRoot":"","sources":["../../src/mmkv-storage.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import type { MMKV } from './mmkv-storage.js';
2
- import type { IKVStore } from '@optimystic/db-p2p';
3
-
4
- /** MMKV-backed IKVStore adapter for React Native. */
5
- export class MMKVKVStore implements IKVStore {
6
- constructor(private readonly mmkv: MMKV, private readonly prefix = 'optimystic:txn:') {}
7
-
8
- async get(key: string): Promise<string | undefined> {
9
- return this.mmkv.getString(this.prefix + key);
10
- }
11
-
12
- async set(key: string, value: string): Promise<void> {
13
- this.mmkv.set(this.prefix + key, value);
14
- }
15
-
16
- async delete(key: string): Promise<void> {
17
- this.mmkv.remove(this.prefix + key);
18
- }
19
-
20
- async list(prefix: string): Promise<string[]> {
21
- const fullPrefix = this.prefix + prefix;
22
- return this.mmkv.getAllKeys()
23
- .filter(k => k.startsWith(fullPrefix))
24
- .map(k => k.slice(this.prefix.length));
25
- }
26
- }
@@ -1,181 +0,0 @@
1
- import type { BlockId, IBlock, Transform, ActionId, ActionRev } from '@optimystic/db-core';
2
- import type { BlockMetadata, IRawStorage } from '@optimystic/db-p2p';
3
- import { createLogger } from './logger.js';
4
-
5
- const log = createLogger('storage:mmkv');
6
-
7
- /** MMKV storage interface matching react-native-mmkv */
8
- export interface MMKV {
9
- getString(key: string): string | undefined;
10
- set(key: string, value: string): void;
11
- remove(key: string): boolean;
12
- getAllKeys(): string[];
13
- contains(key: string): boolean;
14
- }
15
-
16
- export interface MMKVStorageOptions {
17
- /** The MMKV instance to use */
18
- mmkv: MMKV;
19
- /** Optional prefix for all keys to namespace this storage */
20
- prefix?: string;
21
- }
22
-
23
- export class MMKVRawStorage implements IRawStorage {
24
- private readonly mmkv: MMKV;
25
- private readonly prefix: string;
26
-
27
- constructor(options: MMKVStorageOptions) {
28
- this.mmkv = options.mmkv;
29
- this.prefix = options.prefix ?? 'optimystic:';
30
- }
31
-
32
- async getMetadata(blockId: BlockId): Promise<BlockMetadata | undefined> {
33
- return this.getJson<BlockMetadata>(this.metadataKey(blockId));
34
- }
35
-
36
- async saveMetadata(blockId: BlockId, metadata: BlockMetadata): Promise<void> {
37
- this.setJson(this.metadataKey(blockId), metadata);
38
- }
39
-
40
- async getRevision(blockId: BlockId, rev: number): Promise<ActionId | undefined> {
41
- return this.mmkv.getString(this.revisionKey(blockId, rev)) as ActionId | undefined;
42
- }
43
-
44
- async saveRevision(blockId: BlockId, rev: number, actionId: ActionId): Promise<void> {
45
- this.mmkv.set(this.revisionKey(blockId, rev), actionId);
46
- }
47
-
48
- async getPendingTransaction(blockId: BlockId, actionId: ActionId): Promise<Transform | undefined> {
49
- return this.getJson<Transform>(this.pendingKey(blockId, actionId));
50
- }
51
-
52
- async savePendingTransaction(blockId: BlockId, actionId: ActionId, transform: Transform): Promise<void> {
53
- this.setJson(this.pendingKey(blockId, actionId), transform);
54
- this.addToPendingIndex(blockId, actionId);
55
- }
56
-
57
- async deletePendingTransaction(blockId: BlockId, actionId: ActionId): Promise<void> {
58
- this.mmkv.remove(this.pendingKey(blockId, actionId));
59
- this.removeFromPendingIndex(blockId, actionId);
60
- }
61
-
62
- async *listPendingTransactions(blockId: BlockId): AsyncIterable<ActionId> {
63
- const index = this.getPendingIndex(blockId);
64
- for (const actionId of index) {
65
- if (this.mmkv.contains(this.pendingKey(blockId, actionId as ActionId))) {
66
- yield actionId as ActionId;
67
- }
68
- }
69
- }
70
-
71
- async getTransaction(blockId: BlockId, actionId: ActionId): Promise<Transform | undefined> {
72
- return this.getJson<Transform>(this.transactionKey(blockId, actionId));
73
- }
74
-
75
- async saveTransaction(blockId: BlockId, actionId: ActionId, transform: Transform): Promise<void> {
76
- this.setJson(this.transactionKey(blockId, actionId), transform);
77
- }
78
-
79
- async *listRevisions(blockId: BlockId, startRev: number, endRev: number): AsyncIterable<ActionRev> {
80
- const ascending = startRev <= endRev;
81
- for (let rev = startRev; ascending ? rev <= endRev : rev >= endRev; ascending ? ++rev : --rev) {
82
- const actionId = await this.getRevision(blockId, rev);
83
- if (actionId) {
84
- yield { actionId, rev };
85
- }
86
- }
87
- }
88
-
89
- async getMaterializedBlock(blockId: BlockId, actionId: ActionId): Promise<IBlock | undefined> {
90
- return this.getJson<IBlock>(this.materializedKey(blockId, actionId));
91
- }
92
-
93
- async saveMaterializedBlock(blockId: BlockId, actionId: ActionId, block?: IBlock): Promise<void> {
94
- const key = this.materializedKey(blockId, actionId);
95
- if (block) {
96
- this.setJson(key, block);
97
- } else {
98
- this.mmkv.remove(key);
99
- }
100
- }
101
-
102
- async getApproximateBytesUsed(): Promise<number> {
103
- let total = 0;
104
- for (const key of this.mmkv.getAllKeys()) {
105
- if (!key.startsWith(this.prefix)) continue;
106
- total += key.length + (this.mmkv.getString(key)?.length ?? 0);
107
- }
108
- return total;
109
- }
110
-
111
- async promotePendingTransaction(blockId: BlockId, actionId: ActionId): Promise<void> {
112
- const pendingKey = this.pendingKey(blockId, actionId);
113
- const content = this.mmkv.getString(pendingKey);
114
- if (!content) {
115
- throw new Error(`Pending action ${actionId} not found for block ${blockId}`);
116
- }
117
- this.mmkv.set(this.transactionKey(blockId, actionId), content);
118
- this.mmkv.remove(pendingKey);
119
- this.removeFromPendingIndex(blockId, actionId);
120
- }
121
-
122
- private metadataKey(blockId: BlockId): string {
123
- return `${this.prefix}${blockId}:meta`;
124
- }
125
-
126
- private revisionKey(blockId: BlockId, rev: number): string {
127
- return `${this.prefix}${blockId}:rev:${rev}`;
128
- }
129
-
130
- private pendingKey(blockId: BlockId, actionId: ActionId): string {
131
- return `${this.prefix}${blockId}:pend:${actionId}`;
132
- }
133
-
134
- private transactionKey(blockId: BlockId, actionId: ActionId): string {
135
- return `${this.prefix}${blockId}:trx:${actionId}`;
136
- }
137
-
138
- private materializedKey(blockId: BlockId, actionId: ActionId): string {
139
- return `${this.prefix}${blockId}:block:${actionId}`;
140
- }
141
-
142
- private pendingIndexKey(blockId: BlockId): string {
143
- return `${this.prefix}${blockId}:pend-idx`;
144
- }
145
-
146
- private getJson<T>(key: string): T | undefined {
147
- const value = this.mmkv.getString(key);
148
- if (!value) return undefined;
149
- try {
150
- return JSON.parse(value) as T;
151
- } catch (err) {
152
- log('Failed to parse JSON for key %s: %o', key, err);
153
- return undefined;
154
- }
155
- }
156
-
157
- private setJson(key: string, value: unknown): void {
158
- this.mmkv.set(key, JSON.stringify(value));
159
- }
160
-
161
- private getPendingIndex(blockId: BlockId): string[] {
162
- return this.getJson<string[]>(this.pendingIndexKey(blockId)) ?? [];
163
- }
164
-
165
- private addToPendingIndex(blockId: BlockId, actionId: ActionId): void {
166
- const index = this.getPendingIndex(blockId);
167
- if (!index.includes(actionId)) {
168
- index.push(actionId);
169
- this.setJson(this.pendingIndexKey(blockId), index);
170
- }
171
- }
172
-
173
- private removeFromPendingIndex(blockId: BlockId, actionId: ActionId): void {
174
- const index = this.getPendingIndex(blockId);
175
- const filtered = index.filter(id => id !== actionId);
176
- if (filtered.length !== index.length) {
177
- this.setJson(this.pendingIndexKey(blockId), filtered);
178
- }
179
- }
180
- }
181
-