@@ -5,10 +5,11 @@ import type { Event, RecordApi } from "trailbase"
5
5
import type { CollectionConfig , SyncConfig , UtilsRecord } from "@tanstack/db"
6
6
7
7
/**
8
- * Configuration interface for TrailbaseCollection
8
+ * Configuration interface for Trailbase Collection
9
9
*/
10
10
export interface TrailBaseCollectionConfig <
11
11
TItem extends object ,
12
+ TRecord extends object = TItem ,
12
13
TKey extends string | number = string | number ,
13
14
> extends Omit <
14
15
CollectionConfig < TItem , TKey > ,
@@ -17,7 +18,10 @@ export interface TrailBaseCollectionConfig<
17
18
/**
18
19
* Record API name
19
20
*/
20
- recordApi : RecordApi < TItem >
21
+ recordApi : RecordApi < TRecord >
22
+
23
+ parse ?: ( record : TRecord ) => TItem
24
+ serialize ?: ( item : Partial < TItem > | TItem ) => Partial < TRecord > | TRecord
21
25
}
22
26
23
27
export type AwaitTxIdFn = ( txId : string , timeout ?: number ) => Promise < boolean >
@@ -26,11 +30,21 @@ export interface TrailBaseCollectionUtils extends UtilsRecord {
26
30
cancel : ( ) => void
27
31
}
28
32
29
- export function trailBaseCollectionOptions < TItem extends object > (
30
- config : TrailBaseCollectionConfig < TItem >
31
- ) : CollectionConfig < TItem > & { utils : TrailBaseCollectionUtils } {
33
+ export function trailBaseCollectionOptions <
34
+ TItem extends object ,
35
+ TRecord extends object = TItem ,
36
+ TKey extends string | number = string | number ,
37
+ > (
38
+ config : TrailBaseCollectionConfig < TItem , TRecord , TKey >
39
+ ) : CollectionConfig < TItem , TKey > & { utils : TrailBaseCollectionUtils } {
32
40
const getKey = config . getKey
33
41
42
+ const parse = ( record : TRecord ) => ( config . parse ?.( record ) ?? record ) as TItem
43
+ const serialUpd = ( item : Partial < TItem > ) =>
44
+ ( config . serialize ?.( item ) ?? item ) as Partial < TRecord >
45
+ const serialIns = ( item : TItem ) =>
46
+ ( config . serialize ?.( item ) ?? item ) as TRecord
47
+
34
48
const seenIds = new Store ( new Map < string , number > ( ) )
35
49
36
50
const awaitIds = (
@@ -83,7 +97,7 @@ export function trailBaseCollectionOptions<TItem extends object>(
83
97
}
84
98
} , 120 * 1000 )
85
99
86
- type SyncParams = Parameters < SyncConfig < TItem > [ `sync`] > [ 0 ]
100
+ type SyncParams = Parameters < SyncConfig < TItem , TKey > [ `sync`] > [ 0 ]
87
101
88
102
let eventReader : ReadableStreamDefaultReader < Event > | undefined
89
103
const cancel = ( ) => {
@@ -117,7 +131,10 @@ export function trailBaseCollectionOptions<TItem extends object>(
117
131
118
132
got = got + length
119
133
for ( const item of response . records ) {
120
- write ( { type : `insert` , value : item } )
134
+ write ( {
135
+ type : `insert` ,
136
+ value : parse ( item ) ,
137
+ } )
121
138
}
122
139
123
140
if ( length < limit ) break
@@ -149,13 +166,13 @@ export function trailBaseCollectionOptions<TItem extends object>(
149
166
begin ( )
150
167
let value : TItem | undefined
151
168
if ( `Insert` in event ) {
152
- value = event . Insert as TItem
169
+ value = parse ( event . Insert as TRecord )
153
170
write ( { type : `insert` , value } )
154
171
} else if ( `Delete` in event ) {
155
- value = event . Delete as TItem
172
+ value = parse ( event . Delete as TRecord )
156
173
write ( { type : `delete` , value } )
157
174
} else if ( `Update` in event ) {
158
- value = event . Update as TItem
175
+ value = parse ( event . Update as TRecord )
159
176
write ( { type : `update` , value } )
160
177
} else {
161
178
console . error ( `Error: ${ event . Error } ` )
@@ -205,7 +222,7 @@ export function trailBaseCollectionOptions<TItem extends object>(
205
222
if ( type !== `insert` ) {
206
223
throw new Error ( `Expected 'insert', got: ${ type } ` )
207
224
}
208
- return changes
225
+ return serialIns ( changes )
209
226
} )
210
227
)
211
228
@@ -224,7 +241,8 @@ export function trailBaseCollectionOptions<TItem extends object>(
224
241
throw new Error ( `Expected 'update', got: ${ type } ` )
225
242
}
226
243
227
- await config . recordApi . update ( key , changes )
244
+ await config . recordApi . update ( key , serialUpd ( changes ) )
245
+
228
246
return String ( key )
229
247
} )
230
248
)
0 commit comments