@mongrov/db 0.2.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 (42) hide show
  1. package/README.md +332 -0
  2. package/dist/database.d.ts +42 -0
  3. package/dist/database.d.ts.map +1 -0
  4. package/dist/database.js +83 -0
  5. package/dist/database.js.map +1 -0
  6. package/dist/hooks.d.ts +136 -0
  7. package/dist/hooks.d.ts.map +1 -0
  8. package/dist/hooks.js +221 -0
  9. package/dist/hooks.js.map +1 -0
  10. package/dist/index.d.ts +17 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +18 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/kv-backends/index.d.ts +6 -0
  15. package/dist/kv-backends/index.d.ts.map +1 -0
  16. package/dist/kv-backends/index.js +6 -0
  17. package/dist/kv-backends/index.js.map +1 -0
  18. package/dist/kv-backends/mmkv-backend.d.ts +21 -0
  19. package/dist/kv-backends/mmkv-backend.d.ts.map +1 -0
  20. package/dist/kv-backends/mmkv-backend.js +59 -0
  21. package/dist/kv-backends/mmkv-backend.js.map +1 -0
  22. package/dist/kv-backends/secure-backend.d.ts +27 -0
  23. package/dist/kv-backends/secure-backend.d.ts.map +1 -0
  24. package/dist/kv-backends/secure-backend.js +97 -0
  25. package/dist/kv-backends/secure-backend.js.map +1 -0
  26. package/dist/kv-store.d.ts +27 -0
  27. package/dist/kv-store.d.ts.map +1 -0
  28. package/dist/kv-store.js +34 -0
  29. package/dist/kv-store.js.map +1 -0
  30. package/dist/replication.d.ts +69 -0
  31. package/dist/replication.d.ts.map +1 -0
  32. package/dist/replication.js +147 -0
  33. package/dist/replication.js.map +1 -0
  34. package/dist/token-store.d.ts +38 -0
  35. package/dist/token-store.d.ts.map +1 -0
  36. package/dist/token-store.js +47 -0
  37. package/dist/token-store.js.map +1 -0
  38. package/dist/types.d.ts +175 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +5 -0
  41. package/dist/types.js.map +1 -0
  42. package/package.json +60 -0
