@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.
- package/README.md +258 -7
- package/dist/cjs/broadcast-coordinator.cjs +1689 -0
- package/dist/cjs/broadcast-coordinator.cjs.map +1 -0
- package/dist/cjs/broadcast-coordinator.d.cts +116 -0
- package/dist/cjs/errors.cjs +73 -0
- package/dist/cjs/errors.cjs.map +1 -1
- package/dist/cjs/errors.d.cts +44 -0
- package/dist/cjs/index.cjs +19 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +2 -0
- package/dist/cjs/persisted.cjs +1840 -399
- package/dist/cjs/persisted.cjs.map +1 -1
- package/dist/cjs/persisted.d.cts +177 -11
- package/dist/cjs/remote-subset-owner.cjs +20 -0
- package/dist/cjs/remote-subset-owner.cjs.map +1 -0
- package/dist/cjs/remote-subset-owner.d.cts +7 -0
- package/dist/cjs/remote-subset-wire.cjs +681 -0
- package/dist/cjs/remote-subset-wire.cjs.map +1 -0
- package/dist/cjs/remote-subset-wire.d.cts +59 -0
- package/dist/cjs/sqlite-core-adapter.cjs +969 -364
- package/dist/cjs/sqlite-core-adapter.cjs.map +1 -1
- package/dist/cjs/sqlite-core-adapter.d.cts +45 -1
- package/dist/cjs/sqlite-value.cjs +31 -0
- package/dist/cjs/sqlite-value.cjs.map +1 -0
- package/dist/cjs/sqlite-value.d.cts +10 -0
- package/dist/esm/broadcast-coordinator.d.ts +116 -0
- package/dist/esm/broadcast-coordinator.js +1689 -0
- package/dist/esm/broadcast-coordinator.js.map +1 -0
- package/dist/esm/errors.d.ts +44 -0
- package/dist/esm/errors.js +74 -1
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +21 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/persisted.d.ts +177 -11
- package/dist/esm/persisted.js +1842 -401
- package/dist/esm/persisted.js.map +1 -1
- package/dist/esm/remote-subset-owner.d.ts +7 -0
- package/dist/esm/remote-subset-owner.js +20 -0
- package/dist/esm/remote-subset-owner.js.map +1 -0
- package/dist/esm/remote-subset-wire.d.ts +59 -0
- package/dist/esm/remote-subset-wire.js +681 -0
- package/dist/esm/remote-subset-wire.js.map +1 -0
- package/dist/esm/sqlite-core-adapter.d.ts +45 -1
- package/dist/esm/sqlite-core-adapter.js +955 -350
- package/dist/esm/sqlite-core-adapter.js.map +1 -1
- package/dist/esm/sqlite-value.d.ts +10 -0
- package/dist/esm/sqlite-value.js +31 -0
- package/dist/esm/sqlite-value.js.map +1 -0
- package/package.json +12 -2
- package/src/broadcast-coordinator.ts +2456 -0
- package/src/errors.ts +120 -0
- package/src/index.ts +2 -0
- package/src/persisted.ts +2690 -444
- package/src/remote-subset-owner.ts +36 -0
- package/src/remote-subset-wire.ts +946 -0
- package/src/sqlite-core-adapter.ts +1297 -410
- 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'
|