@sqlite-sync/core 0.1.1 → 0.3.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.
- package/dist/{chunk-UGF5IU53.js → chunk-NHT3ELMN.js} +34 -6
- package/dist/chunk-NHT3ELMN.js.map +1 -0
- package/dist/{chunk-627DSM2Q.js → chunk-RKBTBPNC.js} +566 -177
- package/dist/chunk-RKBTBPNC.js.map +1 -0
- package/dist/{crdt-sync-remote-source-idoIjMcs.d.ts → crdt-sync-remote-source-Da77s4k0.d.ts} +131 -46
- package/dist/index.d.ts +66 -34
- package/dist/index.js +158 -98
- package/dist/index.js.map +1 -1
- package/dist/{crdt-schema-DQ1cYsFE.d.ts → reset-state-0LGwO78x.d.ts} +20 -2
- package/dist/server.d.ts +9 -2
- package/dist/server.js +2 -2
- package/dist/server.js.map +1 -1
- package/dist/worker.d.ts +11 -3
- package/dist/worker.js +119 -89
- package/dist/worker.js.map +1 -1
- package/package.json +7 -3
- package/dist/chunk-627DSM2Q.js.map +0 -1
- package/dist/chunk-UGF5IU53.js.map +0 -1
|
@@ -13,14 +13,15 @@ function createDeferredPromise(opts) {
|
|
|
13
13
|
_reject(reason);
|
|
14
14
|
};
|
|
15
15
|
if (opts?.timeout) {
|
|
16
|
-
timeoutId = setTimeout(
|
|
17
|
-
_reject(new Error(`Promise timed out after ${opts.timeout}ms`));
|
|
18
|
-
tryCatch(() => opts?.onTimeout?.());
|
|
19
|
-
}, opts.timeout);
|
|
16
|
+
timeoutId = setTimeout(rejectTimeout, opts.timeout, _reject, opts);
|
|
20
17
|
}
|
|
21
18
|
});
|
|
22
19
|
return { promise, resolve, reject };
|
|
23
20
|
}
|
|
21
|
+
function rejectTimeout(reject, opts) {
|
|
22
|
+
reject(new Error(`Promise timed out after ${opts.timeout}ms`));
|
|
23
|
+
tryCatch(() => opts?.onTimeout?.());
|
|
24
|
+
}
|
|
24
25
|
var generateId = () => {
|
|
25
26
|
return crypto.randomUUID();
|
|
26
27
|
};
|
|
@@ -71,6 +72,11 @@ var createTypedEventTarget = () => {
|
|
|
71
72
|
const eventTarget = new EventTarget();
|
|
72
73
|
const addEventListener = (type, listener) => {
|
|
73
74
|
eventTarget.addEventListener(type, listener);
|
|
75
|
+
return {
|
|
76
|
+
unsubscribe: () => {
|
|
77
|
+
eventTarget.removeEventListener(type, listener);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
74
80
|
};
|
|
75
81
|
const removeEventListener = (type, listener) => {
|
|
76
82
|
eventTarget.removeEventListener(type, listener);
|
|
@@ -116,6 +122,26 @@ function jsonSafeParse(json) {
|
|
|
116
122
|
function quoteId(name) {
|
|
117
123
|
return name.split(".").map((s) => `"${s.replace(/"/g, '""')}"`).join(".");
|
|
118
124
|
}
|
|
125
|
+
function noop(..._args) {
|
|
126
|
+
}
|
|
127
|
+
function parseTableName(tableName) {
|
|
128
|
+
if (!tableName?.trim()) {
|
|
129
|
+
throw new Error("Parse table: missing table name");
|
|
130
|
+
}
|
|
131
|
+
const parts = tableName.split(".");
|
|
132
|
+
if (parts.length > 2) {
|
|
133
|
+
throw new Error("Parse table: too many dot-delimited segments in table name");
|
|
134
|
+
}
|
|
135
|
+
return parts.length === 1 ? {
|
|
136
|
+
schema: "main",
|
|
137
|
+
table: parts[0],
|
|
138
|
+
fullIdentifier: parts[0]
|
|
139
|
+
} : {
|
|
140
|
+
schema: parts[0],
|
|
141
|
+
table: parts[1],
|
|
142
|
+
fullIdentifier: `${parts[0]}.${parts[1]}`
|
|
143
|
+
};
|
|
144
|
+
}
|
|
119
145
|
|
|
120
146
|
export {
|
|
121
147
|
createDeferredPromise,
|
|
@@ -127,6 +153,8 @@ export {
|
|
|
127
153
|
tryCatch,
|
|
128
154
|
tryCatchAsync,
|
|
129
155
|
jsonSafeParse,
|
|
130
|
-
quoteId
|
|
156
|
+
quoteId,
|
|
157
|
+
noop,
|
|
158
|
+
parseTableName
|
|
131
159
|
};
|
|
132
|
-
//# sourceMappingURL=chunk-
|
|
160
|
+
//# sourceMappingURL=chunk-NHT3ELMN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts"],"sourcesContent":["export type DeferredPromise<T> = {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n};\n\ntype DeferredPromiseOptions = {\n timeout?: number;\n onTimeout?: () => void;\n};\n\nexport function createDeferredPromise<T>(opts?: DeferredPromiseOptions): DeferredPromise<T> {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const promise = new Promise<T>((_resolve, _reject) => {\n resolve = (value) => {\n if (timeoutId) clearTimeout(timeoutId);\n _resolve(value);\n };\n reject = (reason) => {\n if (timeoutId) clearTimeout(timeoutId);\n _reject(reason);\n };\n\n if (opts?.timeout) {\n timeoutId = setTimeout(rejectTimeout, opts.timeout, _reject, opts);\n }\n });\n\n return { promise, resolve, reject };\n}\n\nfunction rejectTimeout(reject: (reason?: unknown) => void, opts: DeferredPromiseOptions) {\n reject(new Error(`Promise timed out after ${opts.timeout}ms`));\n tryCatch(() => opts?.onTimeout?.());\n}\n\nexport const generateId = () => {\n return crypto.randomUUID();\n};\n\nexport type DistributiveOmit<T, K extends keyof T> = T extends any ? Omit<T, K> : never;\n\nexport function ensureSingletonExecution<T, TArgs extends any[]>(\n fn: (...args: TArgs) => Promise<T>,\n opts: { queueReExecution?: boolean } = { queueReExecution: true },\n) {\n let executingPromise: Promise<T> | null = null;\n let shouldReExecute = false;\n\n const wrappedFn = (...args: TArgs) => {\n if (executingPromise) {\n shouldReExecute = true;\n return executingPromise;\n }\n\n executingPromise = fn(...args).finally(() => {\n executingPromise = null;\n\n if (shouldReExecute && opts?.queueReExecution) {\n shouldReExecute = false;\n wrappedFn(...args);\n }\n });\n return executingPromise;\n };\n\n wrappedFn.promise = () => executingPromise;\n wrappedFn.isExecuting = () => !!executingPromise;\n\n return wrappedFn;\n}\n\nexport function createAutoFlushBuffer<T>({ size, flush }: { size: number; flush: (items: T[]) => void }) {\n const buffer: T[] = [];\n\n return {\n add(item: T) {\n buffer.push(item);\n if (buffer.length >= size) {\n flush(buffer);\n buffer.length = 0;\n }\n },\n flush() {\n flush(buffer);\n buffer.length = 0;\n },\n };\n}\n\nexport function createAsyncAutoFlushBuffer<T>({\n size,\n flush,\n}: {\n size: number;\n flush: (items: T[]) => void | Promise<void>;\n}) {\n const buffer: T[] = [];\n\n return {\n async add(item: T) {\n buffer.push(item);\n if (buffer.length >= size) {\n await this.flush();\n }\n },\n async flush() {\n const itemsToFlush = buffer.splice(0);\n if (itemsToFlush.length === 0) {\n return;\n }\n await flush(itemsToFlush);\n },\n };\n}\n\nexport class TypedBroadcastChannel<TMessage> {\n private readonly channel: BroadcastChannel;\n\n constructor(name: string) {\n this.channel = new BroadcastChannel(name);\n }\n\n postMessage(message: TMessage) {\n this.channel.postMessage(message);\n }\n\n set onmessage(callback: ((event: MessageEvent<TMessage>) => void) | null) {\n this.channel.onmessage = callback;\n }\n\n close() {\n this.channel.close();\n }\n}\n\nexport class TypedEvent<T = unknown> extends Event {\n readonly payload: T;\n constructor(type: string, payload: T) {\n super(type);\n this.payload = payload;\n }\n}\n\nexport type TypedEventTarget<T extends Record<string, unknown>> = {\n addEventListener: <K extends keyof T & string>(\n type: K,\n listener: (event: TypedEvent<T[K]>) => void,\n ) => { unsubscribe: () => void };\n removeEventListener: <K extends keyof T & string>(type: K, listener: (event: TypedEvent<T[K]>) => void) => void;\n dispatchEvent: <K extends keyof T & string>(type: K, payload: T[K]) => void;\n};\n\nexport const createTypedEventTarget = <T extends Record<string, unknown>>(): TypedEventTarget<T> => {\n const eventTarget = new EventTarget();\n\n const addEventListener = <K extends keyof T & string>(type: K, listener: (event: TypedEvent<T[K]>) => void) => {\n eventTarget.addEventListener(type, listener as (e: Event) => void);\n\n return {\n unsubscribe: () => {\n eventTarget.removeEventListener(type, listener as (e: Event) => void);\n },\n };\n };\n\n const removeEventListener = <K extends keyof T & string>(type: K, listener: (event: TypedEvent<T[K]>) => void) => {\n eventTarget.removeEventListener(type, listener as (e: Event) => void);\n };\n\n const dispatchEvent = <K extends keyof T & string>(type: K, payload: T[K]) => {\n eventTarget.dispatchEvent(new TypedEvent(type, payload));\n };\n\n return {\n addEventListener,\n removeEventListener,\n dispatchEvent,\n };\n};\n\ntype TryCatchResult<T> =\n | {\n success: true;\n data: T;\n }\n | {\n success: false;\n error: unknown;\n };\n\nexport function tryCatch<T>(fn: () => T): TryCatchResult<T> {\n try {\n return {\n success: true,\n data: fn(),\n };\n } catch (error) {\n return {\n success: false,\n error,\n };\n }\n}\n\nexport async function tryCatchAsync<T>(fn: () => Promise<T>): Promise<TryCatchResult<T>> {\n try {\n return {\n success: true,\n data: await fn(),\n };\n } catch (error) {\n return {\n success: false,\n error,\n };\n }\n}\n\nexport function jsonSafeParse<T>(json: string) {\n return tryCatch(() => JSON.parse(json) as T);\n}\n\n/** Quote a SQLite identifier (table/column name), handling dot-separated schema qualifiers. */\nexport function quoteId(name: string): string {\n return name\n .split(\".\")\n .map((s) => `\"${s.replace(/\"/g, '\"\"')}\"`)\n .join(\".\");\n}\n\nexport function noop(..._args: unknown[]): void {}\n\nexport type ParsedTableName = {\n schema: \"main\" | (string & {});\n table: string;\n fullIdentifier: string;\n};\n\nexport function parseTableName(tableName: string): ParsedTableName {\n if (!tableName?.trim()) {\n throw new Error(\"Parse table: missing table name\");\n }\n const parts = tableName.split(\".\");\n if (parts.length > 2) {\n throw new Error(\"Parse table: too many dot-delimited segments in table name\");\n }\n\n return parts.length === 1\n ? {\n schema: \"main\",\n table: parts[0],\n fullIdentifier: parts[0],\n }\n : {\n schema: parts[0],\n table: parts[1],\n fullIdentifier: `${parts[0]}.${parts[1]}`,\n };\n}\n"],"mappings":"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","names":[]}
|