@tanstack/db-sqlite-persistence-core 0.2.21 → 0.4.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 (58) hide show
  1. package/README.md +258 -7
  2. package/dist/cjs/broadcast-coordinator.cjs +1689 -0
  3. package/dist/cjs/broadcast-coordinator.cjs.map +1 -0
  4. package/dist/cjs/broadcast-coordinator.d.cts +116 -0
  5. package/dist/cjs/errors.cjs +73 -0
  6. package/dist/cjs/errors.cjs.map +1 -1
  7. package/dist/cjs/errors.d.cts +44 -0
  8. package/dist/cjs/index.cjs +19 -0
  9. package/dist/cjs/index.cjs.map +1 -1
  10. package/dist/cjs/index.d.cts +2 -0
  11. package/dist/cjs/persisted.cjs +1840 -399
  12. package/dist/cjs/persisted.cjs.map +1 -1
  13. package/dist/cjs/persisted.d.cts +177 -11
  14. package/dist/cjs/remote-subset-owner.cjs +20 -0
  15. package/dist/cjs/remote-subset-owner.cjs.map +1 -0
  16. package/dist/cjs/remote-subset-owner.d.cts +7 -0
  17. package/dist/cjs/remote-subset-wire.cjs +681 -0
  18. package/dist/cjs/remote-subset-wire.cjs.map +1 -0
  19. package/dist/cjs/remote-subset-wire.d.cts +59 -0
  20. package/dist/cjs/sqlite-core-adapter.cjs +969 -364
  21. package/dist/cjs/sqlite-core-adapter.cjs.map +1 -1
  22. package/dist/cjs/sqlite-core-adapter.d.cts +45 -1
  23. package/dist/cjs/sqlite-value.cjs +31 -0
  24. package/dist/cjs/sqlite-value.cjs.map +1 -0
  25. package/dist/cjs/sqlite-value.d.cts +10 -0
  26. package/dist/esm/broadcast-coordinator.d.ts +116 -0
  27. package/dist/esm/broadcast-coordinator.js +1689 -0
  28. package/dist/esm/broadcast-coordinator.js.map +1 -0
  29. package/dist/esm/errors.d.ts +44 -0
  30. package/dist/esm/errors.js +74 -1
  31. package/dist/esm/errors.js.map +1 -1
  32. package/dist/esm/index.d.ts +2 -0
  33. package/dist/esm/index.js +21 -2
  34. package/dist/esm/index.js.map +1 -1
  35. package/dist/esm/persisted.d.ts +177 -11
  36. package/dist/esm/persisted.js +1842 -401
  37. package/dist/esm/persisted.js.map +1 -1
  38. package/dist/esm/remote-subset-owner.d.ts +7 -0
  39. package/dist/esm/remote-subset-owner.js +20 -0
  40. package/dist/esm/remote-subset-owner.js.map +1 -0
  41. package/dist/esm/remote-subset-wire.d.ts +59 -0
  42. package/dist/esm/remote-subset-wire.js +681 -0
  43. package/dist/esm/remote-subset-wire.js.map +1 -0
  44. package/dist/esm/sqlite-core-adapter.d.ts +45 -1
  45. package/dist/esm/sqlite-core-adapter.js +955 -350
  46. package/dist/esm/sqlite-core-adapter.js.map +1 -1
  47. package/dist/esm/sqlite-value.d.ts +10 -0
  48. package/dist/esm/sqlite-value.js +31 -0
  49. package/dist/esm/sqlite-value.js.map +1 -0
  50. package/package.json +12 -2
  51. package/src/broadcast-coordinator.ts +2456 -0
  52. package/src/errors.ts +120 -0
  53. package/src/index.ts +2 -0
  54. package/src/persisted.ts +2690 -444
  55. package/src/remote-subset-owner.ts +36 -0
  56. package/src/remote-subset-wire.ts +946 -0
  57. package/src/sqlite-core-adapter.ts +1297 -410
  58. package/src/sqlite-value.ts +30 -0
package/src/errors.ts CHANGED
@@ -43,6 +43,117 @@ export class InvalidPersistenceAdapterError extends InvalidPersistedCollectionCo
43
43
  }
44
44
  }
45
45
 