package/dist/hooks.js ADDED
@@ -0,0 +1,221 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * React hooks for RxDB database access
4
+ *
5
+ * Provides context-based database injection and reactive query hooks.
6
+ */
7
+ import { createContext, useContext, useState, useEffect, useCallback, useMemo, } from 'react';
8
+ const DatabaseContext = createContext(null);
9
+ /**
10
+ * Provides database context to child components.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * function App() {
15
+ * const [db, setDb] = useState<RxDatabase | null>(null)
16
+ *
17
+ * useEffect(() => {
18
+ * createDatabase(config).then(setDb)
19
+ * }, [])
20
+ *
21
+ * return (
22
+ * <DatabaseProvider database={db}>
23
+ * <MyApp />
24
+ * </DatabaseProvider>
25
+ * )
26
+ * }
27
+ * ```
28
+ */
29
+ export function DatabaseProvider({ database, children }) {
30
+ const value = useMemo(() => ({
31
+ db: database,
32
+ isReady: database !== null,
33
+ }), [database]);
34
+ return _jsx(DatabaseContext.Provider, { value: value, children: children });
35
+ }
36
+ // ─── Hooks ──────────────────────────────────────────────────────────────────
37
+ /**
38
+ * Hook to access the database context.
39
+ *
40
+ * @returns The database context value
41
+ * @throws If used outside of DatabaseProvider
42
+ */
43
+ export function useDatabase() {
44
+ const context = useContext(DatabaseContext);
45
+ if (context === null) {
46
+ throw new Error('[useDatabase] Hook called outside of DatabaseProvider.\n\n' +
47
+ 'To fix this, wrap your component tree with DatabaseProvider:\n\n' +
48
+ ' import { DatabaseProvider, createDatabase } from "@mongrov/db"\n\n' +
49
+ ' function App() {\n' +
50
+ ' const [db, setDb] = useState(null)\n' +
51
+ ' useEffect(() => { createDatabase(config).then(setDb) }, [])\n\n' +
52
+ ' return (\n' +
53
+ ' <DatabaseProvider database={db}>\n' +
54
+ ' <YourComponent />\n' +
55
+ ' </DatabaseProvider>\n' +
56
+ ' )\n' +
57
+ ' }');
58
+ }
59
+ return context;
60
+ }
61
+ /**
62
+ * Hook to access a specific collection.
63
+ *
64
+ * @param name - Collection name
65
+ * @returns The collection instance or null if not ready
66
+ *
67
+ * @example
68
+ * ```tsx
69
+ * function MessageList() {
70
+ * const messages = useCollection('messages')
71
+ *
72
+ * if (!messages) return <Loading />
73
+ *
74
+ * // Use messages collection...
75
+ * }
76
+ * ```
77
+ */
78
+ export function useCollection(name) {
79
+ const { db, isReady } = useDatabase();
80
+ if (!isReady || !db) {
81
+ return null;
82
+ }
83
+ return db[name] ?? null;
84
+ }
85
+ /**
86
+ * Hook to execute a reactive query on a collection.
87
+ *
88
+ * @param collectionName - Name of the collection to query
89
+ * @param query - RxDB/Mango query selector
90
+ * @returns Query result with reactive updates
91
+ *
92
+ * @example
93
+ * ```tsx
94
+ * function RecentMessages() {
95
+ * const { data, isLoading, error } = useQuery('messages', {
96
+ * selector: { createdAt: { $gt: Date.now() - 86400000 } },
97
+ * sort: [{ createdAt: 'desc' }],
98
+ * limit: 50,
99
+ * })
100
+ *
101
+ * if (isLoading) return <Loading />
102
+ * if (error) return <Error message={error.message} />
103
+ *
104
+ * return <MessageList messages={data} />
105
+ * }
106
+ * ```
107
+ */
108
+ export function useQuery(collectionName, query = {}) {
109
+ const collection = useCollection(collectionName);
110
+ const [data, setData] = useState([]);
111
+ const [isLoading, setIsLoading] = useState(true);
112
+ const [error, setError] = useState(null);
113
+ const [refetchTrigger, setRefetchTrigger] = useState(0);
114
+ // Memoize query to prevent infinite re-subscriptions
115
+ const queryKey = useMemo(() => JSON.stringify(query), [query]);
116
+ const refetch = useCallback(() => {
117
+ setRefetchTrigger(prev => prev + 1);
118
+ }, []);
119
+ useEffect(() => {
120
+ if (!collection) {
121
+ setIsLoading(true);
122
+ setData([]);
123
+ return;
124
+ }
125
+ setIsLoading(true);
126
+ setError(null);
127
+ let subscription = null;
128
+ try {
129
+ const parsedQuery = JSON.parse(queryKey);
130
+ const rxQuery = collection.find(parsedQuery);
131
+ subscription = rxQuery.$.subscribe({
132
+ next: (results) => {
133
+ // Convert RxDocuments to plain objects
134
+ const plainData = results.map((doc) => typeof doc.toJSON === 'function' ? doc.toJSON() : doc);
135
+ setData(plainData);
136
+ setIsLoading(false);
137
+ },
138
+ error: (err) => {
139
+ setError(err);
140
+ setIsLoading(false);
141
+ },
142
+ });
143
+ }
144
+ catch (err) {
145
+ setError(err instanceof Error ? err : new Error(String(err)));
146
+ setIsLoading(false);
147
+ }
148
+ return () => {
149
+ subscription?.unsubscribe();
150
+ };
151
+ }, [collection, queryKey, refetchTrigger]);
152
+ return { data, isLoading, error, refetch };
153
+ }
154
+ /**
155
+ * Hook to fetch and subscribe to a single document by ID.
156
+ *
157
+ * @param collectionName - Name of the collection
158
+ * @param id - Document primary key
159
+ * @returns Document result with reactive updates
160
+ *
161
+ * @example
162
+ * ```tsx
163
+ * function MessageDetail({ messageId }: { messageId: string }) {
164
+ * const { data: message, isLoading, error } = useDocument('messages', messageId)
165
+ *
166
+ * if (isLoading) return <Loading />
167
+ * if (error) return <Error message={error.message} />
168
+ * if (!message) return <NotFound />
169
+ *
170
+ * return <MessageView message={message} />
171
+ * }
172
+ * ```
173
+ */
174
+ export function useDocument(collectionName, id) {
175
+ const collection = useCollection(collectionName);
176
+ const [data, setData] = useState(null);
177
+ const [isLoading, setIsLoading] = useState(true);
178
+ const [error, setError] = useState(null);
179
+ const [refetchTrigger, setRefetchTrigger] = useState(0);
180
+ const refetch = useCallback(() => {
181
+ setRefetchTrigger(prev => prev + 1);
182
+ }, []);
183
+ useEffect(() => {
184
+ if (!collection || !id) {
185
+ setIsLoading(false);
186
+ setData(null);
187
+ return;
188
+ }
189
+ setIsLoading(true);
190
+ setError(null);
191
+ let subscription = null;
192
+ try {
193
+ const doc$ = collection.findOne(id).$;
194
+ subscription = doc$.subscribe({
195
+ next: (doc) => {
196
+ if (doc) {
197
+ const plainData = typeof doc.toJSON === 'function' ? doc.toJSON() : doc;
198
+ setData(plainData);
199
+ }
200
+ else {
201
+ setData(null);
202
+ }
203
+ setIsLoading(false);
204
+ },
205
+ error: (err) => {
206
+ setError(err);
207
+ setIsLoading(false);
208
+ },
209
+ });
210
+ }
211
+ catch (err) {
212
+ setError(err instanceof Error ? err : new Error(String(err)));
213
+ setIsLoading(false);
214
+ }
215
+ return () => {
216
+ subscription?.unsubscribe();
217
+ };
218
+ }, [collection, id, refetchTrigger]);
219
+ return { data, isLoading, error, refetch };
220
+ }
221
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @mongrov/db
3
+ *
4
+ * Database utilities for @mongrov apps:
5
+ * - KVStore: Unified async key-value storage (MMKV + SecureStore)
6
+ * - TokenStore: Auth token persistence backed by KVStore
7
+ * - RxDB: Document database with reactive queries
8
+ */
9
+ export { createKVStore } from './kv-store';
10
+ export { createTokenStore } from './token-store';
11
+ export type { TokenStore } from './token-store';
12
+ export { createDatabase, destroyDatabase } from './database';
13
+ export { DatabaseProvider, useDatabase, useCollection, useQuery, useDocument, } from './hooks';
14
+ export type { DatabaseProviderProps, QueryResult, DocumentResult, } from './hooks';
15
+ export { createReplicationState, cancelReplication, resyncReplication, } from './replication';
16
+ export type { KVStore, KVStoreConfig, DBLogger, DatabaseConfig, CollectionConfig, MigrationStrategies, MigrationStrategy, RxStorageType, RxJsonSchemaType, RxDatabaseType, RxCollectionType, RxDocumentType, MangoQueryType, RxReplicationStateType, ReplicationCheckpoint, ReplicationPushHandler, ReplicationPullHandler, ReplicationConfig, } from './types';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAG1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAG/C,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,QAAQ,EACR,WAAW,GACZ,MAAM,SAAS,CAAA;AAChB,YAAY,EACV,qBAAqB,EACrB,WAAW,EACX,cAAc,GACf,MAAM,SAAS,CAAA;AAGhB,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAA;AAGtB,YAAY,EACV,OAAO,EACP,aAAa,EACb,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,SAAS,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @mongrov/db
3
+ *
4
+ * Database utilities for @mongrov apps:
5
+ * - KVStore: Unified async key-value storage (MMKV + SecureStore)
6
+ * - TokenStore: Auth token persistence backed by KVStore
7
+ * - RxDB: Document database with reactive queries
8
+ */
9
+ // KVStore
10
+ export { createKVStore } from './kv-store';
11
+ // TokenStore (for @mongrov/auth integration)
12
+ export { createTokenStore } from './token-store';
13
+ // RxDB Database
14
+ export { createDatabase, destroyDatabase } from './database';
15
+ export { DatabaseProvider, useDatabase, useCollection, useQuery, useDocument, } from './hooks';
16
+ // Replication
17
+ export { createReplicationState, cancelReplication, resyncReplication, } from './replication';
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,UAAU;AACV,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1C,6CAA6C;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAGhD,gBAAgB;AAChB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,QAAQ,EACR,WAAW,GACZ,MAAM,SAAS,CAAA;AAOhB,cAAc;AACd,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAA"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * KV backend implementations
3
+ */
4
+ export { MMKVBackend } from './mmkv-backend';
5
+ export { SecureBackend } from './secure-backend';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/kv-backends/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * KV backend implementations
3
+ */
4
+ export { MMKVBackend } from './mmkv-backend';
5
+ export { SecureBackend } from './secure-backend';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/kv-backends/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * MMKV backend for KVStore.
3
+ * Wraps synchronous MMKV calls in async interface for API consistency.
4
+ */
5
+ import type { KVStore } from '../types';
6
+ /**
7
+ * MMKV-backed KVStore implementation.
8
+ * Fast synchronous storage wrapped in async API.
9
+ */
10
+ export declare class MMKVBackend implements KVStore {
11
+ private mmkv;
12
+ constructor(instanceId?: string);
13
+ get(key: string): Promise<string | null>;
14
+ set(key: string, value: string): Promise<void>;
15
+ delete(key: string): Promise<void>;
16
+ getObject<T>(key: string): Promise<T | null>;
17
+ setObject<T>(key: string, value: T): Promise<void>;
18
+ clear(): Promise<void>;
19
+ getAllKeys(): Promise<string[]>;
20
+ }
21
+ //# sourceMappingURL=mmkv-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mmkv-backend.d.ts","sourceRoot":"","sources":["../../src/kv-backends/mmkv-backend.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAoBvC;;;GAGG;AACH,qBAAa,WAAY,YAAW,OAAO;IACzC,OAAO,CAAC,IAAI,CAAuD;gBAEvD,UAAU,GAAE,MAAqB;IAKvC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,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,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAU5C,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAGtC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * MMKV backend for KVStore.
3
+ * Wraps synchronous MMKV calls in async interface for API consistency.
4
+ */
5
+ // Lazy import to allow optional peer dependency
6
+ let MMKV;
7
+ function getMMKV() {
8
+ if (!MMKV) {
9
+ try {
10
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
11
+ MMKV = require('react-native-mmkv').MMKV;
12
+ }
13
+ catch {
14
+ throw new Error('@mongrov/db: react-native-mmkv is required for KVStore. ' +
15
+ 'Install it with: pnpm add react-native-mmkv');
16
+ }
17
+ }
18
+ return MMKV;
19
+ }
20
+ /**
21
+ * MMKV-backed KVStore implementation.
22
+ * Fast synchronous storage wrapped in async API.
23
+ */
24
+ export class MMKVBackend {
25
+ constructor(instanceId = 'mongrov-kv') {
26
+ const MMKVClass = getMMKV();
27
+ this.mmkv = new MMKVClass({ id: instanceId });
28
+ }
29
+ async get(key) {
30
+ return this.mmkv.getString(key) ?? null;
31
+ }
32
+ async set(key, value) {
33
+ this.mmkv.set(key, value);
34
+ }
35
+ async delete(key) {
36
+ this.mmkv.delete(key);
37
+ }
38
+ async getObject(key) {
39
+ const value = this.mmkv.getString(key);
40
+ if (value === undefined)
41
+ return null;
42
+ try {
43
+ return JSON.parse(value);
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ async setObject(key, value) {
50
+ this.mmkv.set(key, JSON.stringify(value));
51
+ }
52
+ async clear() {
53
+ this.mmkv.clearAll();
54
+ }
55
+ async getAllKeys() {
56
+ return this.mmkv.getAllKeys();
57
+ }
58
+ }
59
+ //# sourceMappingURL=mmkv-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mmkv-backend.js","sourceRoot":"","sources":["../../src/kv-backends/mmkv-backend.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,gDAAgD;AAChD,IAAI,IAA6C,CAAA;AAEjD,SAAS,OAAO;IACd,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,CAAC;YACH,iEAAiE;YACjE,IAAI,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAA;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,0DAA0D;gBACxD,6CAA6C,CAChD,CAAA;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,WAAW;IAGtB,YAAY,aAAqB,YAAY;QAC3C,MAAM,SAAS,GAAG,OAAO,EAAE,CAAA;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,SAAS,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,CAAA;IACzC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;QAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC3B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,SAAS,CAAI,GAAW;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAA;QACpC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAM,CAAA;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAI,GAAW,EAAE,KAAQ;QACtC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAA;IACtB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAA;IAC/B,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * SecureStore backend for KVStore.
3
+ * Uses expo-secure-store for secure token/secret storage.
4
+ */
5
+ import type { KVStore } from '../types';
6
+ /**
7
+ * SecureStore-backed KVStore implementation.
8
+ * For tokens, secrets, and sensitive data.
9
+ *
10
+ * Note: SecureStore has platform limitations:
11
+ * - iOS: Keychain (2048 byte limit per value)
12
+ * - Android: SharedPreferences with encryption
13
+ */
14
+ export declare class SecureBackend implements KVStore {
15
+ private store;
16
+ constructor();
17
+ get(key: string): Promise<string | null>;
18
+ set(key: string, value: string): Promise<void>;
19
+ delete(key: string): Promise<void>;
20
+ getObject<T>(key: string): Promise<T | null>;
21
+ setObject<T>(key: string, value: T): Promise<void>;
22
+ clear(): Promise<void>;
23
+ getAllKeys(): Promise<string[]>;
24
+ private trackKey;
25
+ private untrackKey;
26
+ }
27
+ //# sourceMappingURL=secure-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-backend.d.ts","sourceRoot":"","sources":["../../src/kv-backends/secure-backend.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AA4BvC;;;;;;;GAOG;AACH,qBAAa,aAAc,YAAW,OAAO;IAC3C,OAAO,CAAC,KAAK,CAAmB;;IAM1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlC,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAU5C,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAYvB,QAAQ;YASR,UAAU;CAQzB"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * SecureStore backend for KVStore.
3
+ * Uses expo-secure-store for secure token/secret storage.
4
+ */
5
+ // Lazy import to allow optional peer dependency
6
+ let cachedSecureStore = null;
7
+ function getSecureStore() {
8
+ if (cachedSecureStore) {
9
+ return cachedSecureStore;
10
+ }
11
+ try {
12
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
13
+ cachedSecureStore = require('expo-secure-store');
14
+ return cachedSecureStore;
15
+ }
16
+ catch {
17
+ throw new Error('@mongrov/db: expo-secure-store is required for secure KVStore. ' +
18
+ 'Install it with: npx expo install expo-secure-store');
19
+ }
20
+ }
21
+ // Key prefix for getAllKeys tracking (SecureStore doesn't have getAllKeys)
22
+ const KEYS_REGISTRY = '__mongrov_secure_keys__';
23
+ /**
24
+ * SecureStore-backed KVStore implementation.
25
+ * For tokens, secrets, and sensitive data.
26
+ *
27
+ * Note: SecureStore has platform limitations:
28
+ * - iOS: Keychain (2048 byte limit per value)
29
+ * - Android: SharedPreferences with encryption
30
+ */
31
+ export class SecureBackend {
32
+ constructor() {
33
+ this.store = getSecureStore();
34
+ }
35
+ async get(key) {
36
+ return this.store.getItemAsync(key);
37
+ }
38
+ async set(key, value) {
39
+ await this.store.setItemAsync(key, value);
40
+ await this.trackKey(key);
41
+ }
42
+ async delete(key) {
43
+ await this.store.deleteItemAsync(key);
44
+ await this.untrackKey(key);
45
+ }
46
+ async getObject(key) {
47
+ const value = await this.store.getItemAsync(key);
48
+ if (value === null)
49
+ return null;
50
+ try {
51
+ return JSON.parse(value);
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ }
57
+ async setObject(key, value) {
58
+ await this.store.setItemAsync(key, JSON.stringify(value));
59
+ await this.trackKey(key);
60
+ }
61
+ async clear() {
62
+ const keys = await this.getAllKeys();
63
+ await Promise.all(keys.map((key) => this.store.deleteItemAsync(key)));
64
+ await this.store.deleteItemAsync(KEYS_REGISTRY);
65
+ }
66
+ async getAllKeys() {
67
+ const keysJson = await this.store.getItemAsync(KEYS_REGISTRY);
68
+ if (!keysJson)
69
+ return [];
70
+ try {
71
+ return JSON.parse(keysJson);
72
+ }
73
+ catch {
74
+ return [];
75
+ }
76
+ }
77
+ // ─── Internal key tracking ───────────────────────────────────────────────
78
+ async trackKey(key) {
79
+ if (key === KEYS_REGISTRY)
80
+ return;
81
+ const keys = await this.getAllKeys();
82
+ if (!keys.includes(key)) {
83
+ keys.push(key);
84
+ await this.store.setItemAsync(KEYS_REGISTRY, JSON.stringify(keys));
85
+ }
86
+ }
87
+ async untrackKey(key) {
88
+ if (key === KEYS_REGISTRY)
89
+ return;
90
+ const keys = await this.getAllKeys();
91
+ const filtered = keys.filter((k) => k !== key);
92
+ if (filtered.length !== keys.length) {
93
+ await this.store.setItemAsync(KEYS_REGISTRY, JSON.stringify(filtered));
94
+ }
95
+ }
96
+ }
97
+ //# sourceMappingURL=secure-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-backend.js","sourceRoot":"","sources":["../../src/kv-backends/secure-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * KVStore factory
3
+ *
4
+ * Creates a unified async key-value store backed by either:
5
+ * - MMKV (default) — fast, for preferences/caches
6
+ * - SecureStore (secure: true) — for tokens/secrets
7
+ */
8
+ import type { KVStore, KVStoreConfig } from './types';
9
+ /**
10
+ * Create a KVStore instance.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * // Default MMKV store for preferences
15
+ * const prefs = createKVStore()
16
+ * await prefs.set('theme', 'dark')
17
+ *
18
+ * // Isolated MMKV instance
19
+ * const cache = createKVStore({ instanceId: 'api-cache' })
20
+ *
21
+ * // Secure store for tokens
22
+ * const tokens = createKVStore({ secure: true })
23
+ * await tokens.set('accessToken', 'jwt...')
24
+ * ```
25
+ */
26
+ export declare function createKVStore(config?: KVStoreConfig): KVStore;
27
+ //# sourceMappingURL=kv-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kv-store.d.ts","sourceRoot":"","sources":["../src/kv-store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAIrD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,MAAM,GAAE,aAAkB,GAAG,OAAO,CAQjE"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * KVStore factory
3
+ *
4
+ * Creates a unified async key-value store backed by either:
5
+ * - MMKV (default) — fast, for preferences/caches
6
+ * - SecureStore (secure: true) — for tokens/secrets
7
+ */
8
+ import { MMKVBackend } from './kv-backends/mmkv-backend';
9
+ import { SecureBackend } from './kv-backends/secure-backend';
10
+ /**
11
+ * Create a KVStore instance.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * // Default MMKV store for preferences
16
+ * const prefs = createKVStore()
17
+ * await prefs.set('theme', 'dark')
18
+ *
19
+ * // Isolated MMKV instance
20
+ * const cache = createKVStore({ instanceId: 'api-cache' })
21
+ *
22
+ * // Secure store for tokens
23
+ * const tokens = createKVStore({ secure: true })
24
+ * await tokens.set('accessToken', 'jwt...')
25
+ * ```
26
+ */
27
+ export function createKVStore(config = {}) {
28
+ const { secure = false, instanceId = 'mongrov-kv' } = config;
29
+ if (secure) {
30
+ return new SecureBackend();
31
+ }
32
+ return new MMKVBackend(instanceId);
33
+ }
34
+ //# sourceMappingURL=kv-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kv-store.js","sourceRoot":"","sources":["../src/kv-store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAE5D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAAC,SAAwB,EAAE;IACtD,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,UAAU,GAAG,YAAY,EAAE,GAAG,MAAM,CAAA;IAE5D,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,IAAI,aAAa,EAAE,CAAA;IAC5B,CAAC;IAED,OAAO,IAAI,WAAW,CAAC,UAAU,CAAC,CAAA;AACpC,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * RxDB Replication Helper
3
+ *
4
+ * Thin wrapper over rxdb/plugins/replication for creating replication states.
5
+ * App provides push/pull handlers that connect to their backend (e.g., collab adapter).
6
+ */
7
+ import type { ReplicationConfig, RxReplicationStateType } from './types';
8
+ /**
9
+ * Creates a replication state for syncing a collection with a remote backend.
10
+ *
11
+ * This is a thin wrapper over RxDB's replication plugin. The app provides
12
+ * push/pull handlers that connect to their backend (e.g., @mongrov/collab adapter).
13
+ *
14
+ * @param config - Replication configuration
15
+ * @returns RxDB replication state instance
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * import { createReplicationState } from '@mongrov/db'
20
+ *
21
+ * // Create replication with push/pull handlers
22
+ * const replication = createReplicationState({
23
+ * replicationIdentifier: 'messages-sync',
24
+ * collection: db.messages,
25
+ * push: {
26
+ * handler: async (docs) => {
27
+ * // Send changes to backend via collab adapter
28
+ * await collabAdapter.pushMessages(docs)
29
+ * },
30
+ * },
31
+ * pull: {
32
+ * handler: async (checkpoint, batchSize) => {
33
+ * // Fetch changes from backend
34
+ * const result = await collabAdapter.pullMessages(checkpoint, batchSize)
35
+ * return {
36
+ * documents: result.messages,
37
+ * checkpoint: result.checkpoint,
38
+ * }
39
+ * },
40
+ * },
41
+ * live: true, // Enable real-time sync
42
+ * })
43
+ *
44
+ * // Listen for sync events
45
+ * replication.error$.subscribe((error) => {
46
+ * console.error('Sync error:', error)
47
+ * })
48
+ *
49
+ * // Manual sync trigger
50
+ * await replication.reSync()
51
+ *
52
+ * // Stop replication
53
+ * await replication.cancel()
54
+ * ```
55
+ */
56
+ export declare function createReplicationState<T>(config: ReplicationConfig<T>): RxReplicationStateType;
57
+ /**
58
+ * Cancels a replication state and cleans up resources.
59
+ *
60
+ * @param replicationState - The replication state to cancel
61
+ */
62
+ export declare function cancelReplication(replicationState: RxReplicationStateType): Promise<void>;
63
+ /**
64
+ * Triggers a manual sync cycle for a replication state.
65
+ *
66
+ * @param replicationState - The replication state to sync
67
+ */
68
+ export declare function resyncReplication(replicationState: RxReplicationStateType): Promise<void>;
69
+ //# sourceMappingURL=replication.d.ts.map