@g9tm/syncdata 1.2.1
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/LICENSE.md +21 -0
- package/PARITY.md +71 -0
- package/README.md +71 -0
- package/THIRD-PARTY-NOTICES.md +31 -0
- package/dist/abstractions/digest.d.ts +27 -0
- package/dist/abstractions/digest.js +78 -0
- package/dist/abstractions/digest.js.map +1 -0
- package/dist/abstractions/enums.d.ts +42 -0
- package/dist/abstractions/enums.js +60 -0
- package/dist/abstractions/enums.js.map +1 -0
- package/dist/abstractions/errors.d.ts +72 -0
- package/dist/abstractions/errors.js +90 -0
- package/dist/abstractions/errors.js.map +1 -0
- package/dist/abstractions/guid.d.ts +24 -0
- package/dist/abstractions/guid.js +93 -0
- package/dist/abstractions/guid.js.map +1 -0
- package/dist/abstractions/key.d.ts +16 -0
- package/dist/abstractions/key.js +47 -0
- package/dist/abstractions/key.js.map +1 -0
- package/dist/abstractions/long.d.ts +103 -0
- package/dist/abstractions/long.js +351 -0
- package/dist/abstractions/long.js.map +1 -0
- package/dist/abstractions/parameters.d.ts +49 -0
- package/dist/abstractions/parameters.js +153 -0
- package/dist/abstractions/parameters.js.map +1 -0
- package/dist/brotli-js/decode.d.ts +8 -0
- package/dist/brotli-js/decode.js +2004 -0
- package/dist/brotli-js/decode.js.map +1 -0
- package/dist/brotli-js/index.d.ts +5 -0
- package/dist/brotli-js/index.js +19 -0
- package/dist/brotli-js/index.js.map +1 -0
- package/dist/client/engine.d.ts +110 -0
- package/dist/client/engine.js +1158 -0
- package/dist/client/engine.js.map +1 -0
- package/dist/client/model.d.ts +61 -0
- package/dist/client/model.js +154 -0
- package/dist/client/model.js.map +1 -0
- package/dist/client/progress.d.ts +101 -0
- package/dist/client/progress.js +251 -0
- package/dist/client/progress.js.map +1 -0
- package/dist/client/runs.d.ts +219 -0
- package/dist/client/runs.js +239 -0
- package/dist/client/runs.js.map +1 -0
- package/dist/client/storeTypes.d.ts +428 -0
- package/dist/client/storeTypes.js +256 -0
- package/dist/client/storeTypes.js.map +1 -0
- package/dist/client/transport.d.ts +19 -0
- package/dist/client/transport.js +2 -0
- package/dist/client/transport.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/abort.d.ts +21 -0
- package/dist/internal/abort.js +125 -0
- package/dist/internal/abort.js.map +1 -0
- package/dist/internal/base64.d.ts +8 -0
- package/dist/internal/base64.js +85 -0
- package/dist/internal/base64.js.map +1 -0
- package/dist/internal/dotnetFormat.d.ts +32 -0
- package/dist/internal/dotnetFormat.js +207 -0
- package/dist/internal/dotnetFormat.js.map +1 -0
- package/dist/internal/md5.d.ts +2 -0
- package/dist/internal/md5.js +97 -0
- package/dist/internal/md5.js.map +1 -0
- package/dist/internal/sha256.d.ts +20 -0
- package/dist/internal/sha256.js +153 -0
- package/dist/internal/sha256.js.map +1 -0
- package/dist/internal/utf8.d.ts +8 -0
- package/dist/internal/utf8.js +143 -0
- package/dist/internal/utf8.js.map +1 -0
- package/dist/node/index.d.ts +9 -0
- package/dist/node/index.js +35 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/sqliteDriver.d.ts +11 -0
- package/dist/node/sqliteDriver.js +252 -0
- package/dist/node/sqliteDriver.js.map +1 -0
- package/dist/protocol/dtos.d.ts +280 -0
- package/dist/protocol/dtos.js +33 -0
- package/dist/protocol/dtos.js.map +1 -0
- package/dist/protocol/protocol.d.ts +36 -0
- package/dist/protocol/protocol.js +63 -0
- package/dist/protocol/protocol.js.map +1 -0
- package/dist/protocol/rowBatch/columnLayout.d.ts +4 -0
- package/dist/protocol/rowBatch/columnLayout.js +309 -0
- package/dist/protocol/rowBatch/columnLayout.js.map +1 -0
- package/dist/protocol/rowBatch/format.d.ts +74 -0
- package/dist/protocol/rowBatch/format.js +163 -0
- package/dist/protocol/rowBatch/format.js.map +1 -0
- package/dist/protocol/rowBatch/reader.d.ts +119 -0
- package/dist/protocol/rowBatch/reader.js +459 -0
- package/dist/protocol/rowBatch/reader.js.map +1 -0
- package/dist/protocol/rowBatch/writer.d.ts +101 -0
- package/dist/protocol/rowBatch/writer.js +412 -0
- package/dist/protocol/rowBatch/writer.js.map +1 -0
- package/dist/protocol/wire.d.ts +32 -0
- package/dist/protocol/wire.js +329 -0
- package/dist/protocol/wire.js.map +1 -0
- package/dist/signalr/index.d.ts +2 -0
- package/dist/signalr/index.js +5 -0
- package/dist/signalr/index.js.map +1 -0
- package/dist/signalr/protocols.d.ts +17 -0
- package/dist/signalr/protocols.js +109 -0
- package/dist/signalr/protocols.js.map +1 -0
- package/dist/signalr/transport.d.ts +67 -0
- package/dist/signalr/transport.js +286 -0
- package/dist/signalr/transport.js.map +1 -0
- package/dist/sqlite/apply.d.ts +91 -0
- package/dist/sqlite/apply.js +657 -0
- package/dist/sqlite/apply.js.map +1 -0
- package/dist/sqlite/commands.d.ts +24 -0
- package/dist/sqlite/commands.js +167 -0
- package/dist/sqlite/commands.js.map +1 -0
- package/dist/sqlite/connection.d.ts +81 -0
- package/dist/sqlite/connection.js +322 -0
- package/dist/sqlite/connection.js.map +1 -0
- package/dist/sqlite/driver.d.ts +63 -0
- package/dist/sqlite/driver.js +9 -0
- package/dist/sqlite/driver.js.map +1 -0
- package/dist/sqlite/index.d.ts +6 -0
- package/dist/sqlite/index.js +7 -0
- package/dist/sqlite/index.js.map +1 -0
- package/dist/sqlite/internals.d.ts +63 -0
- package/dist/sqlite/internals.js +194 -0
- package/dist/sqlite/internals.js.map +1 -0
- package/dist/sqlite/options.d.ts +78 -0
- package/dist/sqlite/options.js +78 -0
- package/dist/sqlite/options.js.map +1 -0
- package/dist/sqlite/push.d.ts +9 -0
- package/dist/sqlite/push.js +272 -0
- package/dist/sqlite/push.js.map +1 -0
- package/dist/sqlite/query.d.ts +38 -0
- package/dist/sqlite/query.js +476 -0
- package/dist/sqlite/query.js.map +1 -0
- package/dist/sqlite/revocation.d.ts +28 -0
- package/dist/sqlite/revocation.js +337 -0
- package/dist/sqlite/revocation.js.map +1 -0
- package/dist/sqlite/sql.d.ts +60 -0
- package/dist/sqlite/sql.js +324 -0
- package/dist/sqlite/sql.js.map +1 -0
- package/dist/sqlite/store.d.ts +116 -0
- package/dist/sqlite/store.js +664 -0
- package/dist/sqlite/store.js.map +1 -0
- package/dist/sqlite/values.d.ts +29 -0
- package/dist/sqlite/values.js +288 -0
- package/dist/sqlite/values.js.map +1 -0
- package/dist/testing/index.d.ts +61 -0
- package/dist/testing/index.js +175 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +104 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
// The wire forms of the DTOs. Both SignalR protocols are decoded to plain objects first — JSON with camelCase names
|
|
2
|
+
// (System.Text.Json, G9SyncJsonContext), MessagePack with the PascalCase names Nerdbank.MessagePack writes, GUIDs as
|
|
3
|
+
// extension type 2 (16 big-endian bytes) and DateTime as the timestamp extension — then normalised here into the DTO
|
|
4
|
+
// interfaces, with every missing field defaulted the way .NET's initialisers default it.
|
|
5
|
+
import { G9Long, longToNumber } from '../abstractions/long.js';
|
|
6
|
+
import { tryNormalizeGuid } from '../abstractions/guid.js';
|
|
7
|
+
import { base64ToBytes } from '../internal/base64.js';
|
|
8
|
+
/** A GUID on its way into MessagePack (written as extension type 2, 16 big-endian bytes, like Nerdbank's Guid converter). */
|
|
9
|
+
export class G9WireGuid {
|
|
10
|
+
constructor(value) {
|
|
11
|
+
this.value = value;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/** Nerdbank.MessagePack's extension type for System.Guid. */
|
|
15
|
+
export const GUID_EXTENSION_TYPE = 2;
|
|
16
|
+
function isPlainObject(value) {
|
|
17
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof Uint8Array) && !(value instanceof G9Long) && !(value instanceof Date) && !(value instanceof G9WireGuid);
|
|
18
|
+
}
|
|
19
|
+
function lowerFirst(name) {
|
|
20
|
+
return name.length === 0 ? name : name.charAt(0).toLowerCase() + name.slice(1);
|
|
21
|
+
}
|
|
22
|
+
function upperFirst(name) {
|
|
23
|
+
return name.length === 0 ? name : name.charAt(0).toUpperCase() + name.slice(1);
|
|
24
|
+
}
|
|
25
|
+
/** The camelCase twin of a decoded MessagePack value (a `Parameters` dictionary keeps its own keys). */
|
|
26
|
+
export function fromMessagePackNames(value) {
|
|
27
|
+
if (Array.isArray(value))
|
|
28
|
+
return value.map(fromMessagePackNames);
|
|
29
|
+
if (!isPlainObject(value))
|
|
30
|
+
return value;
|
|
31
|
+
const out = {};
|
|
32
|
+
for (const key of Object.keys(value)) {
|
|
33
|
+
const item = value[key];
|
|
34
|
+
out[lowerFirst(key)] = key === 'Parameters' && isPlainObject(item) ? copyDictionary(item) : fromMessagePackNames(item);
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The MessagePack form of an outgoing DTO: PascalCase names (a `parameters` dictionary keeps its keys), GUID fields as
|
|
40
|
+
* {@link G9WireGuid}. G9Long values stay as they are (the protocol writes them as int64).
|
|
41
|
+
*/
|
|
42
|
+
export function toMessagePackNames(value) {
|
|
43
|
+
if (Array.isArray(value))
|
|
44
|
+
return value.map(toMessagePackNames);
|
|
45
|
+
if (!isPlainObject(value))
|
|
46
|
+
return value;
|
|
47
|
+
const out = {};
|
|
48
|
+
for (const key of Object.keys(value)) {
|
|
49
|
+
const item = value[key];
|
|
50
|
+
if (item === undefined)
|
|
51
|
+
continue;
|
|
52
|
+
let mapped;
|
|
53
|
+
if (key === 'parameters' && isPlainObject(item))
|
|
54
|
+
mapped = copyDictionary(item);
|
|
55
|
+
else if (GUID_FIELDS[key] === true && typeof item === 'string')
|
|
56
|
+
mapped = new G9WireGuid(item);
|
|
57
|
+
else
|
|
58
|
+
mapped = toMessagePackNames(item);
|
|
59
|
+
out[upperFirst(key)] = mapped;
|
|
60
|
+
}
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
/** DTO fields typed System.Guid on the .NET side. */
|
|
64
|
+
const GUID_FIELDS = { clientId: true, commandId: true, epoch: true };
|
|
65
|
+
function copyDictionary(value) {
|
|
66
|
+
const out = {};
|
|
67
|
+
for (const key of Object.keys(value))
|
|
68
|
+
out[key] = String(value[key]);
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
// ---------------------------------------------------------------- field readers
|
|
72
|
+
function obj(value) {
|
|
73
|
+
return isPlainObject(value) ? value : {};
|
|
74
|
+
}
|
|
75
|
+
function str(value, fallback = '') {
|
|
76
|
+
return typeof value === 'string' ? value : fallback;
|
|
77
|
+
}
|
|
78
|
+
function optStr(value) {
|
|
79
|
+
return typeof value === 'string' ? value : null;
|
|
80
|
+
}
|
|
81
|
+
function num(value) {
|
|
82
|
+
return value === null || value === undefined ? 0 : longToNumber(value);
|
|
83
|
+
}
|
|
84
|
+
function bool(value) {
|
|
85
|
+
return value === true;
|
|
86
|
+
}
|
|
87
|
+
function long(value) {
|
|
88
|
+
if (value instanceof G9Long)
|
|
89
|
+
return value;
|
|
90
|
+
if (typeof value === 'number')
|
|
91
|
+
return G9Long.fromNumber(value);
|
|
92
|
+
if (typeof value === 'string' && value !== '')
|
|
93
|
+
return G9Long.parse(value);
|
|
94
|
+
return G9Long.ZERO;
|
|
95
|
+
}
|
|
96
|
+
function arr(value) {
|
|
97
|
+
return Array.isArray(value) ? value : [];
|
|
98
|
+
}
|
|
99
|
+
function strings(value) {
|
|
100
|
+
return arr(value).map((v) => str(v));
|
|
101
|
+
}
|
|
102
|
+
function guid(value) {
|
|
103
|
+
var _a;
|
|
104
|
+
if (value instanceof G9WireGuid)
|
|
105
|
+
return value.value;
|
|
106
|
+
if (typeof value === 'string')
|
|
107
|
+
return (_a = tryNormalizeGuid(value)) !== null && _a !== void 0 ? _a : value;
|
|
108
|
+
return '00000000-0000-0000-0000-000000000000';
|
|
109
|
+
}
|
|
110
|
+
/** A byte[] field: base64 text (JSON) or bytes (MessagePack). */
|
|
111
|
+
export function bytesField(value) {
|
|
112
|
+
if (value instanceof Uint8Array)
|
|
113
|
+
return value;
|
|
114
|
+
if (typeof value === 'string')
|
|
115
|
+
return base64ToBytes(value);
|
|
116
|
+
if (value instanceof ArrayBuffer)
|
|
117
|
+
return new Uint8Array(value);
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
/** Epoch milliseconds of a wire DateTime: ISO text (JSON) or a Date (MessagePack timestamp). */
|
|
121
|
+
export function dateTimeMs(value) {
|
|
122
|
+
if (value instanceof Date)
|
|
123
|
+
return value.getTime();
|
|
124
|
+
if (typeof value === 'number')
|
|
125
|
+
return value;
|
|
126
|
+
if (typeof value !== 'string')
|
|
127
|
+
return 0;
|
|
128
|
+
const m = /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2})(?::(\d{2})(?:\.(\d+))?)?(Z|[+-]\d{2}:?\d{2})?$/.exec(value.trim());
|
|
129
|
+
if (!m)
|
|
130
|
+
return 0;
|
|
131
|
+
const fraction = m[7] ? (m[7] + '00').slice(0, 3) : '0';
|
|
132
|
+
let ms = Date.UTC(+m[1], +m[2] - 1, +m[3], +m[4], +m[5], m[6] ? +m[6] : 0, +fraction);
|
|
133
|
+
// Date.UTC maps years 0..99 to 1900..1999.
|
|
134
|
+
if (+m[1] < 100) {
|
|
135
|
+
const date = new Date(ms);
|
|
136
|
+
date.setUTCFullYear(+m[1]);
|
|
137
|
+
ms = date.getTime();
|
|
138
|
+
}
|
|
139
|
+
const zone = m[8];
|
|
140
|
+
if (zone && zone !== 'Z') {
|
|
141
|
+
const sign = zone.charAt(0) === '-' ? -1 : 1;
|
|
142
|
+
const digits = zone.slice(1).replace(':', '');
|
|
143
|
+
ms -= sign * (+digits.slice(0, 2) * 60 + +digits.slice(2, 4)) * 60000;
|
|
144
|
+
}
|
|
145
|
+
return ms;
|
|
146
|
+
}
|
|
147
|
+
// ---------------------------------------------------------------- DTO readers (camelCase input)
|
|
148
|
+
export function readSyncError(value) {
|
|
149
|
+
if (!isPlainObject(value))
|
|
150
|
+
return null;
|
|
151
|
+
return { code: str(value.code, 'G9S-SRV-ERROR'), message: str(value.message), retryable: bool(value.retryable), details: optStr(value.details) };
|
|
152
|
+
}
|
|
153
|
+
function readColumn(value) {
|
|
154
|
+
const v = obj(value);
|
|
155
|
+
return { name: str(v.name), type: num(v.type), nullable: bool(v.nullable) };
|
|
156
|
+
}
|
|
157
|
+
function readMismatch(value) {
|
|
158
|
+
const v = obj(value);
|
|
159
|
+
return { name: str(v.name), clientType: num(v.clientType), serverType: num(v.serverType) };
|
|
160
|
+
}
|
|
161
|
+
export function readNegotiatedTable(value) {
|
|
162
|
+
const v = obj(value);
|
|
163
|
+
return {
|
|
164
|
+
tableId: num(v.tableId),
|
|
165
|
+
name: str(v.name),
|
|
166
|
+
keyColumn: str(v.keyColumn),
|
|
167
|
+
keyType: num(v.keyType),
|
|
168
|
+
columns: arr(v.columns).map(readColumn),
|
|
169
|
+
computedColumns: strings(v.computedColumns),
|
|
170
|
+
readOnlyColumns: strings(v.readOnlyColumns),
|
|
171
|
+
missingColumns: strings(v.missingColumns),
|
|
172
|
+
typeMismatchColumns: arr(v.typeMismatchColumns).map(readMismatch),
|
|
173
|
+
direction: num(v.direction),
|
|
174
|
+
conflictPolicy: num(v.conflictPolicy),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
export function readSubscriptionDefinition(value) {
|
|
178
|
+
const v = obj(value);
|
|
179
|
+
return {
|
|
180
|
+
name: str(v.name),
|
|
181
|
+
parameters: arr(v.parameters).map((p) => {
|
|
182
|
+
const d = obj(p);
|
|
183
|
+
return { name: str(d.name), type: num(d.type), required: bool(d.required), isList: bool(d.isList) };
|
|
184
|
+
}),
|
|
185
|
+
dependsOn: arr(v.dependsOn).map((p) => {
|
|
186
|
+
const d = obj(p);
|
|
187
|
+
return { name: str(d.name), required: d.required === undefined ? true : bool(d.required) };
|
|
188
|
+
}),
|
|
189
|
+
tables: strings(v.tables),
|
|
190
|
+
ephemeral: bool(v.ephemeral),
|
|
191
|
+
ttlSeconds: num(v.ttlSeconds),
|
|
192
|
+
heavy: bool(v.heavy),
|
|
193
|
+
moveOutPolicy: num(v.moveOutPolicy),
|
|
194
|
+
reconcileIntervalMinutes: num(v.reconcileIntervalMinutes),
|
|
195
|
+
definitionHash: str(v.definitionHash),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
export function readSubscriptionState(value) {
|
|
199
|
+
const v = obj(value);
|
|
200
|
+
return {
|
|
201
|
+
key: str(v.key),
|
|
202
|
+
action: num(v.action),
|
|
203
|
+
definitionHash: optStr(v.definitionHash),
|
|
204
|
+
authHash: optStr(v.authHash),
|
|
205
|
+
message: optStr(v.message),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
export function readHelloResult(value) {
|
|
209
|
+
const v = obj(value);
|
|
210
|
+
return {
|
|
211
|
+
epoch: guid(v.epoch),
|
|
212
|
+
serverTimeUtcMs: dateTimeMs(v.serverTimeUtc),
|
|
213
|
+
protocolVersion: v.protocolVersion === undefined ? 1 : num(v.protocolVersion),
|
|
214
|
+
tables: arr(v.tables).map(readNegotiatedTable),
|
|
215
|
+
unknownTables: strings(v.unknownTables),
|
|
216
|
+
definitions: arr(v.definitions).map(readSubscriptionDefinition),
|
|
217
|
+
subscriptions: arr(v.subscriptions).map(readSubscriptionState),
|
|
218
|
+
maxPushRows: num(v.maxPushRows),
|
|
219
|
+
maxPushBytes: num(v.maxPushBytes),
|
|
220
|
+
error: readSyncError(v.error),
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
function readAccepted(value) {
|
|
224
|
+
const v = obj(value);
|
|
225
|
+
return { tableId: num(v.tableId), keys: strings(v.keys), versions: arr(v.versions).map(num), deleted: arr(v.deleted).map(bool) };
|
|
226
|
+
}
|
|
227
|
+
function readRejection(value) {
|
|
228
|
+
const v = obj(value);
|
|
229
|
+
return {
|
|
230
|
+
tableId: num(v.tableId),
|
|
231
|
+
key: str(v.key),
|
|
232
|
+
code: str(v.code, 'G9S-REJ-CONSTRAINT'),
|
|
233
|
+
message: optStr(v.message),
|
|
234
|
+
sqlState: optStr(v.sqlState),
|
|
235
|
+
constraint: optStr(v.constraint),
|
|
236
|
+
column: optStr(v.column),
|
|
237
|
+
details: optStr(v.details),
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
function readConflict(value) {
|
|
241
|
+
const v = obj(value);
|
|
242
|
+
return {
|
|
243
|
+
tableId: num(v.tableId),
|
|
244
|
+
key: str(v.key),
|
|
245
|
+
code: str(v.code, 'G9S-CON-SERVER-WINS'),
|
|
246
|
+
serverChangedMask: long(v.serverChangedMask),
|
|
247
|
+
partiallyApplied: bool(v.partiallyApplied),
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
function readCommandResult(value) {
|
|
251
|
+
const v = obj(value);
|
|
252
|
+
return { commandId: guid(v.commandId), status: num(v.status), code: optStr(v.code), message: optStr(v.message), result: optStr(v.result) };
|
|
253
|
+
}
|
|
254
|
+
export function readPushResult(value) {
|
|
255
|
+
const v = obj(value);
|
|
256
|
+
return {
|
|
257
|
+
batchId: num(v.batchId),
|
|
258
|
+
alreadyApplied: bool(v.alreadyApplied),
|
|
259
|
+
accepted: arr(v.accepted).map(readAccepted),
|
|
260
|
+
rejections: arr(v.rejections).map(readRejection),
|
|
261
|
+
conflicts: arr(v.conflicts).map(readConflict),
|
|
262
|
+
canonicalFrames: arr(v.canonicalFrames)
|
|
263
|
+
.map(bytesField)
|
|
264
|
+
.filter((b) => b !== null),
|
|
265
|
+
commandResults: arr(v.commandResults).map(readCommandResult),
|
|
266
|
+
error: readSyncError(v.error),
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
function readPlannedPart(value) {
|
|
270
|
+
const v = obj(value);
|
|
271
|
+
return {
|
|
272
|
+
subscriptionKey: str(v.subscriptionKey),
|
|
273
|
+
tableId: num(v.tableId),
|
|
274
|
+
kind: num(v.kind),
|
|
275
|
+
rows: num(v.rows),
|
|
276
|
+
estimatedBytes: num(v.estimatedBytes),
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
function readCursor(value) {
|
|
280
|
+
const v = obj(value);
|
|
281
|
+
return { key: str(v.key), cursor: str(v.cursor), definitionHash: str(v.definitionHash), authHash: str(v.authHash) };
|
|
282
|
+
}
|
|
283
|
+
export function readPullPlan(value) {
|
|
284
|
+
const v = obj(value);
|
|
285
|
+
return {
|
|
286
|
+
token: str(v.token),
|
|
287
|
+
parts: arr(v.parts).map(readPlannedPart),
|
|
288
|
+
totalRows: num(v.totalRows),
|
|
289
|
+
estimatedBytes: num(v.estimatedBytes),
|
|
290
|
+
cursors: arr(v.cursors).map(readCursor),
|
|
291
|
+
skipped: arr(v.skipped).map(readSubscriptionState),
|
|
292
|
+
error: readSyncError(v.error),
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
export function readContinuation(value) {
|
|
296
|
+
if (!isPlainObject(value))
|
|
297
|
+
return null;
|
|
298
|
+
return { partIndex: num(value.partIndex), afterKey: optStr(value.afterKey), nextSequence: num(value.nextSequence) };
|
|
299
|
+
}
|
|
300
|
+
function readBuckets(value) {
|
|
301
|
+
const v = obj(value);
|
|
302
|
+
return { tableId: num(v.tableId), buckets: arr(v.buckets).map(num) };
|
|
303
|
+
}
|
|
304
|
+
export function readReconcileSummary(value) {
|
|
305
|
+
if (!isPlainObject(value))
|
|
306
|
+
return null;
|
|
307
|
+
return {
|
|
308
|
+
cursor: str(value.cursor),
|
|
309
|
+
definitionHash: str(value.definitionHash),
|
|
310
|
+
authHash: str(value.authHash),
|
|
311
|
+
mismatched: arr(value.mismatched).map(readBuckets),
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
export function readSyncChunk(value) {
|
|
315
|
+
const v = obj(value);
|
|
316
|
+
return {
|
|
317
|
+
sequence: num(v.sequence),
|
|
318
|
+
payload: bytesField(v.payload),
|
|
319
|
+
rowCount: num(v.rowCount),
|
|
320
|
+
subscriptionKey: optStr(v.subscriptionKey),
|
|
321
|
+
isFinal: bool(v.isFinal),
|
|
322
|
+
continuation: readContinuation(v.continuation),
|
|
323
|
+
reconcileSummary: readReconcileSummary(v.reconcileSummary),
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
export function readChangesAvailable(value) {
|
|
327
|
+
return { tables: strings(obj(value).tables) };
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../src/protocol/wire.ts"],"names":[],"mappings":"AAAA,oHAAoH;AACpH,qHAAqH;AACrH,qHAAqH;AACrH,yFAAyF;AACzF,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AA2BtD,6HAA6H;AAC7H,MAAM,OAAO,UAAU;IAGrB,YAAY,KAAa;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED,6DAA6D;AAC7D,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAIrC,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC,CAAC;AAC5M,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACjE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,MAAM,GAAG,GAAU,EAAE,CAAC;IACtB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,KAAK,YAAY,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACzH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC/D,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,MAAM,GAAG,GAAU,EAAE,CAAC;IACtB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QACjC,IAAI,MAAe,CAAC;QACpB,IAAI,GAAG,KAAK,YAAY,IAAI,aAAa,CAAC,IAAI,CAAC;YAAE,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;aAC1E,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;;YACzF,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACvC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;IAChC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,qDAAqD;AACrD,MAAM,WAAW,GAA4B,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAE9F,SAAS,cAAc,CAAC,KAAY;IAClC,MAAM,GAAG,GAA8B,EAAE,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iFAAiF;AAEjF,SAAS,GAAG,CAAC,KAAc;IACzB,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,GAAG,CAAC,KAAc,EAAE,QAAQ,GAAG,EAAE;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AACtD,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,SAAS,GAAG,CAAC,KAAc;IACzB,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,IAAI,CAAC,KAAc;IAC1B,OAAO,KAAK,KAAK,IAAI,CAAC;AACxB,CAAC;AAED,SAAS,IAAI,CAAC,KAAc;IAC1B,IAAI,KAAK,YAAY,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1E,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,GAAG,CAAC,KAAc;IACzB,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,IAAI,CAAC,KAAc;;IAC1B,IAAI,KAAK,YAAY,UAAU;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC;IACpD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAA,gBAAgB,CAAC,KAAK,CAAC,mCAAI,KAAK,CAAC;IACvE,OAAO,sCAAsC,CAAC;AAChD,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,KAAK,YAAY,UAAU;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,KAAK,YAAY,WAAW;QAAE,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,4FAA4F,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1H,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACxD,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,CAAY,EAAE,CAAE,CAAC,CAAC,CAAC,CAAY,GAAG,CAAC,EAAE,CAAE,CAAC,CAAC,CAAC,CAAY,EAAE,CAAE,CAAC,CAAC,CAAC,CAAY,EAAE,CAAE,CAAC,CAAC,CAAC,CAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IAClJ,2CAA2C;IAC3C,IAAI,CAAE,CAAC,CAAC,CAAC,CAAY,GAAG,GAAG,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,cAAc,CAAC,CAAE,CAAC,CAAC,CAAC,CAAY,CAAC,CAAC;QACvC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9C,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IACxE,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,iGAAiG;AAEjG,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;AACnJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAA4B,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;AACzG,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,CAAyC,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,CAAyC,EAAE,CAAC;AAC7K,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;QACvB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QACjB,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAmC;QACzD,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;QACvC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAC3C,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAC3C,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;QACzC,mBAAmB,EAAE,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;QACjE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAqC;QAC/D,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC,cAAc,CAA0C;KAC/E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QACjB,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACtC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAA4B,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACjI,CAAC,CAAC;QACF,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACpC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7F,CAAC,CAAC;QACF,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QACzB,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5B,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;QAC7B,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QACpB,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,aAAa,CAAgD;QAClF,wBAAwB,EAAE,GAAG,CAAC,CAAC,CAAC,wBAAwB,CAAC;QACzD,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO;QACL,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACf,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAoC;QACxD,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;QACxC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QACpB,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC;QAC5C,eAAe,EAAE,CAAC,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC;QAC7E,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAC9C,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;QACvC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,0BAA0B,CAAC;QAC/D,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC;QAC9D,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;QAC/B,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC;QACjC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AACnI,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;QACvB,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACf,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,oBAAoB,CAAC;QACvC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5B,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;QAChC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACxB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;KAC3B,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;QACvB,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACf,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,qBAAqB,CAAC;QACxC,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC;QAC5C,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAgC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;AAC5K,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;QACvB,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC;QACtC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;QAC3C,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC;QAChD,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;QAC7C,eAAe,EAAE,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC;aACpC,GAAG,CAAC,UAAU,CAAC;aACf,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;QAC7C,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAC5D,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO;QACL,eAAe,EAAE,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC;QACvC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;QACvB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAA4B;QAC5C,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QACjB,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;AACtH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QACnB,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC;QACxC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3B,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC;QACrC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;QACvC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC;QAClD,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;AACtH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;QACzB,cAAc,EAAE,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC;QACzC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC7B,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;QACzB,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9B,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;QACzB,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC;QAC1C,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QACxB,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC;QAC9C,gBAAgB,EAAE,oBAAoB,CAAC,CAAC,CAAC,gBAAgB,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;AAChD,CAAC","sourcesContent":["// The wire forms of the DTOs. Both SignalR protocols are decoded to plain objects first — JSON with camelCase names\n// (System.Text.Json, G9SyncJsonContext), MessagePack with the PascalCase names Nerdbank.MessagePack writes, GUIDs as\n// extension type 2 (16 big-endian bytes) and DateTime as the timestamp extension — then normalised here into the DTO\n// interfaces, with every missing field defaulted the way .NET's initialisers default it.\nimport { G9Long, longToNumber } from '../abstractions/long.js';\nimport { tryNormalizeGuid } from '../abstractions/guid.js';\nimport { base64ToBytes } from '../internal/base64.js';\nimport type {\n G9DtAcceptedRows,\n G9DtChangesAvailable,\n G9DtColumnModel,\n G9DtColumnTypeMismatch,\n G9DtCommandResult,\n G9DtHelloResult,\n G9DtNegotiatedTable,\n G9DtPlannedPart,\n G9DtPullContinuation,\n G9DtPullPlan,\n G9DtPushResult,\n G9DtReconcileSummary,\n G9DtRowConflict,\n G9DtRowRejection,\n G9DtSubscriptionCursor,\n G9DtSubscriptionDefinition,\n G9DtSubscriptionState,\n G9DtSyncChunk,\n G9DtSyncError,\n G9DtTableBuckets,\n} from './dtos.js';\n\n/** Which SignalR hub protocol a value came from or goes to. */\nexport type G9WireFormat = 'json' | 'messagepack';\n\n/** A GUID on its way into MessagePack (written as extension type 2, 16 big-endian bytes, like Nerdbank's Guid converter). */\nexport class G9WireGuid {\n readonly value: string;\n\n constructor(value: string) {\n this.value = value;\n }\n}\n\n/** Nerdbank.MessagePack's extension type for System.Guid. */\nexport const GUID_EXTENSION_TYPE = 2;\n\ntype Plain = { [key: string]: unknown };\n\nfunction isPlainObject(value: unknown): value is Plain {\n return typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof Uint8Array) && !(value instanceof G9Long) && !(value instanceof Date) && !(value instanceof G9WireGuid);\n}\n\nfunction lowerFirst(name: string): string {\n return name.length === 0 ? name : name.charAt(0).toLowerCase() + name.slice(1);\n}\n\nfunction upperFirst(name: string): string {\n return name.length === 0 ? name : name.charAt(0).toUpperCase() + name.slice(1);\n}\n\n/** The camelCase twin of a decoded MessagePack value (a `Parameters` dictionary keeps its own keys). */\nexport function fromMessagePackNames(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(fromMessagePackNames);\n if (!isPlainObject(value)) return value;\n const out: Plain = {};\n for (const key of Object.keys(value)) {\n const item = value[key];\n out[lowerFirst(key)] = key === 'Parameters' && isPlainObject(item) ? copyDictionary(item) : fromMessagePackNames(item);\n }\n return out;\n}\n\n/**\n * The MessagePack form of an outgoing DTO: PascalCase names (a `parameters` dictionary keeps its keys), GUID fields as\n * {@link G9WireGuid}. G9Long values stay as they are (the protocol writes them as int64).\n */\nexport function toMessagePackNames(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(toMessagePackNames);\n if (!isPlainObject(value)) return value;\n const out: Plain = {};\n for (const key of Object.keys(value)) {\n const item = value[key];\n if (item === undefined) continue;\n let mapped: unknown;\n if (key === 'parameters' && isPlainObject(item)) mapped = copyDictionary(item);\n else if (GUID_FIELDS[key] === true && typeof item === 'string') mapped = new G9WireGuid(item);\n else mapped = toMessagePackNames(item);\n out[upperFirst(key)] = mapped;\n }\n return out;\n}\n\n/** DTO fields typed System.Guid on the .NET side. */\nconst GUID_FIELDS: { [key: string]: true } = { clientId: true, commandId: true, epoch: true };\n\nfunction copyDictionary(value: Plain): { [key: string]: string } {\n const out: { [key: string]: string } = {};\n for (const key of Object.keys(value)) out[key] = String(value[key]);\n return out;\n}\n\n// ---------------------------------------------------------------- field readers\n\nfunction obj(value: unknown): Plain {\n return isPlainObject(value) ? value : {};\n}\n\nfunction str(value: unknown, fallback = ''): string {\n return typeof value === 'string' ? value : fallback;\n}\n\nfunction optStr(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\nfunction num(value: unknown): number {\n return value === null || value === undefined ? 0 : longToNumber(value);\n}\n\nfunction bool(value: unknown): boolean {\n return value === true;\n}\n\nfunction long(value: unknown): G9Long {\n if (value instanceof G9Long) return value;\n if (typeof value === 'number') return G9Long.fromNumber(value);\n if (typeof value === 'string' && value !== '') return G9Long.parse(value);\n return G9Long.ZERO;\n}\n\nfunction arr(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction strings(value: unknown): string[] {\n return arr(value).map((v) => str(v));\n}\n\nfunction guid(value: unknown): string {\n if (value instanceof G9WireGuid) return value.value;\n if (typeof value === 'string') return tryNormalizeGuid(value) ?? value;\n return '00000000-0000-0000-0000-000000000000';\n}\n\n/** A byte[] field: base64 text (JSON) or bytes (MessagePack). */\nexport function bytesField(value: unknown): Uint8Array | null {\n if (value instanceof Uint8Array) return value;\n if (typeof value === 'string') return base64ToBytes(value);\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n return null;\n}\n\n/** Epoch milliseconds of a wire DateTime: ISO text (JSON) or a Date (MessagePack timestamp). */\nexport function dateTimeMs(value: unknown): number {\n if (value instanceof Date) return value.getTime();\n if (typeof value === 'number') return value;\n if (typeof value !== 'string') return 0;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})[T ](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d+))?)?(Z|[+-]\\d{2}:?\\d{2})?$/.exec(value.trim());\n if (!m) return 0;\n const fraction = m[7] ? (m[7] + '00').slice(0, 3) : '0';\n let ms = Date.UTC(+(m[1] as string), +(m[2] as string) - 1, +(m[3] as string), +(m[4] as string), +(m[5] as string), m[6] ? +m[6] : 0, +fraction);\n // Date.UTC maps years 0..99 to 1900..1999.\n if (+(m[1] as string) < 100) {\n const date = new Date(ms);\n date.setUTCFullYear(+(m[1] as string));\n ms = date.getTime();\n }\n const zone = m[8];\n if (zone && zone !== 'Z') {\n const sign = zone.charAt(0) === '-' ? -1 : 1;\n const digits = zone.slice(1).replace(':', '');\n ms -= sign * (+digits.slice(0, 2) * 60 + +digits.slice(2, 4)) * 60000;\n }\n return ms;\n}\n\n// ---------------------------------------------------------------- DTO readers (camelCase input)\n\nexport function readSyncError(value: unknown): G9DtSyncError | null {\n if (!isPlainObject(value)) return null;\n return { code: str(value.code, 'G9S-SRV-ERROR'), message: str(value.message), retryable: bool(value.retryable), details: optStr(value.details) };\n}\n\nfunction readColumn(value: unknown): G9DtColumnModel {\n const v = obj(value);\n return { name: str(v.name), type: num(v.type) as G9DtColumnModel['type'], nullable: bool(v.nullable) };\n}\n\nfunction readMismatch(value: unknown): G9DtColumnTypeMismatch {\n const v = obj(value);\n return { name: str(v.name), clientType: num(v.clientType) as G9DtColumnTypeMismatch['clientType'], serverType: num(v.serverType) as G9DtColumnTypeMismatch['serverType'] };\n}\n\nexport function readNegotiatedTable(value: unknown): G9DtNegotiatedTable {\n const v = obj(value);\n return {\n tableId: num(v.tableId),\n name: str(v.name),\n keyColumn: str(v.keyColumn),\n keyType: num(v.keyType) as G9DtNegotiatedTable['keyType'],\n columns: arr(v.columns).map(readColumn),\n computedColumns: strings(v.computedColumns),\n readOnlyColumns: strings(v.readOnlyColumns),\n missingColumns: strings(v.missingColumns),\n typeMismatchColumns: arr(v.typeMismatchColumns).map(readMismatch),\n direction: num(v.direction) as G9DtNegotiatedTable['direction'],\n conflictPolicy: num(v.conflictPolicy) as G9DtNegotiatedTable['conflictPolicy'],\n };\n}\n\nexport function readSubscriptionDefinition(value: unknown): G9DtSubscriptionDefinition {\n const v = obj(value);\n return {\n name: str(v.name),\n parameters: arr(v.parameters).map((p) => {\n const d = obj(p);\n return { name: str(d.name), type: num(d.type) as G9DtColumnModel['type'], required: bool(d.required), isList: bool(d.isList) };\n }),\n dependsOn: arr(v.dependsOn).map((p) => {\n const d = obj(p);\n return { name: str(d.name), required: d.required === undefined ? true : bool(d.required) };\n }),\n tables: strings(v.tables),\n ephemeral: bool(v.ephemeral),\n ttlSeconds: num(v.ttlSeconds),\n heavy: bool(v.heavy),\n moveOutPolicy: num(v.moveOutPolicy) as G9DtSubscriptionDefinition['moveOutPolicy'],\n reconcileIntervalMinutes: num(v.reconcileIntervalMinutes),\n definitionHash: str(v.definitionHash),\n };\n}\n\nexport function readSubscriptionState(value: unknown): G9DtSubscriptionState {\n const v = obj(value);\n return {\n key: str(v.key),\n action: num(v.action) as G9DtSubscriptionState['action'],\n definitionHash: optStr(v.definitionHash),\n authHash: optStr(v.authHash),\n message: optStr(v.message),\n };\n}\n\nexport function readHelloResult(value: unknown): G9DtHelloResult {\n const v = obj(value);\n return {\n epoch: guid(v.epoch),\n serverTimeUtcMs: dateTimeMs(v.serverTimeUtc),\n protocolVersion: v.protocolVersion === undefined ? 1 : num(v.protocolVersion),\n tables: arr(v.tables).map(readNegotiatedTable),\n unknownTables: strings(v.unknownTables),\n definitions: arr(v.definitions).map(readSubscriptionDefinition),\n subscriptions: arr(v.subscriptions).map(readSubscriptionState),\n maxPushRows: num(v.maxPushRows),\n maxPushBytes: num(v.maxPushBytes),\n error: readSyncError(v.error),\n };\n}\n\nfunction readAccepted(value: unknown): G9DtAcceptedRows {\n const v = obj(value);\n return { tableId: num(v.tableId), keys: strings(v.keys), versions: arr(v.versions).map(num), deleted: arr(v.deleted).map(bool) };\n}\n\nfunction readRejection(value: unknown): G9DtRowRejection {\n const v = obj(value);\n return {\n tableId: num(v.tableId),\n key: str(v.key),\n code: str(v.code, 'G9S-REJ-CONSTRAINT'),\n message: optStr(v.message),\n sqlState: optStr(v.sqlState),\n constraint: optStr(v.constraint),\n column: optStr(v.column),\n details: optStr(v.details),\n };\n}\n\nfunction readConflict(value: unknown): G9DtRowConflict {\n const v = obj(value);\n return {\n tableId: num(v.tableId),\n key: str(v.key),\n code: str(v.code, 'G9S-CON-SERVER-WINS'),\n serverChangedMask: long(v.serverChangedMask),\n partiallyApplied: bool(v.partiallyApplied),\n };\n}\n\nfunction readCommandResult(value: unknown): G9DtCommandResult {\n const v = obj(value);\n return { commandId: guid(v.commandId), status: num(v.status) as G9DtCommandResult['status'], code: optStr(v.code), message: optStr(v.message), result: optStr(v.result) };\n}\n\nexport function readPushResult(value: unknown): G9DtPushResult {\n const v = obj(value);\n return {\n batchId: num(v.batchId),\n alreadyApplied: bool(v.alreadyApplied),\n accepted: arr(v.accepted).map(readAccepted),\n rejections: arr(v.rejections).map(readRejection),\n conflicts: arr(v.conflicts).map(readConflict),\n canonicalFrames: arr(v.canonicalFrames)\n .map(bytesField)\n .filter((b): b is Uint8Array => b !== null),\n commandResults: arr(v.commandResults).map(readCommandResult),\n error: readSyncError(v.error),\n };\n}\n\nfunction readPlannedPart(value: unknown): G9DtPlannedPart {\n const v = obj(value);\n return {\n subscriptionKey: str(v.subscriptionKey),\n tableId: num(v.tableId),\n kind: num(v.kind) as G9DtPlannedPart['kind'],\n rows: num(v.rows),\n estimatedBytes: num(v.estimatedBytes),\n };\n}\n\nfunction readCursor(value: unknown): G9DtSubscriptionCursor {\n const v = obj(value);\n return { key: str(v.key), cursor: str(v.cursor), definitionHash: str(v.definitionHash), authHash: str(v.authHash) };\n}\n\nexport function readPullPlan(value: unknown): G9DtPullPlan {\n const v = obj(value);\n return {\n token: str(v.token),\n parts: arr(v.parts).map(readPlannedPart),\n totalRows: num(v.totalRows),\n estimatedBytes: num(v.estimatedBytes),\n cursors: arr(v.cursors).map(readCursor),\n skipped: arr(v.skipped).map(readSubscriptionState),\n error: readSyncError(v.error),\n };\n}\n\nexport function readContinuation(value: unknown): G9DtPullContinuation | null {\n if (!isPlainObject(value)) return null;\n return { partIndex: num(value.partIndex), afterKey: optStr(value.afterKey), nextSequence: num(value.nextSequence) };\n}\n\nfunction readBuckets(value: unknown): G9DtTableBuckets {\n const v = obj(value);\n return { tableId: num(v.tableId), buckets: arr(v.buckets).map(num) };\n}\n\nexport function readReconcileSummary(value: unknown): G9DtReconcileSummary | null {\n if (!isPlainObject(value)) return null;\n return {\n cursor: str(value.cursor),\n definitionHash: str(value.definitionHash),\n authHash: str(value.authHash),\n mismatched: arr(value.mismatched).map(readBuckets),\n };\n}\n\nexport function readSyncChunk(value: unknown): G9DtSyncChunk {\n const v = obj(value);\n return {\n sequence: num(v.sequence),\n payload: bytesField(v.payload),\n rowCount: num(v.rowCount),\n subscriptionKey: optStr(v.subscriptionKey),\n isFinal: bool(v.isFinal),\n continuation: readContinuation(v.continuation),\n reconcileSummary: readReconcileSummary(v.reconcileSummary),\n };\n}\n\nexport function readChangesAvailable(value: unknown): G9DtChangesAvailable {\n return { tables: strings(obj(value).tables) };\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// @g9tm/syncdata/signalr — the SignalR transport (twin of G9SyncData.Client.SignalR). Needs the optional peers
|
|
2
|
+
// @microsoft/signalr, @microsoft/signalr-protocol-msgpack, @msgpack/msgpack and @g9tm/signalr-supernetcore-client.
|
|
3
|
+
export { G9ESyncHubProtocol, G9SignalRSyncTransport, mapError } from './transport.js';
|
|
4
|
+
export { createSyncMessagePackProtocol, G9SyncJsonHubProtocol } from './protocols.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/signalr/index.ts"],"names":[],"mappings":"AAAA,+GAA+G;AAC/G,mHAAmH;AACnH,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,QAAQ,EAAsC,MAAM,gBAAgB,CAAC;AAC1H,OAAO,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC","sourcesContent":["// @g9tm/syncdata/signalr — the SignalR transport (twin of G9SyncData.Client.SignalR). Needs the optional peers\n// @microsoft/signalr, @microsoft/signalr-protocol-msgpack, @msgpack/msgpack and @g9tm/signalr-supernetcore-client.\nexport { G9ESyncHubProtocol, G9SignalRSyncTransport, mapError, type G9SignalRSyncTransportOptions } from './transport.js';\nexport { createSyncMessagePackProtocol, G9SyncJsonHubProtocol } from './protocols.js';\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { MessageType, TransferFormat, type HubMessage, type IHubProtocol, type ILogger } from '@microsoft/signalr';
|
|
2
|
+
/** SignalR's JSON hub protocol with exact int64 values (G9Long) and base64 byte arrays. */
|
|
3
|
+
export declare class G9SyncJsonHubProtocol implements IHubProtocol {
|
|
4
|
+
readonly name = "json";
|
|
5
|
+
readonly version = 2;
|
|
6
|
+
readonly transferFormat = TransferFormat.Text;
|
|
7
|
+
parseMessages(input: string | ArrayBuffer, _logger: ILogger | null): HubMessage[];
|
|
8
|
+
writeMessage(message: HubMessage): string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* SignalR's MessagePack hub protocol for the sync hub. Its encoder and decoder are @msgpack/msgpack instances the
|
|
12
|
+
* protocol keeps privately; this sets their int64 paths so G9Long values are written exactly (int 64) and integers beyond
|
|
13
|
+
* ±(2^53 − 1) are read as G9Long. A protocol build whose internals moved fails here, at creation, never silently.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createSyncMessagePackProtocol(): IHubProtocol;
|
|
16
|
+
/** Message types the transport looks at (re-exported so callers need not import @microsoft/signalr). */
|
|
17
|
+
export { MessageType };
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// The two SignalR hub protocols of the sync hub, with the wire forms the .NET server reads and writes:
|
|
2
|
+
// - JSON: SignalR's JSON protocol, except that int64 values stay exact both ways (reconciliation digests are full 64-bit
|
|
3
|
+
// numbers; JSON.parse would round them) and byte arrays travel as base64, as System.Text.Json writes them.
|
|
4
|
+
// - MessagePack: SignalR's MessagePack protocol (@microsoft/signalr-protocol-msgpack) with GUIDs as Nerdbank's extension
|
|
5
|
+
// type 2 and int64 values exact (its decoder would round them; there is no BigInt on Lynx).
|
|
6
|
+
import { MessageType, TransferFormat } from '@microsoft/signalr';
|
|
7
|
+
import { MessagePackHubProtocol } from '@microsoft/signalr-protocol-msgpack';
|
|
8
|
+
import { ExtensionCodec } from '@msgpack/msgpack';
|
|
9
|
+
import { readGuidBytes, writeGuidBytes } from '../abstractions/guid.js';
|
|
10
|
+
import { G9Long, parseJson, replaceLongSentinels } from '../abstractions/long.js';
|
|
11
|
+
import { bytesToBase64 } from '../internal/base64.js';
|
|
12
|
+
import { G9WireGuid, GUID_EXTENSION_TYPE } from '../protocol/wire.js';
|
|
13
|
+
const RECORD_SEPARATOR = '\u001e';
|
|
14
|
+
/** SignalR's JSON hub protocol with exact int64 values (G9Long) and base64 byte arrays. */
|
|
15
|
+
export class G9SyncJsonHubProtocol {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.name = 'json';
|
|
18
|
+
this.version = 2;
|
|
19
|
+
this.transferFormat = TransferFormat.Text;
|
|
20
|
+
}
|
|
21
|
+
parseMessages(input, _logger) {
|
|
22
|
+
if (typeof input !== 'string')
|
|
23
|
+
throw new Error('Invalid input for JSON hub protocol. Expected a string.');
|
|
24
|
+
if (!input)
|
|
25
|
+
return [];
|
|
26
|
+
if (input.charAt(input.length - 1) !== RECORD_SEPARATOR)
|
|
27
|
+
throw new Error('Message is incomplete.');
|
|
28
|
+
const messages = input.split(RECORD_SEPARATOR);
|
|
29
|
+
messages.pop();
|
|
30
|
+
const out = [];
|
|
31
|
+
for (const text of messages) {
|
|
32
|
+
const message = parseJson(text);
|
|
33
|
+
if (typeof message !== 'object' || message === null || typeof message.type !== 'number')
|
|
34
|
+
throw new Error('Invalid payload.');
|
|
35
|
+
out.push(message);
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
writeMessage(message) {
|
|
40
|
+
const text = JSON.stringify(message, (_key, value) => {
|
|
41
|
+
if (value instanceof Uint8Array)
|
|
42
|
+
return bytesToBase64(value);
|
|
43
|
+
if (value instanceof G9WireGuid)
|
|
44
|
+
return value.value;
|
|
45
|
+
return value;
|
|
46
|
+
});
|
|
47
|
+
return replaceLongSentinels(text) + RECORD_SEPARATOR;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** The extension codec: GUIDs as Nerdbank's extension type 2 (16 big-endian bytes). */
|
|
51
|
+
function syncExtensionCodec() {
|
|
52
|
+
const codec = new ExtensionCodec();
|
|
53
|
+
codec.register({
|
|
54
|
+
type: GUID_EXTENSION_TYPE,
|
|
55
|
+
encode: (value) => {
|
|
56
|
+
if (!(value instanceof G9WireGuid))
|
|
57
|
+
return null;
|
|
58
|
+
const bytes = new Uint8Array(16);
|
|
59
|
+
writeGuidBytes(value.value, bytes, 0);
|
|
60
|
+
return bytes;
|
|
61
|
+
},
|
|
62
|
+
decode: (data) => new G9WireGuid(readGuidBytes(data, 0)),
|
|
63
|
+
});
|
|
64
|
+
return codec;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* SignalR's MessagePack hub protocol for the sync hub. Its encoder and decoder are @msgpack/msgpack instances the
|
|
68
|
+
* protocol keeps privately; this sets their int64 paths so G9Long values are written exactly (int 64) and integers beyond
|
|
69
|
+
* ±(2^53 − 1) are read as G9Long. A protocol build whose internals moved fails here, at creation, never silently.
|
|
70
|
+
*/
|
|
71
|
+
export function createSyncMessagePackProtocol() {
|
|
72
|
+
const protocol = new MessagePackHubProtocol({ extensionCodec: syncExtensionCodec() });
|
|
73
|
+
const internals = protocol;
|
|
74
|
+
const encoder = internals._encoder;
|
|
75
|
+
const decoder = internals._decoder;
|
|
76
|
+
if (!encoder || typeof encoder.doEncode !== 'function' || !decoder || typeof decoder.readI64 !== 'function') {
|
|
77
|
+
throw new Error('@microsoft/signalr-protocol-msgpack changed its internals: the sync protocol cannot keep int64 values exact.');
|
|
78
|
+
}
|
|
79
|
+
const doEncode = encoder.doEncode;
|
|
80
|
+
encoder.doEncode = function (object, depth) {
|
|
81
|
+
if (object instanceof G9Long) {
|
|
82
|
+
this.ensureBufferSizeToWrite(9);
|
|
83
|
+
this.writeU8(0xd3);
|
|
84
|
+
this.writeI32(object.hi);
|
|
85
|
+
this.writeU32(object.lo);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
doEncode.call(this, object, depth);
|
|
89
|
+
};
|
|
90
|
+
decoder.readU64 = function () {
|
|
91
|
+
const hi = this.view.getUint32(this.pos);
|
|
92
|
+
const lo = this.view.getUint32(this.pos + 4);
|
|
93
|
+
this.pos += 8;
|
|
94
|
+
// An unsigned value above int64's range does not occur on this wire; it is read as its bits.
|
|
95
|
+
const value = new G9Long(hi, lo);
|
|
96
|
+
return hi < 0x200000 ? value.toNumber() : value;
|
|
97
|
+
};
|
|
98
|
+
decoder.readI64 = function () {
|
|
99
|
+
const hi = this.view.getInt32(this.pos);
|
|
100
|
+
const lo = this.view.getUint32(this.pos + 4);
|
|
101
|
+
this.pos += 8;
|
|
102
|
+
const value = new G9Long(hi, lo);
|
|
103
|
+
return value.isSafe() ? value.toNumber() : value;
|
|
104
|
+
};
|
|
105
|
+
return protocol;
|
|
106
|
+
}
|
|
107
|
+
/** Message types the transport looks at (re-exported so callers need not import @microsoft/signalr). */
|
|
108
|
+
export { MessageType };
|
|
109
|
+
//# sourceMappingURL=protocols.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocols.js","sourceRoot":"","sources":["../../src/signalr/protocols.ts"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,0HAA0H;AAC1H,8GAA8G;AAC9G,0HAA0H;AAC1H,+FAA+F;AAC/F,OAAO,EAAE,WAAW,EAAE,cAAc,EAAoD,MAAM,oBAAoB,CAAC;AACnH,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEtE,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAElC,2FAA2F;AAC3F,MAAM,OAAO,qBAAqB;IAAlC;QACW,SAAI,GAAG,MAAM,CAAC;QACd,YAAO,GAAG,CAAC,CAAC;QACZ,mBAAc,GAAG,cAAc,CAAC,IAAI,CAAC;IAyBhD,CAAC;IAvBC,aAAa,CAAC,KAA2B,EAAE,OAAuB;QAChE,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC1G,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,gBAAgB;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACnG,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC/C,QAAQ,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,GAAG,GAAiB,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAe,CAAC;YAC9C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAQ,OAA8B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACrJ,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,YAAY,CAAC,OAAmB;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,KAAc,EAAE,EAAE;YAC5D,IAAI,KAAK,YAAY,UAAU;gBAAE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7D,IAAI,KAAK,YAAY,UAAU;gBAAE,OAAO,KAAK,CAAC,KAAK,CAAC;YACpD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QACH,OAAO,oBAAoB,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC;IACvD,CAAC;CACF;AAED,uFAAuF;AACvF,SAAS,kBAAkB;IACzB,MAAM,KAAK,GAAG,IAAI,cAAc,EAAE,CAAC;IACnC,KAAK,CAAC,QAAQ,CAAC;QACb,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,CAAC,KAAc,EAAE,EAAE;YACzB,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC;gBAAE,OAAO,IAAI,CAAC;YAChD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;YACjC,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,EAAE,CAAC,IAAgB,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;KACrE,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAiBD;;;;GAIG;AACH,MAAM,UAAU,6BAA6B;IAC3C,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;IACtF,MAAM,SAAS,GAAG,QAAmF,CAAC;IACtG,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC;IACnC,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC;IACnC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QAC5G,MAAM,IAAI,KAAK,CAAC,8GAA8G,CAAC,CAAC;IAClI,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,OAAO,CAAC,QAAQ,GAAG,UAAkC,MAAe,EAAE,KAAa;QACjF,IAAI,MAAM,YAAY,MAAM,EAAE,CAAC;YAC7B,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACnB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC;IACF,OAAO,CAAC,OAAO,GAAG;QAChB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACd,6FAA6F;QAC7F,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACjC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAClD,CAAC,CAAC;IACF,OAAO,CAAC,OAAO,GAAG;QAChB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACd,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACnD,CAAC,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,wGAAwG;AACxG,OAAO,EAAE,WAAW,EAAE,CAAC","sourcesContent":["// The two SignalR hub protocols of the sync hub, with the wire forms the .NET server reads and writes:\n// - JSON: SignalR's JSON protocol, except that int64 values stay exact both ways (reconciliation digests are full 64-bit\n// numbers; JSON.parse would round them) and byte arrays travel as base64, as System.Text.Json writes them.\n// - MessagePack: SignalR's MessagePack protocol (@microsoft/signalr-protocol-msgpack) with GUIDs as Nerdbank's extension\n// type 2 and int64 values exact (its decoder would round them; there is no BigInt on Lynx).\nimport { MessageType, TransferFormat, type HubMessage, type IHubProtocol, type ILogger } from '@microsoft/signalr';\nimport { MessagePackHubProtocol } from '@microsoft/signalr-protocol-msgpack';\nimport { ExtensionCodec } from '@msgpack/msgpack';\nimport { readGuidBytes, writeGuidBytes } from '../abstractions/guid.js';\nimport { G9Long, parseJson, replaceLongSentinels } from '../abstractions/long.js';\nimport { bytesToBase64 } from '../internal/base64.js';\nimport { G9WireGuid, GUID_EXTENSION_TYPE } from '../protocol/wire.js';\n\nconst RECORD_SEPARATOR = '\\u001e';\n\n/** SignalR's JSON hub protocol with exact int64 values (G9Long) and base64 byte arrays. */\nexport class G9SyncJsonHubProtocol implements IHubProtocol {\n readonly name = 'json';\n readonly version = 2;\n readonly transferFormat = TransferFormat.Text;\n\n parseMessages(input: string | ArrayBuffer, _logger: ILogger | null): HubMessage[] {\n if (typeof input !== 'string') throw new Error('Invalid input for JSON hub protocol. Expected a string.');\n if (!input) return [];\n if (input.charAt(input.length - 1) !== RECORD_SEPARATOR) throw new Error('Message is incomplete.');\n const messages = input.split(RECORD_SEPARATOR);\n messages.pop();\n const out: HubMessage[] = [];\n for (const text of messages) {\n const message = parseJson(text) as HubMessage;\n if (typeof message !== 'object' || message === null || typeof (message as { type?: unknown }).type !== 'number') throw new Error('Invalid payload.');\n out.push(message);\n }\n return out;\n }\n\n writeMessage(message: HubMessage): string {\n const text = JSON.stringify(message, (_key, value: unknown) => {\n if (value instanceof Uint8Array) return bytesToBase64(value);\n if (value instanceof G9WireGuid) return value.value;\n return value;\n });\n return replaceLongSentinels(text) + RECORD_SEPARATOR;\n }\n}\n\n/** The extension codec: GUIDs as Nerdbank's extension type 2 (16 big-endian bytes). */\nfunction syncExtensionCodec(): ExtensionCodec {\n const codec = new ExtensionCodec();\n codec.register({\n type: GUID_EXTENSION_TYPE,\n encode: (value: unknown) => {\n if (!(value instanceof G9WireGuid)) return null;\n const bytes = new Uint8Array(16);\n writeGuidBytes(value.value, bytes, 0);\n return bytes;\n },\n decode: (data: Uint8Array) => new G9WireGuid(readGuidBytes(data, 0)),\n });\n return codec;\n}\n\ninterface EncoderInternals {\n doEncode(object: unknown, depth: number): void;\n ensureBufferSizeToWrite(size: number): void;\n writeU8(value: number): void;\n writeI32(value: number): void;\n writeU32(value: number): void;\n}\n\ninterface DecoderInternals {\n view: DataView;\n pos: number;\n readU64(): unknown;\n readI64(): unknown;\n}\n\n/**\n * SignalR's MessagePack hub protocol for the sync hub. Its encoder and decoder are @msgpack/msgpack instances the\n * protocol keeps privately; this sets their int64 paths so G9Long values are written exactly (int 64) and integers beyond\n * ±(2^53 − 1) are read as G9Long. A protocol build whose internals moved fails here, at creation, never silently.\n */\nexport function createSyncMessagePackProtocol(): IHubProtocol {\n const protocol = new MessagePackHubProtocol({ extensionCodec: syncExtensionCodec() });\n const internals = protocol as unknown as { _encoder?: EncoderInternals; _decoder?: DecoderInternals };\n const encoder = internals._encoder;\n const decoder = internals._decoder;\n if (!encoder || typeof encoder.doEncode !== 'function' || !decoder || typeof decoder.readI64 !== 'function') {\n throw new Error('@microsoft/signalr-protocol-msgpack changed its internals: the sync protocol cannot keep int64 values exact.');\n }\n const doEncode = encoder.doEncode;\n encoder.doEncode = function (this: EncoderInternals, object: unknown, depth: number): void {\n if (object instanceof G9Long) {\n this.ensureBufferSizeToWrite(9);\n this.writeU8(0xd3);\n this.writeI32(object.hi);\n this.writeU32(object.lo);\n return;\n }\n doEncode.call(this, object, depth);\n };\n decoder.readU64 = function (this: DecoderInternals): unknown {\n const hi = this.view.getUint32(this.pos);\n const lo = this.view.getUint32(this.pos + 4);\n this.pos += 8;\n // An unsigned value above int64's range does not occur on this wire; it is read as its bits.\n const value = new G9Long(hi, lo);\n return hi < 0x200000 ? value.toNumber() : value;\n };\n decoder.readI64 = function (this: DecoderInternals): unknown {\n const hi = this.view.getInt32(this.pos);\n const lo = this.view.getUint32(this.pos + 4);\n this.pos += 8;\n const value = new G9Long(hi, lo);\n return value.isSafe() ? value.toNumber() : value;\n };\n return protocol;\n}\n\n/** Message types the transport looks at (re-exported so callers need not import @microsoft/signalr). */\nexport { MessageType };\n"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { G9Client, type G9ClientOptions } from '@g9tm/signalr-supernetcore-client';
|
|
2
|
+
import { G9SyncException } from '../abstractions/errors.js';
|
|
3
|
+
import type { G9SyncTransport } from '../client/transport.js';
|
|
4
|
+
import type { G9DtChangesAvailable, G9DtFetchRowsRequest, G9DtHelloRequest, G9DtHelloResult, G9DtPullContinuation, G9DtPullPlan, G9DtPullRequest, G9DtPushRequest, G9DtPushResult, G9DtReconcileRequest, G9DtSyncChunk } from '../protocol/dtos.js';
|
|
5
|
+
import { type G9WireFormat } from '../protocol/wire.js';
|
|
6
|
+
/** The SignalR hub protocol a client speaks (`G9ESyncHubProtocol`). The server accepts both. */
|
|
7
|
+
export declare const G9ESyncHubProtocol: {
|
|
8
|
+
/** Text frames; payloads base64-encoded (+33%). Readable in traces. */
|
|
9
|
+
readonly Json: 0;
|
|
10
|
+
/** Binary frames: payloads as raw bytes. The default. */
|
|
11
|
+
readonly MessagePack: 1;
|
|
12
|
+
};
|
|
13
|
+
export type G9ESyncHubProtocol = (typeof G9ESyncHubProtocol)[keyof typeof G9ESyncHubProtocol];
|
|
14
|
+
/** Options of {@link G9SignalRSyncTransport} (`G9CSignalRSyncTransportOptions`). Durations are milliseconds. */
|
|
15
|
+
export interface G9SignalRSyncTransportOptions {
|
|
16
|
+
/** Absolute hub URL, e.g. `https://sync.example.com/g9sync`. */
|
|
17
|
+
url: string;
|
|
18
|
+
/** Hub protocol; MessagePack by default. */
|
|
19
|
+
protocol?: G9ESyncHubProtocol;
|
|
20
|
+
/** Supplies the bearer token for every (re)connect. */
|
|
21
|
+
accessTokenFactory?: () => string | Promise<string>;
|
|
22
|
+
/** SignalR stateful reconnect (ADR-0069); off by default, the server must allow it too. */
|
|
23
|
+
statefulReconnect?: boolean;
|
|
24
|
+
/** How long one connect may take before it counts as a network failure. */
|
|
25
|
+
connectTimeoutMs?: number;
|
|
26
|
+
serverTimeoutMs?: number;
|
|
27
|
+
keepAliveIntervalMs?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Everything else the G9 client takes (transport, headers, WebSocket constructor, skipNegotiation, reconnect policy, log
|
|
30
|
+
* level…) — the twin of ConfigureHttpConnection/ConfigureBuilder. `url`, `protocol` and the timeouts above win.
|
|
31
|
+
*/
|
|
32
|
+
client?: Partial<G9ClientOptions>;
|
|
33
|
+
/** Builds the client (tests, hosts with their own wiring); `new G9Client(options)` by default. */
|
|
34
|
+
createClient?: (options: G9ClientOptions) => G9Client;
|
|
35
|
+
}
|
|
36
|
+
/** The SignalR implementation of {@link G9SyncTransport}. */
|
|
37
|
+
export declare class G9SignalRSyncTransport implements G9SyncTransport {
|
|
38
|
+
readonly client: G9Client;
|
|
39
|
+
readonly format: G9WireFormat;
|
|
40
|
+
private readonly _options;
|
|
41
|
+
private readonly _handlers;
|
|
42
|
+
private _connecting;
|
|
43
|
+
constructor(options: G9SignalRSyncTransportOptions);
|
|
44
|
+
get isConnected(): boolean;
|
|
45
|
+
onChangesAvailable(handler: (changes: G9DtChangesAvailable) => void): () => void;
|
|
46
|
+
/** Connects (joins a connect in progress); a connect that takes longer than connectTimeoutMs is a network failure. */
|
|
47
|
+
connect(signal?: AbortSignal): Promise<void>;
|
|
48
|
+
private _connectCore;
|
|
49
|
+
hello(request: G9DtHelloRequest, signal?: AbortSignal): Promise<G9DtHelloResult>;
|
|
50
|
+
push(request: G9DtPushRequest, chunks: AsyncIterable<G9DtSyncChunk>, signal?: AbortSignal): Promise<G9DtPushResult>;
|
|
51
|
+
planPull(request: G9DtPullRequest, signal?: AbortSignal): Promise<G9DtPullPlan>;
|
|
52
|
+
pull(token: string, continuation: G9DtPullContinuation | null, signal?: AbortSignal): AsyncIterable<G9DtSyncChunk>;
|
|
53
|
+
reconcile(request: G9DtReconcileRequest, signal?: AbortSignal): AsyncIterable<G9DtSyncChunk>;
|
|
54
|
+
fetchRows(request: G9DtFetchRowsRequest, signal?: AbortSignal): AsyncIterable<G9DtSyncChunk>;
|
|
55
|
+
dispose(): Promise<void>;
|
|
56
|
+
private _wire;
|
|
57
|
+
private _read;
|
|
58
|
+
private _invoke;
|
|
59
|
+
private _stream;
|
|
60
|
+
private _onChanges;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The sync exception for a transport failure (`Map`): the server's `[G9S|code|retryable]` marker wins; any other hub
|
|
64
|
+
* error is a retryable server error; 401/403 is Unauthorized; the rest is a retryable network failure. Null leaves the
|
|
65
|
+
* error as it is (an already mapped one).
|
|
66
|
+
*/
|
|
67
|
+
export declare function mapError(error: unknown, canceled: boolean): G9SyncException | null;
|