@korajs/store 1.0.0-beta.1 → 1.0.0-beta.4
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.
- package/dist/adapters/better-sqlite3.cjs.map +1 -1
- package/dist/adapters/better-sqlite3.js +1 -1
- package/dist/adapters/indexeddb.cjs +196 -39
- package/dist/adapters/indexeddb.cjs.map +1 -1
- package/dist/adapters/indexeddb.d.cts +1 -1
- package/dist/adapters/indexeddb.d.ts +1 -1
- package/dist/adapters/indexeddb.js +15 -8
- package/dist/adapters/indexeddb.js.map +1 -1
- package/dist/adapters/sqlite-wasm-shared-host.cjs +80 -53
- package/dist/adapters/sqlite-wasm-shared-host.cjs.map +1 -1
- package/dist/adapters/sqlite-wasm-shared-host.d.cts +63 -1
- package/dist/adapters/sqlite-wasm-shared-host.d.ts +63 -1
- package/dist/adapters/sqlite-wasm-shared-host.js +56 -52
- package/dist/adapters/sqlite-wasm-shared-host.js.map +1 -1
- package/dist/adapters/sqlite-wasm-worker.cjs +25 -3
- package/dist/adapters/sqlite-wasm-worker.cjs.map +1 -1
- package/dist/adapters/sqlite-wasm-worker.js +25 -3
- package/dist/adapters/sqlite-wasm-worker.js.map +1 -1
- package/dist/adapters/sqlite-wasm.cjs +186 -34
- package/dist/adapters/sqlite-wasm.cjs.map +1 -1
- package/dist/adapters/sqlite-wasm.d.cts +29 -3
- package/dist/adapters/sqlite-wasm.d.ts +29 -3
- package/dist/adapters/sqlite-wasm.js +3 -3
- package/dist/{backup-ZV4Y424B.js → backup-IQE4QC7Q.js} +2 -2
- package/dist/{chunk-RBPVEAVM.js → chunk-2ZRQGFEF.js} +179 -36
- package/dist/chunk-2ZRQGFEF.js.map +1 -0
- package/dist/{chunk-IOEFNHHP.js → chunk-COJSQBXW.js} +2 -2
- package/dist/{chunk-X57MWW35.js → chunk-OCOGQRHW.js} +12 -9
- package/dist/chunk-OCOGQRHW.js.map +1 -0
- package/dist/{chunk-FFYA7J5H.js → chunk-RCTG3IJG.js} +3 -2
- package/dist/chunk-RCTG3IJG.js.map +1 -0
- package/dist/{chunk-QL2XVZRN.js → chunk-TUR7RGEP.js} +12 -1
- package/dist/{chunk-QL2XVZRN.js.map → chunk-TUR7RGEP.js.map} +1 -1
- package/dist/{chunk-ZLWAYQEQ.js → chunk-UXRWVXBP.js} +32 -28
- package/dist/chunk-UXRWVXBP.js.map +1 -0
- package/dist/{export-audit-AJ7RORNK.js → export-audit-MT2LTMIN.js} +2 -2
- package/dist/index.cjs +167 -141
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.js +51 -41
- package/dist/index.js.map +1 -1
- package/dist/internal.cjs +45 -40
- package/dist/internal.cjs.map +1 -1
- package/dist/internal.js +2 -2
- package/dist/{sqlite-wasm-channel-DUDPclTE.d.cts → sqlite-wasm-channel-CNHRf-m2.d.cts} +1 -1
- package/dist/{sqlite-wasm-channel-DUDPclTE.d.ts → sqlite-wasm-channel-CNHRf-m2.d.ts} +1 -1
- package/dist/sqlite-wasm-channel-NGSBJR44.js +12 -0
- package/package.json +2 -2
- package/dist/chunk-FFYA7J5H.js.map +0 -1
- package/dist/chunk-RBPVEAVM.js.map +0 -1
- package/dist/chunk-X57MWW35.js.map +0 -1
- package/dist/chunk-ZLWAYQEQ.js.map +0 -1
- package/dist/sqlite-wasm-channel-H43KEZLM.js +0 -12
- /package/dist/{backup-ZV4Y424B.js.map → backup-IQE4QC7Q.js.map} +0 -0
- /package/dist/{chunk-IOEFNHHP.js.map → chunk-COJSQBXW.js.map} +0 -0
- /package/dist/{export-audit-AJ7RORNK.js.map → export-audit-MT2LTMIN.js.map} +0 -0
- /package/dist/{sqlite-wasm-channel-H43KEZLM.js.map → sqlite-wasm-channel-NGSBJR44.js.map} +0 -0
package/dist/index.d.cts
CHANGED
|
@@ -71,6 +71,15 @@ declare class WorkerInitError extends KoraError {
|
|
|
71
71
|
declare class WorkerTimeoutError extends KoraError {
|
|
72
72
|
constructor(operation: string, timeoutMs: number);
|
|
73
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Thrown when a follower tab cannot reach a live leader tab over the multi-tab
|
|
76
|
+
* broadcast channel (the leader tab was closed, crashed, or is unresponsive).
|
|
77
|
+
* Distinct from {@link WorkerTimeoutError}: this fails fast on a confirmed-absent
|
|
78
|
+
* leader instead of waiting out the full RPC timeout.
|
|
79
|
+
*/
|
|
80
|
+
declare class NoLeaderError extends KoraError {
|
|
81
|
+
constructor(operation: string);
|
|
82
|
+
}
|
|
74
83
|
/**
|
|
75
84
|
* Thrown when IndexedDB persistence operations fail (serialize/deserialize).
|
|
76
85
|
*/
|
|
@@ -1748,4 +1757,4 @@ declare function createChunkPortPair(): {
|
|
|
1748
1757
|
b: ChunkMessagePort;
|
|
1749
1758
|
};
|
|
1750
1759
|
|
|
1751
|
-
export { AdapterError, ApplyRemoteOptions, type AuditExportManifest, type AuditExportOptions, type AuditExportPayload, type AuditExportProgress, type AuditTraceQuery, type BackupManifest, type BackupOptions, type BackupProgress, type BlobGcOptions, type BlobGcResult, type BlobManifest, type BlobManifestMetadata, COMPACTION_BASELINE_META_KEY, type ChunkMessage, type ChunkMessagePort, type ChunkProvider, type ChunkRequestMessage, type ChunkResponseMessage, type ClockRebaseResult, type CollectionAccessor, CollectionRecord, type CompactionResult, type CompactionStrategy, ContentAddressedBlobStore, type CreateRichTextControllerOptions, DEFAULT_CHUNK_SIZE, InvalidStateTransitionError, LAST_ACKED_SERVER_VECTOR_META_KEY, LocalMutationHandler, MaterializedRowSnapshot, MemoryBlobStore, type OpfsBlobDirectory, OpfsBlobStore, OptimisticLockError, OrderByDirection, type PersistedAuditTrace, PersistenceError, QueryBuilder, QueryDescriptor, QueryError, QueryStore, QueryStoreCache, type ReceiveBlobResult, type ReceiveBlobStores, RecordNotFoundError, type RemoteChunkProvider, type ReplaySnapshot, type RestoreOptions, type RestoreResult, type RichTextAwarenessUser, type RichTextController, type RichTextControllerSnapshot, type RichTextCursorInfo, type RichTextSyncEngine, RowVersionState, SequenceManager, type ServerBlobCallbacks, StorageAdapter, Store, StoreConfig, StoreNotOpenError, SubscriptionBloomFilter, SubscriptionCallback, SubscriptionManager, type SubscriptionManagerOptions, type SubscriptionStats, type TransactionCollectionAccessor, TransactionContext, type TransactionContextConfig, WhereClause, WorkerInitError, WorkerTimeoutError, asRichTextSyncEngine, assertQueryReady, chunkBlob, collectBlobGarbage, collectOperationsAheadOfServer, compactOperationLog, computeAckCompactionWatermark, createChunkPortPair, createMemoryServerBlobStore, createOpfsBlobDirectory, createOpfsBlobStore, createRemoteChunkProvider, createRichTextController, decodeAuditExport, decodeRichtext, deserializeVersionVectorFromMeta, encodeRichtext, exportBackup, extractBlobRefs, fetchBlobManifest, getSharedQueryStoreCache, mergeVersionVectors, parseBlobManifest, persistedAuditTraceFromEvent, pluralize, prepareBlobForSend, putBlobForTransfer, readAuditExportManifest, readBackupManifest, reassembleBlob, receiveBlob, resolveBlobManifest, restoreBackup, richtextStatesEqual, richtextToPlainText, serializeBlobManifest, serializeVersionVectorToMeta, serveBlobChunks, singularize, toServerBlobCallbacks, validateStateTransition, validateUpdateStateMachine, verifyAuditExportChecksum, verifyBackupChecksum };
|
|
1760
|
+
export { AdapterError, ApplyRemoteOptions, type AuditExportManifest, type AuditExportOptions, type AuditExportPayload, type AuditExportProgress, type AuditTraceQuery, type BackupManifest, type BackupOptions, type BackupProgress, type BlobGcOptions, type BlobGcResult, type BlobManifest, type BlobManifestMetadata, COMPACTION_BASELINE_META_KEY, type ChunkMessage, type ChunkMessagePort, type ChunkProvider, type ChunkRequestMessage, type ChunkResponseMessage, type ClockRebaseResult, type CollectionAccessor, CollectionRecord, type CompactionResult, type CompactionStrategy, ContentAddressedBlobStore, type CreateRichTextControllerOptions, DEFAULT_CHUNK_SIZE, InvalidStateTransitionError, LAST_ACKED_SERVER_VECTOR_META_KEY, LocalMutationHandler, MaterializedRowSnapshot, MemoryBlobStore, NoLeaderError, type OpfsBlobDirectory, OpfsBlobStore, OptimisticLockError, OrderByDirection, type PersistedAuditTrace, PersistenceError, QueryBuilder, QueryDescriptor, QueryError, QueryStore, QueryStoreCache, type ReceiveBlobResult, type ReceiveBlobStores, RecordNotFoundError, type RemoteChunkProvider, type ReplaySnapshot, type RestoreOptions, type RestoreResult, type RichTextAwarenessUser, type RichTextController, type RichTextControllerSnapshot, type RichTextCursorInfo, type RichTextSyncEngine, RowVersionState, SequenceManager, type ServerBlobCallbacks, StorageAdapter, Store, StoreConfig, StoreNotOpenError, SubscriptionBloomFilter, SubscriptionCallback, SubscriptionManager, type SubscriptionManagerOptions, type SubscriptionStats, type TransactionCollectionAccessor, TransactionContext, type TransactionContextConfig, WhereClause, WorkerInitError, WorkerTimeoutError, asRichTextSyncEngine, assertQueryReady, chunkBlob, collectBlobGarbage, collectOperationsAheadOfServer, compactOperationLog, computeAckCompactionWatermark, createChunkPortPair, createMemoryServerBlobStore, createOpfsBlobDirectory, createOpfsBlobStore, createRemoteChunkProvider, createRichTextController, decodeAuditExport, decodeRichtext, deserializeVersionVectorFromMeta, encodeRichtext, exportBackup, extractBlobRefs, fetchBlobManifest, getSharedQueryStoreCache, mergeVersionVectors, parseBlobManifest, persistedAuditTraceFromEvent, pluralize, prepareBlobForSend, putBlobForTransfer, readAuditExportManifest, readBackupManifest, reassembleBlob, receiveBlob, resolveBlobManifest, restoreBackup, richtextStatesEqual, richtextToPlainText, serializeBlobManifest, serializeVersionVectorToMeta, serveBlobChunks, singularize, toServerBlobCallbacks, validateStateTransition, validateUpdateStateMachine, verifyAuditExportChecksum, verifyBackupChecksum };
|
package/dist/index.d.ts
CHANGED
|
@@ -71,6 +71,15 @@ declare class WorkerInitError extends KoraError {
|
|
|
71
71
|
declare class WorkerTimeoutError extends KoraError {
|
|
72
72
|
constructor(operation: string, timeoutMs: number);
|
|
73
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Thrown when a follower tab cannot reach a live leader tab over the multi-tab
|
|
76
|
+
* broadcast channel (the leader tab was closed, crashed, or is unresponsive).
|
|
77
|
+
* Distinct from {@link WorkerTimeoutError}: this fails fast on a confirmed-absent
|
|
78
|
+
* leader instead of waiting out the full RPC timeout.
|
|
79
|
+
*/
|
|
80
|
+
declare class NoLeaderError extends KoraError {
|
|
81
|
+
constructor(operation: string);
|
|
82
|
+
}
|
|
74
83
|
/**
|
|
75
84
|
* Thrown when IndexedDB persistence operations fail (serialize/deserialize).
|
|
76
85
|
*/
|
|
@@ -1748,4 +1757,4 @@ declare function createChunkPortPair(): {
|
|
|
1748
1757
|
b: ChunkMessagePort;
|
|
1749
1758
|
};
|
|
1750
1759
|
|
|
1751
|
-
export { AdapterError, ApplyRemoteOptions, type AuditExportManifest, type AuditExportOptions, type AuditExportPayload, type AuditExportProgress, type AuditTraceQuery, type BackupManifest, type BackupOptions, type BackupProgress, type BlobGcOptions, type BlobGcResult, type BlobManifest, type BlobManifestMetadata, COMPACTION_BASELINE_META_KEY, type ChunkMessage, type ChunkMessagePort, type ChunkProvider, type ChunkRequestMessage, type ChunkResponseMessage, type ClockRebaseResult, type CollectionAccessor, CollectionRecord, type CompactionResult, type CompactionStrategy, ContentAddressedBlobStore, type CreateRichTextControllerOptions, DEFAULT_CHUNK_SIZE, InvalidStateTransitionError, LAST_ACKED_SERVER_VECTOR_META_KEY, LocalMutationHandler, MaterializedRowSnapshot, MemoryBlobStore, type OpfsBlobDirectory, OpfsBlobStore, OptimisticLockError, OrderByDirection, type PersistedAuditTrace, PersistenceError, QueryBuilder, QueryDescriptor, QueryError, QueryStore, QueryStoreCache, type ReceiveBlobResult, type ReceiveBlobStores, RecordNotFoundError, type RemoteChunkProvider, type ReplaySnapshot, type RestoreOptions, type RestoreResult, type RichTextAwarenessUser, type RichTextController, type RichTextControllerSnapshot, type RichTextCursorInfo, type RichTextSyncEngine, RowVersionState, SequenceManager, type ServerBlobCallbacks, StorageAdapter, Store, StoreConfig, StoreNotOpenError, SubscriptionBloomFilter, SubscriptionCallback, SubscriptionManager, type SubscriptionManagerOptions, type SubscriptionStats, type TransactionCollectionAccessor, TransactionContext, type TransactionContextConfig, WhereClause, WorkerInitError, WorkerTimeoutError, asRichTextSyncEngine, assertQueryReady, chunkBlob, collectBlobGarbage, collectOperationsAheadOfServer, compactOperationLog, computeAckCompactionWatermark, createChunkPortPair, createMemoryServerBlobStore, createOpfsBlobDirectory, createOpfsBlobStore, createRemoteChunkProvider, createRichTextController, decodeAuditExport, decodeRichtext, deserializeVersionVectorFromMeta, encodeRichtext, exportBackup, extractBlobRefs, fetchBlobManifest, getSharedQueryStoreCache, mergeVersionVectors, parseBlobManifest, persistedAuditTraceFromEvent, pluralize, prepareBlobForSend, putBlobForTransfer, readAuditExportManifest, readBackupManifest, reassembleBlob, receiveBlob, resolveBlobManifest, restoreBackup, richtextStatesEqual, richtextToPlainText, serializeBlobManifest, serializeVersionVectorToMeta, serveBlobChunks, singularize, toServerBlobCallbacks, validateStateTransition, validateUpdateStateMachine, verifyAuditExportChecksum, verifyBackupChecksum };
|
|
1760
|
+
export { AdapterError, ApplyRemoteOptions, type AuditExportManifest, type AuditExportOptions, type AuditExportPayload, type AuditExportProgress, type AuditTraceQuery, type BackupManifest, type BackupOptions, type BackupProgress, type BlobGcOptions, type BlobGcResult, type BlobManifest, type BlobManifestMetadata, COMPACTION_BASELINE_META_KEY, type ChunkMessage, type ChunkMessagePort, type ChunkProvider, type ChunkRequestMessage, type ChunkResponseMessage, type ClockRebaseResult, type CollectionAccessor, CollectionRecord, type CompactionResult, type CompactionStrategy, ContentAddressedBlobStore, type CreateRichTextControllerOptions, DEFAULT_CHUNK_SIZE, InvalidStateTransitionError, LAST_ACKED_SERVER_VECTOR_META_KEY, LocalMutationHandler, MaterializedRowSnapshot, MemoryBlobStore, NoLeaderError, type OpfsBlobDirectory, OpfsBlobStore, OptimisticLockError, OrderByDirection, type PersistedAuditTrace, PersistenceError, QueryBuilder, QueryDescriptor, QueryError, QueryStore, QueryStoreCache, type ReceiveBlobResult, type ReceiveBlobStores, RecordNotFoundError, type RemoteChunkProvider, type ReplaySnapshot, type RestoreOptions, type RestoreResult, type RichTextAwarenessUser, type RichTextController, type RichTextControllerSnapshot, type RichTextCursorInfo, type RichTextSyncEngine, RowVersionState, SequenceManager, type ServerBlobCallbacks, StorageAdapter, Store, StoreConfig, StoreNotOpenError, SubscriptionBloomFilter, SubscriptionCallback, SubscriptionManager, type SubscriptionManagerOptions, type SubscriptionStats, type TransactionCollectionAccessor, TransactionContext, type TransactionContextConfig, WhereClause, WorkerInitError, WorkerTimeoutError, asRichTextSyncEngine, assertQueryReady, chunkBlob, collectBlobGarbage, collectOperationsAheadOfServer, compactOperationLog, computeAckCompactionWatermark, createChunkPortPair, createMemoryServerBlobStore, createOpfsBlobDirectory, createOpfsBlobStore, createRemoteChunkProvider, createRichTextController, decodeAuditExport, decodeRichtext, deserializeVersionVectorFromMeta, encodeRichtext, exportBackup, extractBlobRefs, fetchBlobManifest, getSharedQueryStoreCache, mergeVersionVectors, parseBlobManifest, persistedAuditTraceFromEvent, pluralize, prepareBlobForSend, putBlobForTransfer, readAuditExportManifest, readBackupManifest, reassembleBlob, receiveBlob, resolveBlobManifest, restoreBackup, richtextStatesEqual, richtextToPlainText, serializeBlobManifest, serializeVersionVectorToMeta, serveBlobChunks, singularize, toServerBlobCallbacks, validateStateTransition, validateUpdateStateMachine, verifyAuditExportChecksum, verifyBackupChecksum };
|
package/dist/index.js
CHANGED
|
@@ -3,12 +3,12 @@ import {
|
|
|
3
3
|
readBackupManifest,
|
|
4
4
|
restoreBackup,
|
|
5
5
|
verifyBackupChecksum
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-OCOGQRHW.js";
|
|
7
7
|
import {
|
|
8
8
|
decodeAuditExport,
|
|
9
9
|
readAuditExportManifest,
|
|
10
10
|
verifyAuditExportChecksum
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-RCTG3IJG.js";
|
|
12
12
|
import {
|
|
13
13
|
persistedAuditTraceFromEvent
|
|
14
14
|
} from "./chunk-MYSJN3DF.js";
|
|
@@ -39,7 +39,7 @@ import {
|
|
|
39
39
|
serializeRowVersion,
|
|
40
40
|
validateStateTransition,
|
|
41
41
|
validateUpdateStateMachine
|
|
42
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-UXRWVXBP.js";
|
|
43
43
|
import {
|
|
44
44
|
decodeRichtext,
|
|
45
45
|
decodeRichtextFieldsFromOpData,
|
|
@@ -54,6 +54,7 @@ import {
|
|
|
54
54
|
} from "./chunk-6NKLDBTY.js";
|
|
55
55
|
import {
|
|
56
56
|
AdapterError,
|
|
57
|
+
NoLeaderError,
|
|
57
58
|
OptimisticLockError,
|
|
58
59
|
PersistenceError,
|
|
59
60
|
QueryError,
|
|
@@ -61,13 +62,13 @@ import {
|
|
|
61
62
|
StoreNotOpenError,
|
|
62
63
|
WorkerInitError,
|
|
63
64
|
WorkerTimeoutError
|
|
64
|
-
} from "./chunk-
|
|
65
|
+
} from "./chunk-TUR7RGEP.js";
|
|
65
66
|
|
|
66
67
|
// src/compaction/types.ts
|
|
67
68
|
var COMPACTION_BASELINE_META_KEY = "compaction_baseline_at";
|
|
68
69
|
|
|
69
70
|
// src/compaction/compact-operation-log.ts
|
|
70
|
-
import { HybridLogicalClock, createVersionVector } from "@korajs/core";
|
|
71
|
+
import { HybridLogicalClock, createVersionVector, quoteIdent } from "@korajs/core";
|
|
71
72
|
function computeAckCompactionWatermark(serverVector) {
|
|
72
73
|
const watermark = createVersionVector();
|
|
73
74
|
for (const [nodeId, seq] of serverVector) {
|
|
@@ -95,7 +96,7 @@ async function compactOperationLog(adapter, schema, strategy, serverVector) {
|
|
|
95
96
|
const collectionNames = Object.keys(schema.collections);
|
|
96
97
|
await adapter.transaction(async (tx) => {
|
|
97
98
|
for (const collectionName of collectionNames) {
|
|
98
|
-
const table = `_kora_ops_${collectionName}
|
|
99
|
+
const table = quoteIdent(`_kora_ops_${collectionName}`);
|
|
99
100
|
for (const [nodeId, maxSeq] of watermark) {
|
|
100
101
|
if (maxSeq <= 0) continue;
|
|
101
102
|
const countSql = buildCountSql(table, ageCutoffSerialized !== null);
|
|
@@ -209,10 +210,12 @@ import {
|
|
|
209
210
|
HybridLogicalClock as HybridLogicalClock3,
|
|
210
211
|
createVersionVector as createVersionVector3,
|
|
211
212
|
generateUUIDv7 as generateUUIDv73,
|
|
212
|
-
migrationStepsToSQL
|
|
213
|
+
migrationStepsToSQL,
|
|
214
|
+
quoteIdent as quoteIdent7
|
|
213
215
|
} from "@korajs/core";
|
|
214
216
|
|
|
215
217
|
// src/collection/collection.ts
|
|
218
|
+
import { quoteIdent as quoteIdent2 } from "@korajs/core";
|
|
216
219
|
var Collection = class {
|
|
217
220
|
constructor(name, definition, schema, adapter, clock, nodeId, allocateSequenceNumber, onMutation, relationEnforcer, mutationHandler, causalTracker, secretKeyProvider) {
|
|
218
221
|
this.name = name;
|
|
@@ -264,7 +267,7 @@ var Collection = class {
|
|
|
264
267
|
}
|
|
265
268
|
async findById(id) {
|
|
266
269
|
const rows = await this.adapter.query(
|
|
267
|
-
`SELECT * FROM ${this.name} WHERE id = ? AND _deleted = 0`,
|
|
270
|
+
`SELECT * FROM ${quoteIdent2(this.name)} WHERE id = ? AND _deleted = 0`,
|
|
268
271
|
[id]
|
|
269
272
|
);
|
|
270
273
|
const row = rows[0];
|
|
@@ -296,6 +299,9 @@ var Collection = class {
|
|
|
296
299
|
}
|
|
297
300
|
};
|
|
298
301
|
|
|
302
|
+
// src/query/query-builder.ts
|
|
303
|
+
import { quoteIdent as quoteIdent3 } from "@korajs/core";
|
|
304
|
+
|
|
299
305
|
// src/query/pluralize.ts
|
|
300
306
|
function isVowel(char) {
|
|
301
307
|
if (!char) return false;
|
|
@@ -525,7 +531,7 @@ var QueryBuilder = class _QueryBuilder {
|
|
|
525
531
|
const relatedDef = this.schema?.collections[relatedCollection];
|
|
526
532
|
if (!relatedDef) return;
|
|
527
533
|
const placeholders = uniqueFks.map(() => "?").join(", ");
|
|
528
|
-
const sql = `SELECT * FROM ${relatedCollection} WHERE id IN (${placeholders}) AND _deleted = 0`;
|
|
534
|
+
const sql = `SELECT * FROM ${quoteIdent3(relatedCollection)} WHERE id IN (${placeholders}) AND _deleted = 0`;
|
|
529
535
|
const rows = await this.adapter.query(sql, uniqueFks);
|
|
530
536
|
const relatedRecords = rows.map((row) => deserializeRecord(row, relatedDef.fields));
|
|
531
537
|
const lookup = /* @__PURE__ */ new Map();
|
|
@@ -548,7 +554,7 @@ var QueryBuilder = class _QueryBuilder {
|
|
|
548
554
|
if (!relatedDef) return;
|
|
549
555
|
const fkField = relation.field;
|
|
550
556
|
const placeholders = primaryIds.map(() => "?").join(", ");
|
|
551
|
-
const sql = `SELECT * FROM ${relatedCollection} WHERE ${fkField} IN (${placeholders}) AND _deleted = 0`;
|
|
557
|
+
const sql = `SELECT * FROM ${quoteIdent3(relatedCollection)} WHERE ${quoteIdent3(fkField)} IN (${placeholders}) AND _deleted = 0`;
|
|
552
558
|
const rows = await this.adapter.query(sql, primaryIds);
|
|
553
559
|
const relatedRecords = rows.map((row) => deserializeRecord(row, relatedDef.fields));
|
|
554
560
|
const grouped = /* @__PURE__ */ new Map();
|
|
@@ -590,7 +596,7 @@ var QueryError2 = class extends Error {
|
|
|
590
596
|
};
|
|
591
597
|
|
|
592
598
|
// src/relations/relation-enforcer.ts
|
|
593
|
-
import { KoraError, createOperation } from "@korajs/core";
|
|
599
|
+
import { KoraError, createOperation, quoteIdent as quoteIdent4 } from "@korajs/core";
|
|
594
600
|
|
|
595
601
|
// src/relations/relation-lookup.ts
|
|
596
602
|
function buildRelationLookup(schema) {
|
|
@@ -693,7 +699,7 @@ var RelationEnforcer = class {
|
|
|
693
699
|
async enforceCascade(incoming, deletedRecordId, tx, causalDeps) {
|
|
694
700
|
const { sourceCollection, foreignKeyField } = incoming;
|
|
695
701
|
const referencingRows = await tx.query(
|
|
696
|
-
`SELECT id FROM ${sourceCollection} WHERE ${foreignKeyField} = ? AND _deleted = 0`,
|
|
702
|
+
`SELECT id FROM ${quoteIdent4(sourceCollection)} WHERE ${quoteIdent4(foreignKeyField)} = ? AND _deleted = 0`,
|
|
697
703
|
[deletedRecordId]
|
|
698
704
|
);
|
|
699
705
|
if (referencingRows.length === 0) {
|
|
@@ -740,7 +746,7 @@ var RelationEnforcer = class {
|
|
|
740
746
|
return [];
|
|
741
747
|
}
|
|
742
748
|
const referencingRows = await tx.query(
|
|
743
|
-
`SELECT id FROM ${sourceCollection} WHERE ${foreignKeyField} = ? AND _deleted = 0`,
|
|
749
|
+
`SELECT id FROM ${quoteIdent4(sourceCollection)} WHERE ${quoteIdent4(foreignKeyField)} = ? AND _deleted = 0`,
|
|
744
750
|
[deletedRecordId]
|
|
745
751
|
);
|
|
746
752
|
if (referencingRows.length === 0) {
|
|
@@ -788,7 +794,7 @@ var RelationEnforcer = class {
|
|
|
788
794
|
async enforceRestrict(incoming, deletedRecordId, tx) {
|
|
789
795
|
const { sourceCollection, foreignKeyField, relationName } = incoming;
|
|
790
796
|
const countRows = await tx.query(
|
|
791
|
-
`SELECT COUNT(*) as cnt FROM ${sourceCollection} WHERE ${foreignKeyField} = ? AND _deleted = 0`,
|
|
797
|
+
`SELECT COUNT(*) as cnt FROM ${quoteIdent4(sourceCollection)} WHERE ${quoteIdent4(foreignKeyField)} = ? AND _deleted = 0`,
|
|
792
798
|
[deletedRecordId]
|
|
793
799
|
);
|
|
794
800
|
const count = countRows[0]?.cnt ?? 0;
|
|
@@ -1476,7 +1482,7 @@ var SubscriptionManager = class {
|
|
|
1476
1482
|
};
|
|
1477
1483
|
|
|
1478
1484
|
// src/sync/rebase-unsynced-operations.ts
|
|
1479
|
-
import { HybridLogicalClock as HybridLogicalClock2, MAX_LOGICAL } from "@korajs/core";
|
|
1485
|
+
import { HybridLogicalClock as HybridLogicalClock2, MAX_LOGICAL, quoteIdent as quoteIdent5 } from "@korajs/core";
|
|
1480
1486
|
import { computeOperationId } from "@korajs/core/internal";
|
|
1481
1487
|
var LOGICAL_COUNTER_LIMIT = MAX_LOGICAL + 1;
|
|
1482
1488
|
function emptyResult() {
|
|
@@ -1490,7 +1496,9 @@ async function rebaseUnsyncedOperationsInLog(adapter, schema, unsyncedOpIds, cor
|
|
|
1490
1496
|
const rebased = [];
|
|
1491
1497
|
let maxOtherSerializedTs = null;
|
|
1492
1498
|
for (const collectionName of Object.keys(schema.collections)) {
|
|
1493
|
-
const rows = await adapter.query(
|
|
1499
|
+
const rows = await adapter.query(
|
|
1500
|
+
`SELECT * FROM ${quoteIdent5(`_kora_ops_${collectionName}`)}`
|
|
1501
|
+
);
|
|
1494
1502
|
for (const row of rows) {
|
|
1495
1503
|
if (rebaseIds.has(row.id)) {
|
|
1496
1504
|
rebased.push(deserializeOperationWithCollection(row, collectionName));
|
|
@@ -1559,7 +1567,7 @@ async function rebaseUnsyncedOperationsInLog(adapter, schema, unsyncedOpIds, cor
|
|
|
1559
1567
|
continue;
|
|
1560
1568
|
}
|
|
1561
1569
|
const opsTable = `_kora_ops_${oldOp.collection}`;
|
|
1562
|
-
await tx.execute(`DELETE FROM ${opsTable} WHERE id = ?`, [oldOp.id]);
|
|
1570
|
+
await tx.execute(`DELETE FROM ${quoteIdent5(opsTable)} WHERE id = ?`, [oldOp.id]);
|
|
1563
1571
|
const opInsert = buildInsertQuery(
|
|
1564
1572
|
opsTable,
|
|
1565
1573
|
serializeOperation(newOp)
|
|
@@ -1568,11 +1576,11 @@ async function rebaseUnsyncedOperationsInLog(adapter, schema, unsyncedOpIds, cor
|
|
|
1568
1576
|
const oldVersion = serializeRowVersion(oldOp.timestamp);
|
|
1569
1577
|
const newVersion = serializeRowVersion(newOp.timestamp);
|
|
1570
1578
|
await tx.execute(
|
|
1571
|
-
`UPDATE ${oldOp.collection} SET _version = ?, _updated_at = ? WHERE id = ? AND _version = ?`,
|
|
1579
|
+
`UPDATE ${quoteIdent5(oldOp.collection)} SET _version = ?, _updated_at = ? WHERE id = ? AND _version = ?`,
|
|
1572
1580
|
[newVersion, newOp.timestamp.wallTime, oldOp.recordId, oldVersion]
|
|
1573
1581
|
);
|
|
1574
1582
|
const rows = await tx.query(
|
|
1575
|
-
`SELECT _field_versions FROM ${oldOp.collection} WHERE id = ?`,
|
|
1583
|
+
`SELECT _field_versions FROM ${quoteIdent5(oldOp.collection)} WHERE id = ?`,
|
|
1576
1584
|
[oldOp.recordId]
|
|
1577
1585
|
);
|
|
1578
1586
|
const fieldVersions = parseFieldVersions(rows[0]?._field_versions);
|
|
@@ -1584,14 +1592,14 @@ async function rebaseUnsyncedOperationsInLog(adapter, schema, unsyncedOpIds, cor
|
|
|
1584
1592
|
}
|
|
1585
1593
|
}
|
|
1586
1594
|
if (changed) {
|
|
1587
|
-
await tx.execute(
|
|
1588
|
-
|
|
1589
|
-
oldOp.recordId
|
|
1590
|
-
|
|
1595
|
+
await tx.execute(
|
|
1596
|
+
`UPDATE ${quoteIdent5(oldOp.collection)} SET _field_versions = ? WHERE id = ?`,
|
|
1597
|
+
[serializeFieldVersions(fieldVersions), oldOp.recordId]
|
|
1598
|
+
);
|
|
1591
1599
|
}
|
|
1592
1600
|
if (oldOp.type === "insert") {
|
|
1593
1601
|
await tx.execute(
|
|
1594
|
-
`UPDATE ${oldOp.collection} SET _created_at = ? WHERE id = ? AND _created_at = ?`,
|
|
1602
|
+
`UPDATE ${quoteIdent5(oldOp.collection)} SET _created_at = ? WHERE id = ? AND _created_at = ?`,
|
|
1595
1603
|
[newOp.timestamp.wallTime, oldOp.recordId, oldOp.timestamp.wallTime]
|
|
1596
1604
|
);
|
|
1597
1605
|
}
|
|
@@ -1611,6 +1619,7 @@ import {
|
|
|
1611
1619
|
createOperation as createOperation2,
|
|
1612
1620
|
generateUUIDv7,
|
|
1613
1621
|
isAtomicOp,
|
|
1622
|
+
quoteIdent as quoteIdent6,
|
|
1614
1623
|
resolveAtomicOp,
|
|
1615
1624
|
toAtomicOp,
|
|
1616
1625
|
validateRecord
|
|
@@ -1927,7 +1936,7 @@ var TransactionContext = class {
|
|
|
1927
1936
|
}
|
|
1928
1937
|
}
|
|
1929
1938
|
const rows = await this.config.adapter.query(
|
|
1930
|
-
`SELECT * FROM ${collectionName} WHERE id = ? AND _deleted = 0`,
|
|
1939
|
+
`SELECT * FROM ${quoteIdent6(collectionName)} WHERE id = ? AND _deleted = 0`,
|
|
1931
1940
|
[id]
|
|
1932
1941
|
);
|
|
1933
1942
|
let record = rows[0] ? deserializeRecord(rows[0], definition.fields) : null;
|
|
@@ -2162,7 +2171,7 @@ var Store = class {
|
|
|
2162
2171
|
return "skipped";
|
|
2163
2172
|
}
|
|
2164
2173
|
const existing = await this.adapter.query(
|
|
2165
|
-
`SELECT id FROM _kora_ops_${collection} WHERE id = ?`,
|
|
2174
|
+
`SELECT id FROM ${quoteIdent7(`_kora_ops_${collection}`)} WHERE id = ?`,
|
|
2166
2175
|
[op.id]
|
|
2167
2176
|
);
|
|
2168
2177
|
if (existing.length > 0) {
|
|
@@ -2267,7 +2276,7 @@ var Store = class {
|
|
|
2267
2276
|
const serializedChanges = serializeRecord(materializeSource, definition.fields);
|
|
2268
2277
|
const changedFields = Object.keys(serializedChanges);
|
|
2269
2278
|
const currentRows = await tx.query(
|
|
2270
|
-
`SELECT _version, _field_versions FROM ${collection} WHERE id = ?`,
|
|
2279
|
+
`SELECT _version, _field_versions FROM ${quoteIdent7(collection)} WHERE id = ?`,
|
|
2271
2280
|
[op.recordId]
|
|
2272
2281
|
);
|
|
2273
2282
|
const currentRow = currentRows[0];
|
|
@@ -2363,7 +2372,7 @@ var Store = class {
|
|
|
2363
2372
|
*/
|
|
2364
2373
|
async foldOrphanedOperations(tx, collection, definition, recordId) {
|
|
2365
2374
|
const orphanRows = await tx.query(
|
|
2366
|
-
`SELECT * FROM _kora_ops_${collection} WHERE record_id = ? AND type IN ('update', 'delete')`,
|
|
2375
|
+
`SELECT * FROM ${quoteIdent7(`_kora_ops_${collection}`)} WHERE record_id = ? AND type IN ('update', 'delete')`,
|
|
2367
2376
|
[recordId]
|
|
2368
2377
|
);
|
|
2369
2378
|
if (orphanRows.length === 0) {
|
|
@@ -2376,7 +2385,7 @@ var Store = class {
|
|
|
2376
2385
|
if (orphan.type === "update" && orphan.data) {
|
|
2377
2386
|
const orphanChanges = serializeRecord(orphan.data, definition.fields);
|
|
2378
2387
|
const rows = await tx.query(
|
|
2379
|
-
`SELECT _version, _field_versions FROM ${collection} WHERE id = ?`,
|
|
2388
|
+
`SELECT _version, _field_versions FROM ${quoteIdent7(collection)} WHERE id = ?`,
|
|
2380
2389
|
[recordId]
|
|
2381
2390
|
);
|
|
2382
2391
|
const current = rows[0];
|
|
@@ -2426,7 +2435,7 @@ var Store = class {
|
|
|
2426
2435
|
const allOps = [];
|
|
2427
2436
|
for (const collectionName of Object.keys(this.schema.collections)) {
|
|
2428
2437
|
const rows = await this.adapter.query(
|
|
2429
|
-
`SELECT * FROM _kora_ops_${collectionName} WHERE node_id = ? AND sequence_number >= ? AND sequence_number <= ? ORDER BY sequence_number ASC`,
|
|
2438
|
+
`SELECT * FROM ${quoteIdent7(`_kora_ops_${collectionName}`)} WHERE node_id = ? AND sequence_number >= ? AND sequence_number <= ? ORDER BY sequence_number ASC`,
|
|
2430
2439
|
[nodeId, fromSeq, toSeq]
|
|
2431
2440
|
);
|
|
2432
2441
|
for (const row of rows) {
|
|
@@ -2445,7 +2454,7 @@ var Store = class {
|
|
|
2445
2454
|
const allOps = [];
|
|
2446
2455
|
for (const collectionName of Object.keys(this.schema.collections)) {
|
|
2447
2456
|
const rows = await this.adapter.query(
|
|
2448
|
-
`SELECT * FROM _kora_ops_${collectionName} ORDER BY sequence_number ASC`
|
|
2457
|
+
`SELECT * FROM ${quoteIdent7(`_kora_ops_${collectionName}`)} ORDER BY sequence_number ASC`
|
|
2449
2458
|
);
|
|
2450
2459
|
for (const row of rows) {
|
|
2451
2460
|
allOps.push(deserializeOperationWithCollection(row, collectionName));
|
|
@@ -2496,7 +2505,7 @@ var Store = class {
|
|
|
2496
2505
|
*/
|
|
2497
2506
|
async exportAudit(options) {
|
|
2498
2507
|
this.ensureOpen();
|
|
2499
|
-
const { exportAudit: doExport } = await import("./export-audit-
|
|
2508
|
+
const { exportAudit: doExport } = await import("./export-audit-MT2LTMIN.js");
|
|
2500
2509
|
return doExport(this.adapter, this.schema, this.nodeId, this.schema.version, options);
|
|
2501
2510
|
}
|
|
2502
2511
|
/**
|
|
@@ -2555,7 +2564,7 @@ var Store = class {
|
|
|
2555
2564
|
return null;
|
|
2556
2565
|
}
|
|
2557
2566
|
const rows = await this.adapter.query(
|
|
2558
|
-
`SELECT * FROM ${collection} WHERE id = ?`,
|
|
2567
|
+
`SELECT * FROM ${quoteIdent7(collection)} WHERE id = ?`,
|
|
2559
2568
|
[recordId]
|
|
2560
2569
|
);
|
|
2561
2570
|
const row = rows[0];
|
|
@@ -2580,7 +2589,7 @@ var Store = class {
|
|
|
2580
2589
|
return null;
|
|
2581
2590
|
}
|
|
2582
2591
|
const rows = await this.adapter.query(
|
|
2583
|
-
`SELECT _version, _field_versions FROM ${collection} WHERE id = ?`,
|
|
2592
|
+
`SELECT _version, _field_versions FROM ${quoteIdent7(collection)} WHERE id = ?`,
|
|
2584
2593
|
[recordId]
|
|
2585
2594
|
);
|
|
2586
2595
|
const row = rows[0];
|
|
@@ -2686,7 +2695,7 @@ var Store = class {
|
|
|
2686
2695
|
async getLatestLocalOperationForRecord(collection, recordId) {
|
|
2687
2696
|
this.ensureOpen();
|
|
2688
2697
|
const rows = await this.adapter.query(
|
|
2689
|
-
`SELECT * FROM _kora_ops_${collection} WHERE node_id = ? AND record_id = ? ORDER BY sequence_number DESC LIMIT 1`,
|
|
2698
|
+
`SELECT * FROM ${quoteIdent7(`_kora_ops_${collection}`)} WHERE node_id = ? AND record_id = ? ORDER BY sequence_number DESC LIMIT 1`,
|
|
2690
2699
|
[this.nodeId, recordId]
|
|
2691
2700
|
);
|
|
2692
2701
|
const row = rows[0];
|
|
@@ -2701,7 +2710,7 @@ var Store = class {
|
|
|
2701
2710
|
async getLatestOperationForRecord(collection, recordId) {
|
|
2702
2711
|
this.ensureOpen();
|
|
2703
2712
|
const rows = await this.adapter.query(
|
|
2704
|
-
`SELECT * FROM _kora_ops_${collection} WHERE record_id = ?`,
|
|
2713
|
+
`SELECT * FROM ${quoteIdent7(`_kora_ops_${collection}`)} WHERE record_id = ?`,
|
|
2705
2714
|
[recordId]
|
|
2706
2715
|
);
|
|
2707
2716
|
let latest = null;
|
|
@@ -2791,7 +2800,7 @@ var Store = class {
|
|
|
2791
2800
|
*/
|
|
2792
2801
|
async exportBackup(options) {
|
|
2793
2802
|
this.ensureOpen();
|
|
2794
|
-
const { exportBackup: doExport } = await import("./backup-
|
|
2803
|
+
const { exportBackup: doExport } = await import("./backup-IQE4QC7Q.js");
|
|
2795
2804
|
return doExport(this.adapter, this.schema, this.nodeId, this.schema.version, options);
|
|
2796
2805
|
}
|
|
2797
2806
|
/**
|
|
@@ -2803,7 +2812,7 @@ var Store = class {
|
|
|
2803
2812
|
*/
|
|
2804
2813
|
async importBackup(data, options) {
|
|
2805
2814
|
this.ensureOpen();
|
|
2806
|
-
const { restoreBackup: doRestore } = await import("./backup-
|
|
2815
|
+
const { restoreBackup: doRestore } = await import("./backup-IQE4QC7Q.js");
|
|
2807
2816
|
return doRestore(this.adapter, this.schema, data, options);
|
|
2808
2817
|
}
|
|
2809
2818
|
/**
|
|
@@ -2888,14 +2897,14 @@ var Store = class {
|
|
|
2888
2897
|
*/
|
|
2889
2898
|
async runBackfill(collection, transform) {
|
|
2890
2899
|
const rows = await this.adapter.query(
|
|
2891
|
-
`SELECT * FROM ${collection} WHERE _deleted = 0`
|
|
2900
|
+
`SELECT * FROM ${quoteIdent7(collection)} WHERE _deleted = 0`
|
|
2892
2901
|
);
|
|
2893
2902
|
await this.adapter.transaction(async (tx) => {
|
|
2894
2903
|
for (const row of rows) {
|
|
2895
2904
|
const updates = transform(row);
|
|
2896
2905
|
const fields = Object.keys(updates);
|
|
2897
2906
|
if (fields.length === 0) continue;
|
|
2898
|
-
const setClauses = fields.map((f) => `${f} = ?`).join(", ");
|
|
2907
|
+
const setClauses = fields.map((f) => `${quoteIdent7(f)} = ?`).join(", ");
|
|
2899
2908
|
const values = fields.map((f) => {
|
|
2900
2909
|
const val = updates[f];
|
|
2901
2910
|
if (typeof val === "boolean") return val ? 1 : 0;
|
|
@@ -2905,7 +2914,7 @@ var Store = class {
|
|
|
2905
2914
|
return val;
|
|
2906
2915
|
});
|
|
2907
2916
|
values.push(row.id);
|
|
2908
|
-
await tx.execute(`UPDATE ${collection} SET ${setClauses} WHERE id = ?`, values);
|
|
2917
|
+
await tx.execute(`UPDATE ${quoteIdent7(collection)} SET ${setClauses} WHERE id = ?`, values);
|
|
2909
2918
|
}
|
|
2910
2919
|
});
|
|
2911
2920
|
}
|
|
@@ -3944,6 +3953,7 @@ export {
|
|
|
3944
3953
|
InvalidStateTransitionError,
|
|
3945
3954
|
LAST_ACKED_SERVER_VECTOR_META_KEY,
|
|
3946
3955
|
MemoryBlobStore,
|
|
3956
|
+
NoLeaderError,
|
|
3947
3957
|
OpfsBlobStore,
|
|
3948
3958
|
OptimisticLockError,
|
|
3949
3959
|
PersistenceError,
|