@syncular/core 0.0.1-60

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 (72) hide show
  1. package/dist/blobs.d.ts +137 -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 +21 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +30 -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 +46 -0
  18. package/dist/logger.d.ts.map +1 -0
  19. package/dist/logger.js +48 -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 +156 -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/transforms.d.ts +146 -0
  50. package/dist/transforms.d.ts.map +1 -0
  51. package/dist/transforms.js +155 -0
  52. package/dist/transforms.js.map +1 -0
  53. package/dist/types.d.ts +129 -0
  54. package/dist/types.d.ts.map +1 -0
  55. package/dist/types.js +20 -0
  56. package/dist/types.js.map +1 -0
  57. package/package.json +56 -0
  58. package/src/__tests__/conflict.test.ts +325 -0
  59. package/src/blobs.ts +187 -0
  60. package/src/conflict.ts +92 -0
  61. package/src/index.ts +30 -0
  62. package/src/kysely-serialize.ts +214 -0
  63. package/src/logger.ts +80 -0
  64. package/src/proxy/index.ts +10 -0
  65. package/src/proxy/types.ts +57 -0
  66. package/src/schemas/blobs.ts +101 -0
  67. package/src/schemas/common.ts +45 -0
  68. package/src/schemas/index.ts +7 -0
  69. package/src/schemas/sync.ts +222 -0
  70. package/src/scopes/index.ts +122 -0
  71. package/src/transforms.ts +256 -0
  72. package/src/types.ts +158 -0
package/src/types.ts ADDED
@@ -0,0 +1,158 @@
1
+ /**
2
+ * @syncular/core - Shared types for sync infrastructure
3
+ *
4
+ * Non-protocol types: conflict detection, transport interfaces.
5
+ * Protocol types (SyncOp, SyncPushRequest, etc.) live in ./schemas/sync.ts
6
+ */
7
+
8
+ import type { SyncCombinedRequest, SyncCombinedResponse } from './schemas/sync';
9
+
10
+ // ============================================================================
11
+ // Conflict Detection Types
12
+ // ============================================================================
13
+
14
+ /**
15
+ * Result of a conflict check - no conflict
16
+ */
17
+ interface ConflictCheckResultOk {
18
+ hasConflict: false;
19
+ }
20
+
21
+ /**
22
+ * Result of a conflict check - conflict detected
23
+ */
24
+ interface ConflictCheckResultConflict {
25
+ hasConflict: true;
26
+ /** Fields with conflicting changes */
27
+ conflictingFields: string[];
28
+ /** Current server row state */
29
+ serverRow: Record<string, unknown>;
30
+ /** Current server version */
31
+ serverVersion: number;
32
+ }
33
+
34
+ /**
35
+ * Union type for conflict check results
36
+ */
37
+ export type ConflictCheckResult =
38
+ | ConflictCheckResultOk
39
+ | ConflictCheckResultConflict;
40
+
41
+ /**
42
+ * Result of a field-level merge - can merge
43
+ */
44
+ export interface MergeResultOk {
45
+ canMerge: true;
46
+ /** Merged payload combining client and server changes */
47
+ mergedPayload: Record<string, unknown>;
48
+ }
49
+
50
+ /**
51
+ * Result of a field-level merge - cannot merge
52
+ */
53
+ export interface MergeResultConflict {
54
+ canMerge: false;
55
+ /** Fields that cannot be auto-merged */
56
+ conflictingFields: string[];
57
+ }
58
+
59
+ /**
60
+ * Union type for merge results
61
+ */
62
+ export type MergeResult = MergeResultOk | MergeResultConflict;
63
+
64
+ // ============================================================================
65
+ // Transport Types
66
+ // ============================================================================
67
+
68
+ /**
69
+ * Options for transport operations.
70
+ * Provides hooks for auth errors and cancellation support.
71
+ */
72
+ export interface SyncTransportOptions {
73
+ /**
74
+ * Called when auth fails (401/403).
75
+ * Return true to retry the request after refreshing auth.
76
+ */
77
+ onAuthError?: () => Promise<boolean>;
78
+ /**
79
+ * Abort signal for cancellation support.
80
+ */
81
+ signal?: AbortSignal;
82
+ }
83
+
84
+ /**
85
+ * Blob transport operations (optional extension to SyncTransport).
86
+ * When present, enables blob upload/download through the same transport.
87
+ */
88
+ export interface SyncTransportBlobs {
89
+ /**
90
+ * Initiate a blob upload.
91
+ * Returns presigned URL info or indicates blob already exists (dedup).
92
+ */
93
+ initiateUpload(args: {
94
+ hash: string;
95
+ size: number;
96
+ mimeType: string;
97
+ }): Promise<{
98
+ exists: boolean;
99
+ uploadUrl?: string;
100
+ uploadMethod?: 'PUT' | 'POST';
101
+ uploadHeaders?: Record<string, string>;
102
+ }>;
103
+
104
+ /**
105
+ * Complete a blob upload.
106
+ * Call this after uploading to the presigned URL.
107
+ */
108
+ completeUpload(hash: string): Promise<{ ok: boolean; error?: string }>;
109
+
110
+ /**
111
+ * Get a presigned download URL.
112
+ */
113
+ getDownloadUrl(hash: string): Promise<{
114
+ url: string;
115
+ expiresAt: string;
116
+ }>;
117
+ }
118
+
119
+ /**
120
+ * Transport interface for sync operations.
121
+ */
122
+ export interface SyncTransport {
123
+ /**
124
+ * Combined push+pull in a single round-trip.
125
+ */
126
+ sync(
127
+ request: SyncCombinedRequest,
128
+ options?: SyncTransportOptions
129
+ ): Promise<SyncCombinedResponse>;
130
+
131
+ /**
132
+ * Download an encoded bootstrap snapshot chunk.
133
+ */
134
+ fetchSnapshotChunk(
135
+ request: { chunkId: string },
136
+ options?: SyncTransportOptions
137
+ ): Promise<Uint8Array>;
138
+
139
+ /**
140
+ * Optional blob operations.
141
+ * When present, enables blob upload/download functionality.
142
+ */
143
+ blobs?: SyncTransportBlobs;
144
+ }
145
+
146
+ /**
147
+ * Transport error with additional context
148
+ */
149
+ export class SyncTransportError extends Error {
150
+ constructor(
151
+ message: string,
152
+ public readonly status?: number,
153
+ public readonly code?: string
154
+ ) {
155
+ super(message);
156
+ this.name = 'SyncTransportError';
157
+ }
158
+ }