@syncular/core 0.0.1-100

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 (99) hide show
  1. package/dist/blobs.d.ts +146 -0
  2. package/dist/blobs.d.ts.map +1 -0
  3. package/dist/blobs.js +47 -0
  4. package/dist/blobs.js.map +1 -0
  5. package/dist/conflict.d.ts +22 -0
  6. package/dist/conflict.d.ts.map +1 -0
  7. package/dist/conflict.js +81 -0
  8. package/dist/conflict.js.map +1 -0
  9. package/dist/index.d.ts +24 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +36 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/kysely-serialize.d.ts +22 -0
  14. package/dist/kysely-serialize.d.ts.map +1 -0
  15. package/dist/kysely-serialize.js +147 -0
  16. package/dist/kysely-serialize.js.map +1 -0
  17. package/dist/logger.d.ts +29 -0
  18. package/dist/logger.d.ts.map +1 -0
  19. package/dist/logger.js +26 -0
  20. package/dist/logger.js.map +1 -0
  21. package/dist/proxy/index.d.ts +5 -0
  22. package/dist/proxy/index.d.ts.map +1 -0
  23. package/dist/proxy/index.js +5 -0
  24. package/dist/proxy/index.js.map +1 -0
  25. package/dist/proxy/types.d.ts +54 -0
  26. package/dist/proxy/types.d.ts.map +1 -0
  27. package/dist/proxy/types.js +7 -0
  28. package/dist/proxy/types.js.map +1 -0
  29. package/dist/schemas/blobs.d.ts +76 -0
  30. package/dist/schemas/blobs.d.ts.map +1 -0
  31. package/dist/schemas/blobs.js +63 -0
  32. package/dist/schemas/blobs.js.map +1 -0
  33. package/dist/schemas/common.d.ts +28 -0
  34. package/dist/schemas/common.d.ts.map +1 -0
  35. package/dist/schemas/common.js +26 -0
  36. package/dist/schemas/common.js.map +1 -0
  37. package/dist/schemas/index.d.ts +7 -0
  38. package/dist/schemas/index.d.ts.map +1 -0
  39. package/dist/schemas/index.js +7 -0
  40. package/dist/schemas/index.js.map +1 -0
  41. package/dist/schemas/sync.d.ts +391 -0
  42. package/dist/schemas/sync.d.ts.map +1 -0
  43. package/dist/schemas/sync.js +157 -0
  44. package/dist/schemas/sync.js.map +1 -0
  45. package/dist/scopes/index.d.ts +65 -0
  46. package/dist/scopes/index.d.ts.map +1 -0
  47. package/dist/scopes/index.js +67 -0
  48. package/dist/scopes/index.js.map +1 -0
  49. package/dist/snapshot-chunks.d.ts +26 -0
  50. package/dist/snapshot-chunks.d.ts.map +1 -0
  51. package/dist/snapshot-chunks.js +89 -0
  52. package/dist/snapshot-chunks.js.map +1 -0
  53. package/dist/telemetry.d.ts +114 -0
  54. package/dist/telemetry.d.ts.map +1 -0
  55. package/dist/telemetry.js +113 -0
  56. package/dist/telemetry.js.map +1 -0
  57. package/dist/transforms.d.ts +146 -0
  58. package/dist/transforms.d.ts.map +1 -0
  59. package/dist/transforms.js +155 -0
  60. package/dist/transforms.js.map +1 -0
  61. package/dist/types.d.ts +129 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/dist/types.js +20 -0
  64. package/dist/types.js.map +1 -0
  65. package/dist/utils/id.d.ts +2 -0
  66. package/dist/utils/id.d.ts.map +1 -0
  67. package/dist/utils/id.js +8 -0
  68. package/dist/utils/id.js.map +1 -0
  69. package/dist/utils/index.d.ts +3 -0
  70. package/dist/utils/index.d.ts.map +1 -0
  71. package/dist/utils/index.js +3 -0
  72. package/dist/utils/index.js.map +1 -0
  73. package/dist/utils/object.d.ts +2 -0
  74. package/dist/utils/object.d.ts.map +1 -0
  75. package/dist/utils/object.js +4 -0
  76. package/dist/utils/object.js.map +1 -0
  77. package/package.json +57 -0
  78. package/src/__tests__/conflict.test.ts +325 -0
  79. package/src/__tests__/telemetry.test.ts +170 -0
  80. package/src/__tests__/utils.test.ts +27 -0
  81. package/src/blobs.ts +202 -0
  82. package/src/conflict.ts +92 -0
  83. package/src/index.ts +36 -0
  84. package/src/kysely-serialize.ts +214 -0
  85. package/src/logger.ts +38 -0
  86. package/src/proxy/index.ts +10 -0
  87. package/src/proxy/types.ts +57 -0
  88. package/src/schemas/blobs.ts +101 -0
  89. package/src/schemas/common.ts +45 -0
  90. package/src/schemas/index.ts +7 -0
  91. package/src/schemas/sync.ts +226 -0
  92. package/src/scopes/index.ts +122 -0
  93. package/src/snapshot-chunks.ts +112 -0
  94. package/src/telemetry.ts +238 -0
  95. package/src/transforms.ts +256 -0
  96. package/src/types.ts +158 -0
  97. package/src/utils/id.ts +7 -0
  98. package/src/utils/index.ts +2 -0
  99. package/src/utils/object.ts +3 -0
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @syncular/core - Scope types, patterns, and utilities
3
+ *
4
+ * Scope patterns define how data is partitioned for sync.
5
+ * Scopes are stored as JSONB on changes for flexible filtering.
6
+ * Patterns use `{placeholder}` syntax to extract or inject values.
7
+ */
8
+ // ── Pattern parsing (internal helpers) ───────────────────────────────
9
+ /**
10
+ * Extract the placeholder name from a pattern.
11
+ * Returns null if the pattern doesn't contain a valid placeholder.
12
+ */
13
+ function extractPlaceholder(pattern) {
14
+ const match = pattern.match(/^(.*?)\{(\w+)\}(.*)$/);
15
+ if (!match)
16
+ return null;
17
+ return {
18
+ prefix: match[1],
19
+ placeholder: match[2],
20
+ suffix: match[3],
21
+ };
22
+ }
23
+ /**
24
+ * Extract the placeholder name from a pattern.
25
+ */
26
+ function getPlaceholderName(pattern) {
27
+ const parsed = extractPlaceholder(pattern);
28
+ return parsed?.placeholder ?? null;
29
+ }
30
+ /**
31
+ * Normalize scope definitions to a pattern-to-column map.
32
+ *
33
+ * @example
34
+ * normalizeScopes(['user:{user_id}'])
35
+ * // → { 'user:{user_id}': 'user_id' }
36
+ */
37
+ export function normalizeScopes(scopes) {
38
+ const result = {};
39
+ for (const scope of scopes) {
40
+ if (typeof scope === 'string') {
41
+ const placeholder = getPlaceholderName(scope);
42
+ if (!placeholder) {
43
+ throw new Error(`Scope pattern "${scope}" must contain a placeholder like {column_name}`);
44
+ }
45
+ result[scope] = placeholder;
46
+ }
47
+ else {
48
+ result[scope.pattern] = scope.column;
49
+ }
50
+ }
51
+ return result;
52
+ }
53
+ // ── Value operations (public) ────────────────────────────────────────
54
+ /**
55
+ * Extract variable names from a scope pattern.
56
+ *
57
+ * @example
58
+ * extractScopeVars('project:{project_id}') // ['project_id']
59
+ * extractScopeVars('event_date:{year}:{month}') // ['year', 'month']
60
+ */
61
+ export function extractScopeVars(pattern) {
62
+ const matches = pattern.match(/\{([^}]+)\}/g);
63
+ if (!matches)
64
+ return [];
65
+ return matches.map((m) => m.slice(1, -1));
66
+ }
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scopes/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA8CH,0IAAwE;AAExE;;;GAGG;AACH,SAAS,kBAAkB,CAAC,OAAe,EAIlC;IACP,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE;QACjB,WAAW,EAAE,KAAK,CAAC,CAAC,CAAE;QACtB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE;KAClB,CAAC;AAAA,CACH;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAe,EAAiB;IAC1D,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,MAAM,EAAE,WAAW,IAAI,IAAI,CAAC;AAAA,CACpC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAyB,EACD;IACxB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CACb,kBAAkB,KAAK,iDAAiD,CACzE,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QACvC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAAA,CACf;AAED,4JAAwE;AAExE;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAqB,EAAY;IAChE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC9C,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAAA,CAC3C"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @syncular/core - Snapshot chunk encoding helpers
3
+ */
4
+ export declare const SYNC_SNAPSHOT_CHUNK_ENCODING = "json-row-frame-v1";
5
+ export type SyncSnapshotChunkEncoding = typeof SYNC_SNAPSHOT_CHUNK_ENCODING;
6
+ export declare const SYNC_SNAPSHOT_CHUNK_COMPRESSION = "gzip";
7
+ export type SyncSnapshotChunkCompression = typeof SYNC_SNAPSHOT_CHUNK_COMPRESSION;
8
+ /**
9
+ * Encode rows as framed JSON bytes without the format header.
10
+ */
11
+ export declare function encodeSnapshotRowFrames(rows: readonly unknown[]): Uint8Array;
12
+ /**
13
+ * Encode rows as framed JSON bytes with a format header.
14
+ *
15
+ * Format:
16
+ * - 4-byte magic header ("SRF1")
17
+ * - repeated frames of:
18
+ * - 4-byte big-endian payload byte length
19
+ * - UTF-8 JSON payload
20
+ */
21
+ export declare function encodeSnapshotRows(rows: readonly unknown[]): Uint8Array;
22
+ /**
23
+ * Decode framed JSON bytes into rows.
24
+ */
25
+ export declare function decodeSnapshotRows(bytes: Uint8Array): unknown[];
26
+ //# sourceMappingURL=snapshot-chunks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-chunks.d.ts","sourceRoot":"","sources":["../src/snapshot-chunks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,4BAA4B,sBAAsB,CAAC;AAChE,MAAM,MAAM,yBAAyB,GAAG,OAAO,4BAA4B,CAAC;AAE5E,eAAO,MAAM,+BAA+B,SAAS,CAAC;AACtD,MAAM,MAAM,4BAA4B,GACtC,OAAO,+BAA+B,CAAC;AAWzC;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,UAAU,CA2B5E;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,UAAU,CASvE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,EAAE,CAoC/D"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * @syncular/core - Snapshot chunk encoding helpers
3
+ */
4
+ export const SYNC_SNAPSHOT_CHUNK_ENCODING = 'json-row-frame-v1';
5
+ export const SYNC_SNAPSHOT_CHUNK_COMPRESSION = 'gzip';
6
+ const SNAPSHOT_ROW_FRAME_MAGIC = new Uint8Array([0x53, 0x52, 0x46, 0x31]); // "SRF1"
7
+ const FRAME_LENGTH_BYTES = 4;
8
+ const MAX_FRAME_BYTE_LENGTH = 0xffff_ffff;
9
+ function normalizeRowJson(row) {
10
+ const serialized = JSON.stringify(row);
11
+ return serialized === undefined ? 'null' : serialized;
12
+ }
13
+ /**
14
+ * Encode rows as framed JSON bytes without the format header.
15
+ */
16
+ export function encodeSnapshotRowFrames(rows) {
17
+ const encoder = new TextEncoder();
18
+ const payloads = [];
19
+ let totalByteLength = 0;
20
+ for (const row of rows) {
21
+ const payload = encoder.encode(normalizeRowJson(row));
22
+ if (payload.length > MAX_FRAME_BYTE_LENGTH) {
23
+ throw new Error(`Snapshot row payload exceeds ${MAX_FRAME_BYTE_LENGTH} bytes`);
24
+ }
25
+ payloads.push(payload);
26
+ totalByteLength += FRAME_LENGTH_BYTES + payload.length;
27
+ }
28
+ const encoded = new Uint8Array(totalByteLength);
29
+ const view = new DataView(encoded.buffer, encoded.byteOffset, encoded.length);
30
+ let offset = 0;
31
+ for (const payload of payloads) {
32
+ view.setUint32(offset, payload.length, false);
33
+ offset += FRAME_LENGTH_BYTES;
34
+ encoded.set(payload, offset);
35
+ offset += payload.length;
36
+ }
37
+ return encoded;
38
+ }
39
+ /**
40
+ * Encode rows as framed JSON bytes with a format header.
41
+ *
42
+ * Format:
43
+ * - 4-byte magic header ("SRF1")
44
+ * - repeated frames of:
45
+ * - 4-byte big-endian payload byte length
46
+ * - UTF-8 JSON payload
47
+ */
48
+ export function encodeSnapshotRows(rows) {
49
+ const framedRows = encodeSnapshotRowFrames(rows);
50
+ const totalByteLength = SNAPSHOT_ROW_FRAME_MAGIC.length + framedRows.length;
51
+ const encoded = new Uint8Array(totalByteLength);
52
+ encoded.set(SNAPSHOT_ROW_FRAME_MAGIC, 0);
53
+ encoded.set(framedRows, SNAPSHOT_ROW_FRAME_MAGIC.length);
54
+ return encoded;
55
+ }
56
+ /**
57
+ * Decode framed JSON bytes into rows.
58
+ */
59
+ export function decodeSnapshotRows(bytes) {
60
+ if (bytes.length < SNAPSHOT_ROW_FRAME_MAGIC.length) {
61
+ throw new Error('Snapshot chunk payload is too small');
62
+ }
63
+ for (let index = 0; index < SNAPSHOT_ROW_FRAME_MAGIC.length; index += 1) {
64
+ const expected = SNAPSHOT_ROW_FRAME_MAGIC[index];
65
+ const actual = bytes[index];
66
+ if (actual !== expected) {
67
+ throw new Error('Unexpected snapshot chunk format');
68
+ }
69
+ }
70
+ const rows = [];
71
+ const decoder = new TextDecoder();
72
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.length);
73
+ let offset = SNAPSHOT_ROW_FRAME_MAGIC.length;
74
+ while (offset < bytes.length) {
75
+ if (offset + FRAME_LENGTH_BYTES > bytes.length) {
76
+ throw new Error('Snapshot chunk payload ended mid-frame header');
77
+ }
78
+ const payloadLength = view.getUint32(offset, false);
79
+ offset += FRAME_LENGTH_BYTES;
80
+ if (offset + payloadLength > bytes.length) {
81
+ throw new Error('Snapshot chunk payload ended mid-frame body');
82
+ }
83
+ const payload = bytes.subarray(offset, offset + payloadLength);
84
+ offset += payloadLength;
85
+ rows.push(JSON.parse(decoder.decode(payload)));
86
+ }
87
+ return rows;
88
+ }
89
+ //# sourceMappingURL=snapshot-chunks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-chunks.js","sourceRoot":"","sources":["../src/snapshot-chunks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * @syncular/core - Runtime telemetry abstraction
3
+ *
4
+ * Provides vendor-neutral logging, tracing, and metrics interfaces so
5
+ * Syncular libraries can emit telemetry without coupling to a specific SDK.
6
+ */
7
+ /**
8
+ * Supported log levels.
9
+ */
10
+ export type SyncTelemetryLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
11
+ /**
12
+ * Primitive attribute value used by traces and metrics.
13
+ */
14
+ export type SyncTelemetryAttributeValue = string | number | boolean;
15
+ /**
16
+ * Attribute bag used by traces and metrics.
17
+ */
18
+ export type SyncTelemetryAttributes = Record<string, SyncTelemetryAttributeValue>;
19
+ /**
20
+ * Structured sync log event.
21
+ */
22
+ export interface SyncTelemetryEvent {
23
+ event: string;
24
+ level?: SyncTelemetryLevel;
25
+ userId?: string;
26
+ durationMs?: number;
27
+ rowCount?: number;
28
+ resetRequired?: boolean;
29
+ error?: string;
30
+ [key: string]: unknown;
31
+ }
32
+ /**
33
+ * Span creation options.
34
+ */
35
+ export interface SyncSpanOptions {
36
+ name: string;
37
+ op?: string;
38
+ attributes?: SyncTelemetryAttributes;
39
+ }
40
+ /**
41
+ * Span API exposed to Syncular internals.
42
+ */
43
+ export interface SyncSpan {
44
+ setAttribute(name: string, value: SyncTelemetryAttributeValue): void;
45
+ setAttributes(attributes: SyncTelemetryAttributes): void;
46
+ setStatus(status: 'ok' | 'error'): void;
47
+ }
48
+ /**
49
+ * Tracing interface.
50
+ */
51
+ export interface SyncTracer {
52
+ startSpan<T>(options: SyncSpanOptions, callback: (span: SyncSpan) => T): T;
53
+ }
54
+ /**
55
+ * Metric record options.
56
+ */
57
+ export interface SyncMetricOptions {
58
+ attributes?: SyncTelemetryAttributes;
59
+ unit?: string;
60
+ }
61
+ /**
62
+ * Metrics interface.
63
+ */
64
+ export interface SyncMetrics {
65
+ count(name: string, value?: number, options?: SyncMetricOptions): void;
66
+ gauge(name: string, value: number, options?: SyncMetricOptions): void;
67
+ distribution(name: string, value: number, options?: SyncMetricOptions): void;
68
+ }
69
+ /**
70
+ * Unified telemetry interface.
71
+ */
72
+ export interface SyncTelemetry {
73
+ log(event: SyncTelemetryEvent): void;
74
+ tracer: SyncTracer;
75
+ metrics: SyncMetrics;
76
+ captureException(error: unknown, context?: Record<string, unknown>): void;
77
+ }
78
+ /**
79
+ * Create console-backed default telemetry (logs only; no-op tracing/metrics).
80
+ */
81
+ export declare function createDefaultSyncTelemetry(): SyncTelemetry;
82
+ /**
83
+ * Get currently configured telemetry backend.
84
+ */
85
+ export declare function getSyncTelemetry(): SyncTelemetry;
86
+ /**
87
+ * Replace active telemetry backend.
88
+ */
89
+ export declare function configureSyncTelemetry(telemetry: SyncTelemetry): void;
90
+ /**
91
+ * Reset telemetry backend to default console implementation.
92
+ */
93
+ export declare function resetSyncTelemetry(): void;
94
+ /**
95
+ * Capture an exception through the active telemetry backend.
96
+ */
97
+ export declare function captureSyncException(error: unknown, context?: Record<string, unknown>): void;
98
+ /**
99
+ * Start a span through the active telemetry backend.
100
+ */
101
+ export declare function startSyncSpan<T>(options: SyncSpanOptions, callback: (span: SyncSpan) => T): T;
102
+ /**
103
+ * Record a counter metric through the active telemetry backend.
104
+ */
105
+ export declare function countSyncMetric(name: string, value?: number, options?: SyncMetricOptions): void;
106
+ /**
107
+ * Record a gauge metric through the active telemetry backend.
108
+ */
109
+ export declare function gaugeSyncMetric(name: string, value: number, options?: SyncMetricOptions): void;
110
+ /**
111
+ * Record a distribution metric through the active telemetry backend.
112
+ */
113
+ export declare function distributionSyncMetric(name: string, value: number, options?: SyncMetricOptions): void;
114
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * @syncular/core - Runtime telemetry abstraction
3
+ *
4
+ * Provides vendor-neutral logging, tracing, and metrics interfaces so
5
+ * Syncular libraries can emit telemetry without coupling to a specific SDK.
6
+ */
7
+ const noopSpan = {
8
+ setAttribute() { },
9
+ setAttributes() { },
10
+ setStatus() { },
11
+ };
12
+ const noopTracer = {
13
+ startSpan(_options, callback) {
14
+ return callback(noopSpan);
15
+ },
16
+ };
17
+ const noopMetrics = {
18
+ count() { },
19
+ gauge() { },
20
+ distribution() { },
21
+ };
22
+ function createConsoleLogger() {
23
+ const isNode = typeof globalThis !== 'undefined' &&
24
+ typeof globalThis.setImmediate === 'function';
25
+ const defer = isNode
26
+ ? (fn) => globalThis.setImmediate(fn)
27
+ : (fn) => setTimeout(fn, 0);
28
+ return (event) => {
29
+ defer(() => {
30
+ const level = event.level ?? (event.error ? 'error' : 'info');
31
+ const payload = {
32
+ timestamp: new Date().toISOString(),
33
+ level,
34
+ ...event,
35
+ };
36
+ console.log(JSON.stringify(payload));
37
+ });
38
+ };
39
+ }
40
+ /**
41
+ * Create console-backed default telemetry (logs only; no-op tracing/metrics).
42
+ */
43
+ export function createDefaultSyncTelemetry() {
44
+ const logger = createConsoleLogger();
45
+ return {
46
+ log(event) {
47
+ logger(event);
48
+ },
49
+ tracer: noopTracer,
50
+ metrics: noopMetrics,
51
+ captureException(error, context) {
52
+ const message = error instanceof Error
53
+ ? error.message
54
+ : `Unknown error: ${String(error)}`;
55
+ logger({
56
+ event: 'sync.exception',
57
+ level: 'error',
58
+ error: message,
59
+ ...(context ?? {}),
60
+ });
61
+ },
62
+ };
63
+ }
64
+ let activeSyncTelemetry = createDefaultSyncTelemetry();
65
+ /**
66
+ * Get currently configured telemetry backend.
67
+ */
68
+ export function getSyncTelemetry() {
69
+ return activeSyncTelemetry;
70
+ }
71
+ /**
72
+ * Replace active telemetry backend.
73
+ */
74
+ export function configureSyncTelemetry(telemetry) {
75
+ activeSyncTelemetry = telemetry;
76
+ }
77
+ /**
78
+ * Reset telemetry backend to default console implementation.
79
+ */
80
+ export function resetSyncTelemetry() {
81
+ activeSyncTelemetry = createDefaultSyncTelemetry();
82
+ }
83
+ /**
84
+ * Capture an exception through the active telemetry backend.
85
+ */
86
+ export function captureSyncException(error, context) {
87
+ activeSyncTelemetry.captureException(error, context);
88
+ }
89
+ /**
90
+ * Start a span through the active telemetry backend.
91
+ */
92
+ export function startSyncSpan(options, callback) {
93
+ return activeSyncTelemetry.tracer.startSpan(options, callback);
94
+ }
95
+ /**
96
+ * Record a counter metric through the active telemetry backend.
97
+ */
98
+ export function countSyncMetric(name, value, options) {
99
+ activeSyncTelemetry.metrics.count(name, value, options);
100
+ }
101
+ /**
102
+ * Record a gauge metric through the active telemetry backend.
103
+ */
104
+ export function gaugeSyncMetric(name, value, options) {
105
+ activeSyncTelemetry.metrics.gauge(name, value, options);
106
+ }
107
+ /**
108
+ * Record a distribution metric through the active telemetry backend.
109
+ */
110
+ export function distributionSyncMetric(name, value, options) {
111
+ activeSyncTelemetry.metrics.distribution(name, value, options);
112
+ }
113
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4FH,MAAM,QAAQ,GAAa;IACzB,YAAY,GAAG,EAAC,CAAC;IACjB,aAAa,GAAG,EAAC,CAAC;IAClB,SAAS,GAAG,EAAC,CAAC;CACf,CAAC;AAEF,MAAM,UAAU,GAAe;IAC7B,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE;QAC5B,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAAA,CAC3B;CACF,CAAC;AAEF,MAAM,WAAW,GAAgB;IAC/B,KAAK,GAAG,EAAC,CAAC;IACV,KAAK,GAAG,EAAC,CAAC;IACV,YAAY,GAAG,EAAC,CAAC;CAClB,CAAC;AAEF,SAAS,mBAAmB,GAAwC;IAClE,MAAM,MAAM,GACV,OAAO,UAAU,KAAK,WAAW;QACjC,OAAO,UAAU,CAAC,YAAY,KAAK,UAAU,CAAC;IAEhD,MAAM,KAAK,GAAG,MAAM;QAClB,CAAC,CAAC,CAAC,EAAc,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjD,CAAC,CAAC,CAAC,EAAc,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAE1C,OAAO,CAAC,KAAyB,EAAE,EAAE,CAAC;QACpC,KAAK,CAAC,GAAG,EAAE,CAAC;YACV,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAG;gBACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,KAAK;gBACL,GAAG,KAAK;aACT,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAAA,CACtC,CAAC,CAAC;IAAA,CACJ,CAAC;AAAA,CACH;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,GAAkB;IAC1D,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,OAAO;QACL,GAAG,CAAC,KAAK,EAAE;YACT,MAAM,CAAC,KAAK,CAAC,CAAC;QAAA,CACf;QACD,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,WAAW;QACpB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE;YAC/B,MAAM,OAAO,GACX,KAAK,YAAY,KAAK;gBACpB,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,kBAAkB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC;gBACL,KAAK,EAAE,gBAAgB;gBACvB,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;gBACd,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;aACnB,CAAC,CAAC;QAAA,CACJ;KACF,CAAC;AAAA,CACH;AAED,IAAI,mBAAmB,GAAkB,0BAA0B,EAAE,CAAC;AAEtE;;GAEG;AACH,MAAM,UAAU,gBAAgB,GAAkB;IAChD,OAAO,mBAAmB,CAAC;AAAA,CAC5B;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAwB,EAAQ;IACrE,mBAAmB,GAAG,SAAS,CAAC;AAAA,CACjC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,GAAS;IACzC,mBAAmB,GAAG,0BAA0B,EAAE,CAAC;AAAA,CACpD;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAc,EACd,OAAiC,EAC3B;IACN,mBAAmB,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAAA,CACtD;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAwB,EACxB,QAA+B,EAC5B;IACH,OAAO,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAAA,CAChE;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,KAAc,EACd,OAA2B,EACrB;IACN,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAAA,CACzD;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,KAAa,EACb,OAA2B,EACrB;IACN,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAAA,CACzD;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAY,EACZ,KAAa,EACb,OAA2B,EACrB;IACN,mBAAmB,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAAA,CAChE"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * @syncular/core - Data transformation hooks
3
+ *
4
+ * Provides interfaces for field-level transformations (e.g., encryption/decryption)
5
+ * that can be applied during sync operations.
6
+ */
7
+ /**
8
+ * Direction of the transformation.
9
+ * - 'toClient': Server → Client (e.g., decrypt for client)
10
+ * - 'toServer': Client → Server (e.g., encrypt for server)
11
+ */
12
+ export type TransformDirection = 'toClient' | 'toServer';
13
+ /**
14
+ * Context passed to transform functions.
15
+ */
16
+ export interface TransformContext {
17
+ /** Direction of transformation */
18
+ direction: TransformDirection;
19
+ /** Scope name */
20
+ scope: string;
21
+ /** Table name */
22
+ table: string;
23
+ /** Row ID */
24
+ rowId: string;
25
+ /** User ID performing the operation */
26
+ userId: string;
27
+ }
28
+ /**
29
+ * A field transformer handles transformation of a single field.
30
+ *
31
+ * @example
32
+ * const secretNotesTransformer: FieldTransformer = {
33
+ * field: 'secret_notes',
34
+ * async transform(value, ctx) {
35
+ * const key = await getUserEncryptionKey(ctx.userId);
36
+ * return ctx.direction === 'toClient'
37
+ * ? decrypt(value as string, key)
38
+ * : encrypt(value as string, key);
39
+ * }
40
+ * };
41
+ */
42
+ export interface FieldTransformer {
43
+ /** Field name to transform */
44
+ field: string;
45
+ /**
46
+ * Transform the field value.
47
+ * @param value - Current field value
48
+ * @param ctx - Transform context
49
+ * @returns Transformed value
50
+ */
51
+ transform(value: unknown, ctx: TransformContext): Promise<unknown> | unknown;
52
+ }
53
+ /**
54
+ * Configuration for transforms on a scope.
55
+ */
56
+ export interface ScopeTransformConfig {
57
+ /** Scope name this config applies to */
58
+ scope: string;
59
+ /** Field transformers for this scope */
60
+ fields?: FieldTransformer[];
61
+ }
62
+ /**
63
+ * Registry for managing data transforms.
64
+ *
65
+ * @example
66
+ * const transforms = new TransformRegistry();
67
+ *
68
+ * transforms.register({
69
+ * scope: 'tasks',
70
+ * fields: [{
71
+ * field: 'secret_notes',
72
+ * async transform(value, ctx) {
73
+ * const key = await getUserEncryptionKey(ctx.userId);
74
+ * return ctx.direction === 'toClient'
75
+ * ? decrypt(value as string, key)
76
+ * : encrypt(value as string, key);
77
+ * }
78
+ * }]
79
+ * });
80
+ *
81
+ * // Apply transforms to data
82
+ * const transformed = await transforms.apply(
83
+ * [{ id: '1', secret_notes: 'encrypted...' }],
84
+ * { direction: 'toClient', scope: 'tasks', ... }
85
+ * );
86
+ */
87
+ export declare class TransformRegistry {
88
+ private configs;
89
+ /**
90
+ * Register transform config for a scope.
91
+ * @throws If config for this scope is already registered
92
+ */
93
+ register(config: ScopeTransformConfig): void;
94
+ /**
95
+ * Unregister transform config by scope.
96
+ * @returns true if config was found and removed
97
+ */
98
+ unregister(scope: string): boolean;
99
+ /**
100
+ * Get config for a scope.
101
+ */
102
+ get(scope: string): ScopeTransformConfig | undefined;
103
+ /**
104
+ * Check if any transforms are registered for a scope.
105
+ */
106
+ hasTransforms(scope: string): boolean;
107
+ /**
108
+ * Get all registered configs.
109
+ */
110
+ getAll(): ScopeTransformConfig[];
111
+ /**
112
+ * Apply transforms to a single row.
113
+ *
114
+ * @param row - Row data to transform
115
+ * @param ctx - Transform context (without rowId, will be extracted from row)
116
+ * @param rowIdField - Field name for row ID (default: 'id')
117
+ * @returns Transformed row
118
+ */
119
+ applyToRow<T extends Record<string, unknown>>(row: T, ctx: Omit<TransformContext, 'rowId'>, rowIdField?: string): Promise<T>;
120
+ /**
121
+ * Apply transforms to multiple rows.
122
+ *
123
+ * @param rows - Array of rows to transform
124
+ * @param ctx - Transform context (without rowId)
125
+ * @param rowIdField - Field name for row ID (default: 'id')
126
+ * @returns Transformed rows
127
+ */
128
+ apply<T extends Record<string, unknown>>(rows: T[], ctx: Omit<TransformContext, 'rowId'>, rowIdField?: string): Promise<T[]>;
129
+ /**
130
+ * Apply transforms to a mutation payload.
131
+ *
132
+ * @param payload - Mutation payload (may be partial row)
133
+ * @param ctx - Full transform context
134
+ * @returns Transformed payload
135
+ */
136
+ applyToPayload<T extends Record<string, unknown>>(payload: T | null, ctx: TransformContext): Promise<T | null>;
137
+ /**
138
+ * Clear all registered configs.
139
+ */
140
+ clear(): void;
141
+ }
142
+ /**
143
+ * Create a new transform registry.
144
+ */
145
+ export declare function createTransformRegistry(): TransformRegistry;
146
+ //# sourceMappingURL=transforms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transforms.d.ts","sourceRoot":"","sources":["../src/transforms.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,UAAU,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kCAAkC;IAClC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAC9E;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAgD;IAE/D;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAO3C;IAED;;;OAGG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEjC;IAED;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAEnD;IAED;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAGpC;IAED;;OAEG;IACH,MAAM,IAAI,oBAAoB,EAAE,CAE/B;IAED;;;;;;;OAOG;IACG,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChD,GAAG,EAAE,CAAC,EACN,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,EACpC,UAAU,SAAO,GAChB,OAAO,CAAC,CAAC,CAAC,CA4BZ;IAED;;;;;;;OAOG;IACG,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3C,IAAI,EAAE,CAAC,EAAE,EACT,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,EACpC,UAAU,SAAO,GAChB,OAAO,CAAC,CAAC,EAAE,CAAC,CASd;IAED;;;;;;OAMG;IACG,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpD,OAAO,EAAE,CAAC,GAAG,IAAI,EACjB,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CA4BnB;IAED;;OAEG;IACH,KAAK,IAAI,IAAI,CAEZ;CACF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,iBAAiB,CAE3D"}