46
+ export type PersistedCollectionDurabilityErrorOptions = {
47
+ cause?: unknown
48
+ code?: unknown
49
+ path?: unknown
50
+ }
51
+
52
+ export class PersistedCollectionDurabilityError extends PersistedCollectionCoreError {
53
+ override readonly cause: unknown
54
+ readonly code: unknown
55
+ readonly path: unknown
56
+
57
+ constructor(
58
+ message: string,
59
+ options: PersistedCollectionDurabilityErrorOptions = {},
60
+ ) {
61
+ super(message)
62
+ this.name = `PersistedCollectionDurabilityError`
63
+ this.cause = options.cause
64
+ this.code = options.code
65
+ this.path = options.path
66
+ }
67
+ }
68
+
69
+ export function toPersistedCollectionDurabilityError(
70
+ collectionId: string,
71
+ cause: unknown,
72
+ ): PersistedCollectionDurabilityError {
73
+ if (cause instanceof PersistedCollectionDurabilityError) {
74
+ return cause
75
+ }
76
+
77
+ const details =
78
+ typeof cause === `object` && cause !== null
79
+ ? (cause as Record<string, unknown>)
80
+ : undefined
81
+ const message = cause instanceof Error ? cause.message : String(cause)
82
+ return new PersistedCollectionDurabilityError(
83
+ `Failed to durably persist collection "${collectionId}": ${message}`,
84
+ {
85
+ cause,
86
+ code: details?.code,
87
+ path: details?.path,
88
+ },
89
+ )
90
+ }
91
+
92
+ export type IndeterminateCommitRequestType =
93
+ | `rpc:applyLocalMutations:req`
94
+ | `rpc:applyCommittedTx:req`
95
+
96
+ export type IndeterminateCommitErrorOptions = {
97
+ collectionId: string
98
+ requestType: IndeterminateCommitRequestType
99
+ previousLeaderId: string | null
100
+ previousTerm: number | null
101
+ currentLeaderId: string | null
102
+ currentTerm: number | null
103
+ cause: unknown
104
+ }
105
+
106
+ export class IndeterminateCommitError extends PersistedCollectionCoreError {
107
+ readonly code: `INDETERMINATE_COMMIT` = `INDETERMINATE_COMMIT`
108
+ readonly collectionId: string
109
+ readonly requestType: IndeterminateCommitRequestType
110
+ readonly previousLeaderId: string | null
111
+ readonly previousTerm: number | null
112
+ readonly currentLeaderId: string | null
113
+ readonly currentTerm: number | null
114
+ override readonly cause: unknown
115
+
116
+ constructor(options: IndeterminateCommitErrorOptions) {
117
+ super(
118
+ `Commit outcome is indeterminate for collection "${options.collectionId}": ${options.requestType} crossed leadership from ${formatLeader(options.previousLeaderId, options.previousTerm)} to ${formatLeader(options.currentLeaderId, options.currentTerm)}`,
119
+ )
120
+ this.name = `IndeterminateCommitError`
121
+ this.collectionId = options.collectionId
122
+ this.requestType = options.requestType
123
+ this.previousLeaderId = options.previousLeaderId
124
+ this.previousTerm = options.previousTerm
125
+ this.currentLeaderId = options.currentLeaderId
126
+ this.currentTerm = options.currentTerm
127
+ this.cause = options.cause
128
+ }
129
+ }
130
+
131
+ function formatLeader(leaderId: string | null, term: number | null): string {
132
+ return `${leaderId ?? `unknown leader`} (term ${term ?? `unknown`})`
133
+ }
134
+
135
+ export class DuplicateRemoteSubsetOwnerError extends PersistedCollectionCoreError {
136
+ readonly collectionId: string
137
+
138
+ constructor(collectionId: string) {
139
+ super(
140
+ `A remote subset owner is already registered for collection "${collectionId}"`,
141
+ )
142
+ this.name = `DuplicateRemoteSubsetOwnerError`
143
+ this.collectionId = collectionId
144
+ }
145
+ }
146
+
147
+ export class RetryableRemoteSubsetAcquisitionError extends PersistedCollectionCoreError {
148
+ override readonly cause: unknown
149
+
150
+ constructor(message: string, cause?: unknown) {
151
+ super(message)
152
+ this.name = `RetryableRemoteSubsetAcquisitionError`
153
+ this.cause = cause
154
+ }
155
+ }
156
+
46
157
  export class InvalidPersistedStorageKeyError extends InvalidPersistedCollectionConfigError {
47
158
  constructor(key: string | number) {
48
159
  super(
@@ -61,6 +172,15 @@ export class InvalidPersistedStorageKeyEncodingError extends InvalidPersistedCol
61
172
  }
62
173
  }
63
174
 
175
+ export class SQLiteBigIntOutOfRangeError extends PersistedCollectionCoreError {
176
+ constructor(value: bigint, minimum: bigint, maximum: bigint) {
177
+ super(
178
+ `SQLite BigInt value ${value} is outside the signed 64-bit range [${minimum}, ${maximum}]`,
179
+ )
180
+ this.name = `SQLiteBigIntOutOfRangeError`
181
+ }
182
+ }
183
+
64
184
  export class PersistenceUnavailableError extends PersistedCollectionCoreError {
65
185
  constructor(details?: string) {
66
186
  super(
package/src/index.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  export * from './persisted'
2
2
  export * from './errors'
3
3
  export * from './sqlite-core-adapter'
4
+ export * from './sqlite-value'
5
+ export * from './remote-subset-wire'
4
6
  // Re-export for use in non-secure browser contexts (see #1541)
5
7
  export { safeRandomUUID } from '@tanstack/db'