@g9tm/syncdata 1.5.0 → 1.5.2
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 -21
- package/PARITY.md +96 -96
- package/README.md +71 -71
- package/THIRD-PARTY-NOTICES.md +31 -31
- package/dist/abstractions/digest.js.map +1 -1
- package/dist/abstractions/enums.js.map +1 -1
- package/dist/abstractions/errors.js.map +1 -1
- package/dist/abstractions/guid.js.map +1 -1
- package/dist/abstractions/key.js.map +1 -1
- package/dist/abstractions/long.js.map +1 -1
- package/dist/abstractions/parameters.js.map +1 -1
- package/dist/brotli-js/decode.js.map +1 -1
- package/dist/brotli-js/index.js.map +1 -1
- package/dist/client/engine.js.map +1 -1
- package/dist/client/model.js.map +1 -1
- package/dist/client/progress.js.map +1 -1
- package/dist/client/runs.js.map +1 -1
- package/dist/client/storeTypes.js.map +1 -1
- package/dist/client/transport.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/abort.js.map +1 -1
- package/dist/internal/base64.js.map +1 -1
- package/dist/internal/dotnetFormat.js.map +1 -1
- package/dist/internal/md5.js.map +1 -1
- package/dist/internal/sha256.js.map +1 -1
- package/dist/internal/utf8.js.map +1 -1
- package/dist/node/index.js.map +1 -1
- package/dist/node/snapshotFileSink.js.map +1 -1
- package/dist/node/sqliteDriver.js.map +1 -1
- package/dist/protocol/dtos.js.map +1 -1
- package/dist/protocol/protocol.js.map +1 -1
- package/dist/protocol/rowBatch/columnLayout.js.map +1 -1
- package/dist/protocol/rowBatch/format.js.map +1 -1
- package/dist/protocol/rowBatch/reader.js.map +1 -1
- package/dist/protocol/rowBatch/writer.js.map +1 -1
- package/dist/protocol/wire.js.map +1 -1
- package/dist/signalr/index.js.map +1 -1
- package/dist/signalr/protocols.js.map +1 -1
- package/dist/signalr/transport.d.ts +7 -3
- package/dist/signalr/transport.js +2 -1
- package/dist/signalr/transport.js.map +1 -1
- package/dist/sqlite/apply.js.map +1 -1
- package/dist/sqlite/commands.js.map +1 -1
- package/dist/sqlite/connection.js.map +1 -1
- package/dist/sqlite/driver.js.map +1 -1
- package/dist/sqlite/index.js.map +1 -1
- package/dist/sqlite/internals.js.map +1 -1
- package/dist/sqlite/options.js.map +1 -1
- package/dist/sqlite/push.js.map +1 -1
- package/dist/sqlite/query.js.map +1 -1
- package/dist/sqlite/revocation.js.map +1 -1
- package/dist/sqlite/sql.js +113 -113
- package/dist/sqlite/sql.js.map +1 -1
- package/dist/sqlite/store.js.map +1 -1
- package/dist/sqlite/values.js.map +1 -1
- package/dist/testing/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/protocol/protocol.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,wFAAwF;IACxF,OAAO,EAAE,CAAC;IACV,8GAA8G;IAC9G,eAAe,EAAE,CAAC;IAClB,iCAAiC;IACjC,eAAe,EAAE,SAAS;IAC1B,0CAA0C;IAC1C,OAAO,EAAE;QACP,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,UAAU;QACpB,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,WAAW;QACtB,SAAS,EAAE,WAAW;KACvB;IACD,+CAA+C;IAC/C,SAAS,EAAE;QACT,kBAAkB,EAAE,oBAAoB;KACzC;CACO,CAAC;AAEX,kHAAkH;AAClH,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;AAC1E,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,UAAU,CAAC,YAAoB;IAC7C,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;IACrH,OAAO,SAAS,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,MAAM,GAAG,OAAO,CAAC;AAEvB;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM,CAAC,SAA0B;QAC/B,OAAO,MAAM,GAAG,SAAS,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC;IACtG,CAAC;IAED,2GAA2G;IAC3G,QAAQ,CAAC,IAA+B;QACtC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,GAAG,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAClC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;QAChD,OAAO,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAC9E,CAAC;CACF,CAAC","sourcesContent":["// Twins of G9SyncData.Protocol/G9SyncProtocol.cs and G9SyncHubContract.cs (G9SyncHubErrors).\nimport { G9SyncException } from '../abstractions/errors.js';\n\n/** Protocol constants shared by every transport (`G9SyncProtocol`). */\nexport const G9SyncProtocol = {\n /** Wire protocol version. The server refuses a Hello from a different major version. */\n Version: 1,\n /** The newest G9RowBatch body layout this build reads and writes (1 row-wise, 2 column-grouped; ADR-0040). */\n MaxFrameVersion: 2,\n /** Default SignalR hub route. */\n DefaultHubRoute: '/g9sync',\n /** Hub method names (client → server). */\n Methods: {\n Hello: 'Hello',\n Push: 'Push',\n PlanPull: 'PlanPull',\n Pull: 'Pull',\n Reconcile: 'Reconcile',\n FetchRows: 'FetchRows',\n },\n /** Listener method names (server → client). */\n Listeners: {\n OnChangesAvailable: 'OnChangesAvailable',\n },\n} as const;\n\n/** The frame layout to answer a request with: the newest both sides know, and 1 for a sender that did not say. */\nexport function negotiateFrameVersion(requested: number): number {\n return Math.min(Math.max(requested, 1), G9SyncProtocol.MaxFrameVersion);\n}\n\n/** The SignalR group of connections that negotiated a table (`G9SyncProtocol.TableGroup`). */\nexport function tableGroup(logicalTable: string): string {\n if (typeof logicalTable !== 'string' || logicalTable.trim() === '') throw new TypeError('A table name is required.');\n return 'g9sync:' + logicalTable.toLowerCase();\n}\n\nconst PREFIX = '[G9S|';\n\n/**\n * Carries a G9SyncException through SignalR (`G9SyncHubErrors`): a HubException message is the only error text SignalR\n * forwards, so the code travels inside it as `[G9S|{code}|{retryable 0/1}] {message}`.\n */\nexport const G9SyncHubErrors = {\n format(exception: G9SyncException): string {\n return PREFIX + exception.code + '|' + (exception.retryable ? '1' : '0') + '] ' + exception.message;\n },\n\n /** Finds the marker anywhere in `text` (the client wraps it in its own words); null when there is none. */\n tryParse(text: string | null | undefined): G9SyncException | null {\n if (!text) return null;\n const start = text.indexOf(PREFIX);\n if (start < 0) return null;\n const end = text.indexOf(']', start);\n if (end < 0) return null;\n const header = text.slice(start + PREFIX.length, end);\n const bar = header.lastIndexOf('|');\n if (bar <= 0) return null;\n const code = header.slice(0, bar);\n const retryable = header.slice(bar + 1) === '1';\n return new G9SyncException(code, text.slice(end + 1).trim(), { retryable });\n },\n};\n"]}
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/protocol/protocol.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,wFAAwF;IACxF,OAAO,EAAE,CAAC;IACV,8GAA8G;IAC9G,eAAe,EAAE,CAAC;IAClB,iCAAiC;IACjC,eAAe,EAAE,SAAS;IAC1B,0CAA0C;IAC1C,OAAO,EAAE;QACP,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,UAAU;QACpB,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,WAAW;QACtB,SAAS,EAAE,WAAW;KACvB;IACD,+CAA+C;IAC/C,SAAS,EAAE;QACT,kBAAkB,EAAE,oBAAoB;KACzC;CACO,CAAC;AAEX,kHAAkH;AAClH,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;AAC1E,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,UAAU,CAAC,YAAoB;IAC7C,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;IACrH,OAAO,SAAS,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,MAAM,GAAG,OAAO,CAAC;AAEvB;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM,CAAC,SAA0B;QAC/B,OAAO,MAAM,GAAG,SAAS,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC;IACtG,CAAC;IAED,2GAA2G;IAC3G,QAAQ,CAAC,IAA+B;QACtC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,GAAG,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAClC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;QAChD,OAAO,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAC9E,CAAC;CACF,CAAC","sourcesContent":["// Twins of G9SyncData.Protocol/G9SyncProtocol.cs and G9SyncHubContract.cs (G9SyncHubErrors).\r\nimport { G9SyncException } from '../abstractions/errors.js';\r\n\r\n/** Protocol constants shared by every transport (`G9SyncProtocol`). */\r\nexport const G9SyncProtocol = {\r\n /** Wire protocol version. The server refuses a Hello from a different major version. */\r\n Version: 1,\r\n /** The newest G9RowBatch body layout this build reads and writes (1 row-wise, 2 column-grouped; ADR-0040). */\r\n MaxFrameVersion: 2,\r\n /** Default SignalR hub route. */\r\n DefaultHubRoute: '/g9sync',\r\n /** Hub method names (client → server). */\r\n Methods: {\r\n Hello: 'Hello',\r\n Push: 'Push',\r\n PlanPull: 'PlanPull',\r\n Pull: 'Pull',\r\n Reconcile: 'Reconcile',\r\n FetchRows: 'FetchRows',\r\n },\r\n /** Listener method names (server → client). */\r\n Listeners: {\r\n OnChangesAvailable: 'OnChangesAvailable',\r\n },\r\n} as const;\r\n\r\n/** The frame layout to answer a request with: the newest both sides know, and 1 for a sender that did not say. */\r\nexport function negotiateFrameVersion(requested: number): number {\r\n return Math.min(Math.max(requested, 1), G9SyncProtocol.MaxFrameVersion);\r\n}\r\n\r\n/** The SignalR group of connections that negotiated a table (`G9SyncProtocol.TableGroup`). */\r\nexport function tableGroup(logicalTable: string): string {\r\n if (typeof logicalTable !== 'string' || logicalTable.trim() === '') throw new TypeError('A table name is required.');\r\n return 'g9sync:' + logicalTable.toLowerCase();\r\n}\r\n\r\nconst PREFIX = '[G9S|';\r\n\r\n/**\r\n * Carries a G9SyncException through SignalR (`G9SyncHubErrors`): a HubException message is the only error text SignalR\r\n * forwards, so the code travels inside it as `[G9S|{code}|{retryable 0/1}] {message}`.\r\n */\r\nexport const G9SyncHubErrors = {\r\n format(exception: G9SyncException): string {\r\n return PREFIX + exception.code + '|' + (exception.retryable ? '1' : '0') + '] ' + exception.message;\r\n },\r\n\r\n /** Finds the marker anywhere in `text` (the client wraps it in its own words); null when there is none. */\r\n tryParse(text: string | null | undefined): G9SyncException | null {\r\n if (!text) return null;\r\n const start = text.indexOf(PREFIX);\r\n if (start < 0) return null;\r\n const end = text.indexOf(']', start);\r\n if (end < 0) return null;\r\n const header = text.slice(start + PREFIX.length, end);\r\n const bar = header.lastIndexOf('|');\r\n if (bar <= 0) return null;\r\n const code = header.slice(0, bar);\r\n const retryable = header.slice(bar + 1) === '1';\r\n return new G9SyncException(code, text.slice(end + 1).trim(), { retryable });\r\n },\r\n};\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"columnLayout.js","sourceRoot":"","sources":["../../../src/protocol/rowBatch/columnLayout.ts"],"names":[],"mappings":"AAAA,kHAAkH;AAClH,kHAAkH;AAClH,iCAAiC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAEL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,aAAa,CAAC;AAErB,MAAM,UAAU,GAAG,CAAC,CAAC;AAWrB,SAAS,iBAAiB,CAAC,IAAgB,EAAE,MAAc;IACzD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;IACzB,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC;IACvD,MAAM,CAAC,GAAG,EAAE,CAAC;IACb,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,qBAAqB,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IAC5E,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC;IAC5D,MAAM,CAAC,GAAG,EAAE,CAAC;IACb,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,qBAAqB,CAAC,wBAAwB,OAAO,GAAG,CAAC,CAAC;IAChH,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,WAAW,GAAG,IAAI;QAAE,MAAM,IAAI,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACvD,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC;IAC1B,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAChB,IAAI,QAAQ,GAAG,CAAC;QAAE,MAAM,IAAI,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;IACzE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,WAAW,CAAC,MAAqB;IACxC,QAAQ,MAAM,CAAC,EAAE,EAAE,CAAC;QAClB,KAAK,aAAa,CAAC,MAAM,CAAC;QAC1B,KAAK,aAAa,CAAC,QAAQ;YACzB,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QACjC,KAAK,aAAa,CAAC,SAAS,CAAC;QAC7B,KAAK,aAAa,CAAC,OAAO;YACxB,OAAO,CAAC,CAAC;QACX,KAAK,aAAa,CAAC,WAAW;YAC5B,OAAO,CAAC,CAAC;QACX,KAAK,aAAa,CAAC,IAAI;YACrB,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QACjC;YACE,MAAM,IAAI,qBAAqB,CAAC,cAAc,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAgB,EAAE,QAAgB,EAAE,MAAc;IACnE,IAAI,MAAM,GAAG,CAAC,IAAI,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,qBAAqB,CAAC,yBAAyB,CAAC,CAAC;IAC9G,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,SAAS,CAAC,IAAgB,EAAE,QAAgB,EAAE,OAAe;IACpE,IAAI,OAAO,KAAK,iBAAiB,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAClD,IAAI,OAAO,KAAK,iBAAiB,CAAC,KAAK,IAAI,OAAO,KAAK,iBAAiB,CAAC,KAAK;QAAE,OAAO,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpH,OAAO,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,WAAW,CAAC,IAAgB,EAAE,QAAgB,EAAE,IAAY;IACnE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,iBAAiB,CAAC,OAAO;YAC5B,OAAO,CAAC,CAAC;QACX,KAAK,iBAAiB,CAAC,KAAK,CAAC;QAC7B,KAAK,iBAAiB,CAAC,KAAK,CAAC;QAC7B,KAAK,iBAAiB,CAAC,QAAQ;YAC7B,OAAO,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtC,KAAK,iBAAiB,CAAC,MAAM;YAC3B,OAAO,CAAC,CAAC;QACX,KAAK,iBAAiB,CAAC,OAAO,CAAC;QAC/B,KAAK,iBAAiB,CAAC,IAAI;YACzB,OAAO,EAAE,CAAC;QACZ,KAAK,iBAAiB,CAAC,QAAQ;YAC7B,OAAO,CAAC,CAAC;QACX,KAAK,iBAAiB,CAAC,cAAc;YACnC,OAAO,EAAE,CAAC;QACZ,KAAK,iBAAiB,CAAC,MAAM,CAAC;QAC9B,KAAK,iBAAiB,CAAC,KAAK;YAC1B,OAAO,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACxC;YACE,MAAM,IAAI,qBAAqB,CAAC,uBAAuB,IAAI,GAAG,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAgB,EAAE,QAAgB;IACxD,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,MAAM,GAAG,UAAU;QAAE,MAAM,IAAI,qBAAqB,CAAC,8BAA8B,CAAC,CAAC;IACzF,OAAO,MAAM,CAAC,GAAG,GAAG,QAAQ,GAAG,MAAM,CAAC;AACxC,CAAC;AASD,SAAS,GAAG,CAAC,IAAgB,EAAE,MAAc,EAAE,IAAgB,EAAE,MAAc,EAAE,MAAc;IAC7F,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAY,GAAG,MAAM,CAAC;IACnE,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,IAAI,CAAC,OAAmB,CAAC;QACxC,IAAI,CAAC,MAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAW,CAAC,CAAC;QAClE,OAAO,CAAC,MAAM,CAAC,GAAI,OAAO,CAAC,MAAM,CAAY,GAAG,MAAM,CAAC;IACzD,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC;AACvB,CAAC;AAED,SAAS,OAAO,CAAC,IAAgB,EAAE,MAAc,EAAE,MAAqB,EAAE,IAAgB;IACxF,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACjF,QAAQ,MAAM,CAAC,EAAE,EAAE,CAAC;QAClB,KAAK,aAAa,CAAC,MAAM,CAAC;QAC1B,KAAK,aAAa,CAAC,QAAQ;YACzB,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAC1C,MAAM;QACR,KAAK,aAAa,CAAC,SAAS,CAAC;QAC7B,KAAK,aAAa,CAAC,OAAO;YACxB,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,MAAM;QACR,KAAK,aAAa,CAAC,WAAW;YAC5B,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC9B,MAAM;QACR,KAAK,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YACxB,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC;YACvD,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC9B,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC9B,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,IAAI,EAAE,KAAK,YAAY,CAAC,MAAM;gBAAE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;iBACrE,IAAI,EAAE,KAAK,YAAY,CAAC,MAAM;gBAAE,MAAM,IAAI,qBAAqB,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;YAC/F,MAAM;QACR,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAgB,EAAE,MAAc,EAAE,MAAqB,EAAE,YAAoB,EAAE,IAAgB;IACjH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;IAClC,MAAM,WAAW,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC;IAC1B,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACnD,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;QAC9C,IAAI,CAAE,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAY,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,SAAS;QACrF,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAW,CAAC,CAAC,CAAC;IACpH,CAAC;AACH,CAAC;AAED,MAAM,MAAM;IAIV,YAAY,QAAgB;QAF5B,WAAM,GAAG,CAAC,CAAC;QAGT,IAAI,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,UAAkB;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;QAC1C,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO;QAC1C,IAAI,QAAQ,GAAG,gBAAgB,CAAC,eAAe;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC7G,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,WAAW,CAAC,KAAa;QACvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,CAAC,GAAG,KAAK,CAAC;QACd,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;YAC7C,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;CACF;AAED,qFAAqF;AACrF,MAAM,UAAU,QAAQ,CAAC,IAAgB;IACvC,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC1C,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IACrC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,MAAM,GAAW,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACpC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;QACzC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACrF,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;QAE5B,iCAAiC;QACjC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC;QAC7B,MAAM,QAAQ,GAAe,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACtE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACxF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE;YAAE,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAW,CAAC,CAAC;QAExE,yCAAyC;QACzC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;YACjC,KAAK,IAAI,OAAO,CAAC,CAAC,CAAW,CAAC;QAChC,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClB,MAAM,CAAC,GAAG,GAAG,SAAS,CAAC;QACvB,MAAM,OAAO,GAAe,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QAC1E,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACvF,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;IACtB,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,qBAAqB,CAAC,oCAAoC,CAAC,CAAC;IACtG,OAAO,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,MAAM,CAAC,OAAmB;IACxC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,qBAAqB,CAAC,8BAA8B,CAAC,CAAC;IACxF,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACzC,IAAI,QAAQ,GAAG,CAAC;QAAE,MAAM,IAAI,qBAAqB,CAAC,yBAAyB,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IAClC,MAAM,OAAO,GAAW,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IACnC,MAAM,MAAM,GAAW,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC;QAE7B,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpB,MAAM,IAAI,YAAY,CAAC;YACvB,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM;gBAAE,MAAM,IAAI,qBAAqB,CAAC,gCAAgC,CAAC,CAAC;YAC/F,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM;YAAE,MAAM,IAAI,qBAAqB,CAAC,gCAAgC,CAAC,CAAC;QAC5G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,MAAM,CAAC,CAAC,CAAC,GAAI,MAAM,CAAC,CAAC,CAAY,GAAG,MAAM,CAAC,GAAG,CAAC;YAC/C,IAAI,CAAC,CAAC,CAAC,GAAI,IAAI,CAAC,CAAC,CAAY,GAAG,MAAM,CAAC,GAAG,CAAC;QAC7C,CAAC;QACD,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACxG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;gBAAE,MAAM,IAAI,qBAAqB,CAAC,yCAAyC,CAAC,CAAC;QACxG,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC;IACvB,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,qBAAqB,CAAC,oCAAoC,CAAC,CAAC;IACzG,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,OAAO,CAAC,OAAmB,EAAE,OAAiB,EAAE,IAAc,EAAE,MAAqB,EAAE,MAAkB,EAAE,OAAe;IACjI,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAW,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7H,QAAQ,MAAM,CAAC,EAAE,EAAE,CAAC;QAClB,KAAK,aAAa,CAAC,MAAM,CAAC;QAC1B,KAAK,aAAa,CAAC,QAAQ;YACzB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9F,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM;QACR,KAAK,aAAa,CAAC,SAAS,CAAC;QAC7B,KAAK,aAAa,CAAC,OAAO;YACxB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9F,MAAM;QACR,KAAK,aAAa,CAAC,WAAW;YAC5B,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9F,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM;QACR,KAAK,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YACxB,IAAK,OAAO,CAAC,CAAC,CAAY,IAAK,IAAI,CAAC,CAAC,CAAY;gBAAE,MAAM,IAAI,qBAAqB,CAAC,gCAAgC,CAAC,CAAC;YACrH,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAW,CAAW,CAAC;YACnD,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9F,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9F,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9F,IAAI,EAAE,KAAK,YAAY,CAAC,MAAM;gBAAE,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;iBAC1F,IAAI,EAAE,KAAK,YAAY,CAAC,MAAM;gBAAE,MAAM,IAAI,qBAAqB,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;YAC/F,MAAM;QACR,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,OAAmB,EACnB,OAAiB,EACjB,IAAc,EACd,MAAqB,EACrB,YAAoB,EACpB,MAAkB,EAClB,OAAe;IAEf,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;IAClC,MAAM,WAAW,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACzE,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;QAC9C,IAAI,CAAE,MAAM,CAAC,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAY,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,SAAS;QACvF,MAAM,MAAM,GAAG,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC;QACzC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAW,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACzI,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,OAAmB,EAAE,OAAiB,EAAE,IAAc,EAAE,MAAc,EAAE,MAAc,EAAE,MAAkB,EAAE,OAAe;IACvI,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAW,CAAC;IACxC,IAAI,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,MAAM,GAAI,IAAI,CAAC,MAAM,CAAY;QAAE,MAAM,IAAI,qBAAqB,CAAC,gCAAgC,CAAC,CAAC;IAC/H,IAAI,OAAO,CAAC,GAAG,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM;QAAE,MAAM,IAAI,qBAAqB,CAAC,iCAAiC,CAAC,CAAC;IAC7G,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC;IACjC,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC;AACxB,CAAC","sourcesContent":["// Twin of G9SyncData.Protocol/RowBatch/G9RowBatchColumnLayout.cs: the column-grouped body of G9RowBatch version 2\n// (ADR-0040), converted to and from the row-wise layout of version 1. Only the order of the bytes changes, so the\n// conversion is exact both ways.\nimport { G9ESyncColumnType } from '../../abstractions/enums.js';\nimport { G9SyncKey } from '../../abstractions/key.js';\nimport {\n type Cursor,\n G9EPushRowOp,\n G9ERowBatchOp,\n G9RowBatchFormat,\n G9RowBatchFormatError,\n isRowBatchOp,\n readInt32LE,\n readVarint,\n varintLength,\n writeInt32LE,\n} from './format.js';\n\nconst KEY_STREAM = 0;\n\ninterface SectionHeader {\n start: number;\n length: number;\n op: number;\n keyType: number;\n types: Uint8Array;\n rowCount: number;\n}\n\nfunction readSectionHeader(body: Uint8Array, cursor: Cursor): SectionHeader {\n const start = cursor.pos;\n const op = available(body, cursor.pos, 1)[0] as number;\n cursor.pos++;\n if (!isRowBatchOp(op)) throw new G9RowBatchFormatError(`Unknown op ${op}.`);\n readVarint(body, cursor);\n const keyType = available(body, cursor.pos, 1)[0] as number;\n cursor.pos++;\n if (!G9SyncKey.isSupportedKeyType(keyType)) throw new G9RowBatchFormatError(`Unsupported key type ${keyType}.`);\n const columnCount = readVarint(body, cursor);\n if (columnCount > 1024) throw new G9RowBatchFormatError('Too many columns.');\n const types = available(body, cursor.pos, columnCount);\n cursor.pos += columnCount;\n const rowCount = readInt32LE(available(body, cursor.pos, 4), 0);\n cursor.pos += 4;\n if (rowCount < 0) throw new G9RowBatchFormatError('Negative row count.');\n return { start, length: cursor.pos - start, op, keyType, types, rowCount };\n}\n\nfunction streamCount(header: SectionHeader): number {\n switch (header.op) {\n case G9ERowBatchOp.Upsert:\n case G9ERowBatchOp.Backfill:\n return 3 + header.types.length;\n case G9ERowBatchOp.Tombstone:\n case G9ERowBatchOp.MoveOut:\n return 2;\n case G9ERowBatchOp.KeyVersions:\n return 3;\n case G9ERowBatchOp.Push:\n return 7 + header.types.length;\n default:\n throw new G9RowBatchFormatError(`Unknown op ${header.op}.`);\n }\n}\n\nfunction available(body: Uint8Array, position: number, length: number): Uint8Array {\n if (length < 0 || position + length > body.length) throw new G9RowBatchFormatError('Row batch is truncated.');\n return body.subarray(position, position + length);\n}\n\nfunction keyLength(body: Uint8Array, position: number, keyType: number): number {\n if (keyType === G9ESyncColumnType.Guid) return 16;\n if (keyType === G9ESyncColumnType.Int32 || keyType === G9ESyncColumnType.Int64) return varintLength(body, position);\n return prefixedLength(body, position);\n}\n\nfunction valueLength(body: Uint8Array, position: number, type: number): number {\n switch (type) {\n case G9ESyncColumnType.Boolean:\n return 1;\n case G9ESyncColumnType.Int32:\n case G9ESyncColumnType.Int64:\n case G9ESyncColumnType.TimeSpan:\n return varintLength(body, position);\n case G9ESyncColumnType.Double:\n return 8;\n case G9ESyncColumnType.Decimal:\n case G9ESyncColumnType.Guid:\n return 16;\n case G9ESyncColumnType.DateTime:\n return 9;\n case G9ESyncColumnType.DateTimeOffset:\n return 10;\n case G9ESyncColumnType.String:\n case G9ESyncColumnType.Bytes:\n return prefixedLength(body, position);\n default:\n throw new G9RowBatchFormatError(`Unknown column type ${type}.`);\n }\n}\n\nfunction prefixedLength(body: Uint8Array, position: number): number {\n const cursor = { pos: position };\n const length = readVarint(body, cursor);\n if (length > 2147483647) throw new G9RowBatchFormatError('Row batch value is too long.');\n return cursor.pos - position + length;\n}\n\n/** Counts stream lengths (pass 1) or copies fields to their stream cursors (pass 2). */\ninterface StreamSink {\n lengths: number[] | null;\n cursors: number[] | null;\n output: Uint8Array | null;\n}\n\nfunction put(sink: StreamSink, stream: number, body: Uint8Array, cursor: Cursor, length: number): void {\n const field = available(body, cursor.pos, length);\n if (sink.lengths) {\n sink.lengths[stream] = (sink.lengths[stream] as number) + length;\n } else {\n const cursors = sink.cursors as number[];\n (sink.output as Uint8Array).set(field, cursors[stream] as number);\n cursors[stream] = (cursors[stream] as number) + length;\n }\n cursor.pos += length;\n}\n\nfunction scanRow(rows: Uint8Array, cursor: Cursor, header: SectionHeader, sink: StreamSink): void {\n put(sink, KEY_STREAM, rows, cursor, keyLength(rows, cursor.pos, header.keyType));\n switch (header.op) {\n case G9ERowBatchOp.Upsert:\n case G9ERowBatchOp.Backfill:\n put(sink, 1, rows, cursor, varintLength(rows, cursor.pos));\n scanValues(rows, cursor, header, 2, sink);\n break;\n case G9ERowBatchOp.Tombstone:\n case G9ERowBatchOp.MoveOut:\n put(sink, 1, rows, cursor, varintLength(rows, cursor.pos));\n break;\n case G9ERowBatchOp.KeyVersions:\n put(sink, 1, rows, cursor, varintLength(rows, cursor.pos));\n put(sink, 2, rows, cursor, 8);\n break;\n case G9ERowBatchOp.Push: {\n const op = available(rows, cursor.pos, 1)[0] as number;\n put(sink, 1, rows, cursor, 1);\n put(sink, 2, rows, cursor, varintLength(rows, cursor.pos));\n put(sink, 3, rows, cursor, varintLength(rows, cursor.pos));\n put(sink, 4, rows, cursor, 8);\n put(sink, 5, rows, cursor, varintLength(rows, cursor.pos));\n if (op === G9EPushRowOp.Upsert) scanValues(rows, cursor, header, 6, sink);\n else if (op !== G9EPushRowOp.Delete) throw new G9RowBatchFormatError(`Unknown push op ${op}.`);\n break;\n }\n }\n}\n\nfunction scanValues(rows: Uint8Array, cursor: Cursor, header: SectionHeader, bitmapStream: number, sink: StreamSink): void {\n const count = header.types.length;\n const bitmapBytes = (count + 7) >> 3;\n const bitmap = cursor.pos;\n put(sink, bitmapStream, rows, cursor, bitmapBytes);\n for (let column = 0; column < count; column++) {\n if (((rows[bitmap + (column >> 3)] as number) & (1 << (column & 7))) !== 0) continue;\n put(sink, bitmapStream + 1 + column, rows, cursor, valueLength(rows, cursor.pos, header.types[column] as number));\n }\n}\n\nclass Output {\n bytes: Uint8Array;\n length = 0;\n\n constructor(capacity: number) {\n this.bytes = new Uint8Array(capacity);\n }\n\n ensure(additional: number): void {\n const required = this.length + additional;\n if (required <= this.bytes.length) return;\n if (required > G9RowBatchFormat.MaxDecodedBytes) throw new Error('Row batch exceeds the maximum body size.');\n const next = new Uint8Array(Math.max(required, this.bytes.length * 2));\n next.set(this.bytes.subarray(0, this.length));\n this.bytes = next;\n }\n\n writeVarint(value: number): void {\n this.ensure(10);\n let v = value;\n while (v >= 128) {\n this.bytes[this.length++] = (v % 128) | 0x80;\n v = Math.floor(v / 128);\n }\n this.bytes[this.length++] = v;\n }\n}\n\n/** Converts a version 1 (row-wise) body to the version 2 (column-grouped) layout. */\nexport function fromRows(rows: Uint8Array): Uint8Array {\n const sections = readInt32LE(available(rows, 0, 4), 0);\n const out = new Output(rows.length + 256);\n writeInt32LE(out.bytes, 0, sections);\n out.length = 4;\n const cursor: Cursor = { pos: 4 };\n for (let s = 0; s < sections; s++) {\n const header = readSectionHeader(rows, cursor);\n const streams = streamCount(header);\n out.ensure(header.length + streams * 10);\n out.bytes.set(rows.subarray(header.start, header.start + header.length), out.length);\n out.length += header.length;\n\n // Pass 1: every stream's length.\n const lengths: number[] = [];\n for (let i = 0; i < streams; i++) lengths.push(0);\n const rowsStart = cursor.pos;\n const counting: StreamSink = { lengths, cursors: null, output: null };\n for (let row = 0; row < header.rowCount; row++) scanRow(rows, cursor, header, counting);\n for (let i = 0; i < streams; i++) out.writeVarint(lengths[i] as number);\n\n // Pass 2: copy each field to its stream.\n let total = 0;\n const cursors: number[] = [];\n for (let i = 0; i < streams; i++) {\n cursors.push(out.length + total);\n total += lengths[i] as number;\n }\n out.ensure(total);\n cursor.pos = rowsStart;\n const copying: StreamSink = { lengths: null, cursors, output: out.bytes };\n for (let row = 0; row < header.rowCount; row++) scanRow(rows, cursor, header, copying);\n out.length += total;\n }\n if (cursor.pos !== rows.length) throw new G9RowBatchFormatError('Row batch body has trailing bytes.');\n return out.bytes.subarray(0, out.length);\n}\n\n/** Converts a version 2 (column-grouped) body back to the version 1 layout, which is never longer. */\nexport function toRows(columns: Uint8Array): Uint8Array {\n if (columns.length < 4) throw new G9RowBatchFormatError('Row batch body is too short.');\n const sections = readInt32LE(columns, 0);\n if (sections < 0) throw new G9RowBatchFormatError('Negative section count.');\n const output = new Uint8Array(columns.length);\n writeInt32LE(output, 0, sections);\n const written: Cursor = { pos: 4 };\n const cursor: Cursor = { pos: 4 };\n for (let s = 0; s < sections; s++) {\n const header = readSectionHeader(columns, cursor);\n output.set(columns.subarray(header.start, header.start + header.length), written.pos);\n written.pos += header.length;\n\n const streams = streamCount(header);\n const starts: number[] = [];\n const ends: number[] = [];\n let offset = 0;\n for (let i = 0; i < streams; i++) {\n const streamLength = readVarint(columns, cursor);\n starts.push(offset);\n offset += streamLength;\n if (offset > columns.length) throw new G9RowBatchFormatError('Row batch stream is truncated.');\n ends.push(offset);\n }\n if (cursor.pos + offset > columns.length) throw new G9RowBatchFormatError('Row batch stream is truncated.');\n for (let i = 0; i < streams; i++) {\n starts[i] = (starts[i] as number) + cursor.pos;\n ends[i] = (ends[i] as number) + cursor.pos;\n }\n for (let row = 0; row < header.rowCount; row++) copyRow(columns, starts, ends, header, output, written);\n for (let i = 0; i < streams; i++) {\n if (starts[i] !== ends[i]) throw new G9RowBatchFormatError('Row batch stream has bytes no row used.');\n }\n cursor.pos += offset;\n }\n if (cursor.pos !== columns.length) throw new G9RowBatchFormatError('Row batch body has trailing bytes.');\n return output.subarray(0, written.pos);\n}\n\nfunction copyRow(columns: Uint8Array, cursors: number[], ends: number[], header: SectionHeader, output: Uint8Array, written: Cursor): void {\n take(columns, cursors, ends, KEY_STREAM, keyLength(columns, cursors[KEY_STREAM] as number, header.keyType), output, written);\n switch (header.op) {\n case G9ERowBatchOp.Upsert:\n case G9ERowBatchOp.Backfill:\n take(columns, cursors, ends, 1, varintLength(columns, cursors[1] as number), output, written);\n copyValues(columns, cursors, ends, header, 2, output, written);\n break;\n case G9ERowBatchOp.Tombstone:\n case G9ERowBatchOp.MoveOut:\n take(columns, cursors, ends, 1, varintLength(columns, cursors[1] as number), output, written);\n break;\n case G9ERowBatchOp.KeyVersions:\n take(columns, cursors, ends, 1, varintLength(columns, cursors[1] as number), output, written);\n take(columns, cursors, ends, 2, 8, output, written);\n break;\n case G9ERowBatchOp.Push: {\n if ((cursors[1] as number) >= (ends[1] as number)) throw new G9RowBatchFormatError('Row batch stream is truncated.');\n const op = columns[cursors[1] as number] as number;\n take(columns, cursors, ends, 1, 1, output, written);\n take(columns, cursors, ends, 2, varintLength(columns, cursors[2] as number), output, written);\n take(columns, cursors, ends, 3, varintLength(columns, cursors[3] as number), output, written);\n take(columns, cursors, ends, 4, 8, output, written);\n take(columns, cursors, ends, 5, varintLength(columns, cursors[5] as number), output, written);\n if (op === G9EPushRowOp.Upsert) copyValues(columns, cursors, ends, header, 6, output, written);\n else if (op !== G9EPushRowOp.Delete) throw new G9RowBatchFormatError(`Unknown push op ${op}.`);\n break;\n }\n }\n}\n\nfunction copyValues(\n columns: Uint8Array,\n cursors: number[],\n ends: number[],\n header: SectionHeader,\n bitmapStream: number,\n output: Uint8Array,\n written: Cursor,\n): void {\n const count = header.types.length;\n const bitmapBytes = (count + 7) >> 3;\n const bitmap = written.pos;\n take(columns, cursors, ends, bitmapStream, bitmapBytes, output, written);\n for (let column = 0; column < count; column++) {\n if (((output[bitmap + (column >> 3)] as number) & (1 << (column & 7))) !== 0) continue;\n const stream = bitmapStream + 1 + column;\n take(columns, cursors, ends, stream, valueLength(columns, cursors[stream] as number, header.types[column] as number), output, written);\n }\n}\n\nfunction take(columns: Uint8Array, cursors: number[], ends: number[], stream: number, length: number, output: Uint8Array, written: Cursor): void {\n const start = cursors[stream] as number;\n if (length < 0 || start + length > (ends[stream] as number)) throw new G9RowBatchFormatError('Row batch stream is truncated.');\n if (written.pos + length > output.length) throw new G9RowBatchFormatError('Row batch body is inconsistent.');\n output.set(columns.subarray(start, start + length), written.pos);\n cursors[stream] = start + length;\n written.pos += length;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"columnLayout.js","sourceRoot":"","sources":["../../../src/protocol/rowBatch/columnLayout.ts"],"names":[],"mappings":"AAAA,kHAAkH;AAClH,kHAAkH;AAClH,iCAAiC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAEL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,aAAa,CAAC;AAErB,MAAM,UAAU,GAAG,CAAC,CAAC;AAWrB,SAAS,iBAAiB,CAAC,IAAgB,EAAE,MAAc;IACzD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;IACzB,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC;IACvD,MAAM,CAAC,GAAG,EAAE,CAAC;IACb,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,qBAAqB,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IAC5E,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC;IAC5D,MAAM,CAAC,GAAG,EAAE,CAAC;IACb,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,qBAAqB,CAAC,wBAAwB,OAAO,GAAG,CAAC,CAAC;IAChH,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,WAAW,GAAG,IAAI;QAAE,MAAM,IAAI,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACvD,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC;IAC1B,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAChB,IAAI,QAAQ,GAAG,CAAC;QAAE,MAAM,IAAI,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;IACzE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,WAAW,CAAC,MAAqB;IACxC,QAAQ,MAAM,CAAC,EAAE,EAAE,CAAC;QAClB,KAAK,aAAa,CAAC,MAAM,CAAC;QAC1B,KAAK,aAAa,CAAC,QAAQ;YACzB,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QACjC,KAAK,aAAa,CAAC,SAAS,CAAC;QAC7B,KAAK,aAAa,CAAC,OAAO;YACxB,OAAO,CAAC,CAAC;QACX,KAAK,aAAa,CAAC,WAAW;YAC5B,OAAO,CAAC,CAAC;QACX,KAAK,aAAa,CAAC,IAAI;YACrB,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QACjC;YACE,MAAM,IAAI,qBAAqB,CAAC,cAAc,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAgB,EAAE,QAAgB,EAAE,MAAc;IACnE,IAAI,MAAM,GAAG,CAAC,IAAI,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,qBAAqB,CAAC,yBAAyB,CAAC,CAAC;IAC9G,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,SAAS,CAAC,IAAgB,EAAE,QAAgB,EAAE,OAAe;IACpE,IAAI,OAAO,KAAK,iBAAiB,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAClD,IAAI,OAAO,KAAK,iBAAiB,CAAC,KAAK,IAAI,OAAO,KAAK,iBAAiB,CAAC,KAAK;QAAE,OAAO,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpH,OAAO,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,WAAW,CAAC,IAAgB,EAAE,QAAgB,EAAE,IAAY;IACnE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,iBAAiB,CAAC,OAAO;YAC5B,OAAO,CAAC,CAAC;QACX,KAAK,iBAAiB,CAAC,KAAK,CAAC;QAC7B,KAAK,iBAAiB,CAAC,KAAK,CAAC;QAC7B,KAAK,iBAAiB,CAAC,QAAQ;YAC7B,OAAO,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtC,KAAK,iBAAiB,CAAC,MAAM;YAC3B,OAAO,CAAC,CAAC;QACX,KAAK,iBAAiB,CAAC,OAAO,CAAC;QAC/B,KAAK,iBAAiB,CAAC,IAAI;YACzB,OAAO,EAAE,CAAC;QACZ,KAAK,iBAAiB,CAAC,QAAQ;YAC7B,OAAO,CAAC,CAAC;QACX,KAAK,iBAAiB,CAAC,cAAc;YACnC,OAAO,EAAE,CAAC;QACZ,KAAK,iBAAiB,CAAC,MAAM,CAAC;QAC9B,KAAK,iBAAiB,CAAC,KAAK;YAC1B,OAAO,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACxC;YACE,MAAM,IAAI,qBAAqB,CAAC,uBAAuB,IAAI,GAAG,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAgB,EAAE,QAAgB;IACxD,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,MAAM,GAAG,UAAU;QAAE,MAAM,IAAI,qBAAqB,CAAC,8BAA8B,CAAC,CAAC;IACzF,OAAO,MAAM,CAAC,GAAG,GAAG,QAAQ,GAAG,MAAM,CAAC;AACxC,CAAC;AASD,SAAS,GAAG,CAAC,IAAgB,EAAE,MAAc,EAAE,IAAgB,EAAE,MAAc,EAAE,MAAc;IAC7F,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAY,GAAG,MAAM,CAAC;IACnE,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,IAAI,CAAC,OAAmB,CAAC;QACxC,IAAI,CAAC,MAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAW,CAAC,CAAC;QAClE,OAAO,CAAC,MAAM,CAAC,GAAI,OAAO,CAAC,MAAM,CAAY,GAAG,MAAM,CAAC;IACzD,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC;AACvB,CAAC;AAED,SAAS,OAAO,CAAC,IAAgB,EAAE,MAAc,EAAE,MAAqB,EAAE,IAAgB;IACxF,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACjF,QAAQ,MAAM,CAAC,EAAE,EAAE,CAAC;QAClB,KAAK,aAAa,CAAC,MAAM,CAAC;QAC1B,KAAK,aAAa,CAAC,QAAQ;YACzB,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAC1C,MAAM;QACR,KAAK,aAAa,CAAC,SAAS,CAAC;QAC7B,KAAK,aAAa,CAAC,OAAO;YACxB,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,MAAM;QACR,KAAK,aAAa,CAAC,WAAW;YAC5B,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC9B,MAAM;QACR,KAAK,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YACxB,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC;YACvD,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC9B,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC9B,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,IAAI,EAAE,KAAK,YAAY,CAAC,MAAM;gBAAE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;iBACrE,IAAI,EAAE,KAAK,YAAY,CAAC,MAAM;gBAAE,MAAM,IAAI,qBAAqB,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;YAC/F,MAAM;QACR,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAgB,EAAE,MAAc,EAAE,MAAqB,EAAE,YAAoB,EAAE,IAAgB;IACjH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;IAClC,MAAM,WAAW,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC;IAC1B,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACnD,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;QAC9C,IAAI,CAAE,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAY,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,SAAS;QACrF,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAW,CAAC,CAAC,CAAC;IACpH,CAAC;AACH,CAAC;AAED,MAAM,MAAM;IAIV,YAAY,QAAgB;QAF5B,WAAM,GAAG,CAAC,CAAC;QAGT,IAAI,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,UAAkB;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;QAC1C,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO;QAC1C,IAAI,QAAQ,GAAG,gBAAgB,CAAC,eAAe;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC7G,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,WAAW,CAAC,KAAa;QACvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,CAAC,GAAG,KAAK,CAAC;QACd,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;YAC7C,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;CACF;AAED,qFAAqF;AACrF,MAAM,UAAU,QAAQ,CAAC,IAAgB;IACvC,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC1C,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IACrC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,MAAM,GAAW,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACpC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;QACzC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACrF,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;QAE5B,iCAAiC;QACjC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC;QAC7B,MAAM,QAAQ,GAAe,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACtE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACxF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE;YAAE,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAW,CAAC,CAAC;QAExE,yCAAyC;QACzC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;YACjC,KAAK,IAAI,OAAO,CAAC,CAAC,CAAW,CAAC;QAChC,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClB,MAAM,CAAC,GAAG,GAAG,SAAS,CAAC;QACvB,MAAM,OAAO,GAAe,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QAC1E,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACvF,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;IACtB,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,qBAAqB,CAAC,oCAAoC,CAAC,CAAC;IACtG,OAAO,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,MAAM,CAAC,OAAmB;IACxC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,qBAAqB,CAAC,8BAA8B,CAAC,CAAC;IACxF,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACzC,IAAI,QAAQ,GAAG,CAAC;QAAE,MAAM,IAAI,qBAAqB,CAAC,yBAAyB,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IAClC,MAAM,OAAO,GAAW,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IACnC,MAAM,MAAM,GAAW,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC;QAE7B,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpB,MAAM,IAAI,YAAY,CAAC;YACvB,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM;gBAAE,MAAM,IAAI,qBAAqB,CAAC,gCAAgC,CAAC,CAAC;YAC/F,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM;YAAE,MAAM,IAAI,qBAAqB,CAAC,gCAAgC,CAAC,CAAC;QAC5G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,MAAM,CAAC,CAAC,CAAC,GAAI,MAAM,CAAC,CAAC,CAAY,GAAG,MAAM,CAAC,GAAG,CAAC;YAC/C,IAAI,CAAC,CAAC,CAAC,GAAI,IAAI,CAAC,CAAC,CAAY,GAAG,MAAM,CAAC,GAAG,CAAC;QAC7C,CAAC;QACD,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACxG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;gBAAE,MAAM,IAAI,qBAAqB,CAAC,yCAAyC,CAAC,CAAC;QACxG,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC;IACvB,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,qBAAqB,CAAC,oCAAoC,CAAC,CAAC;IACzG,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,OAAO,CAAC,OAAmB,EAAE,OAAiB,EAAE,IAAc,EAAE,MAAqB,EAAE,MAAkB,EAAE,OAAe;IACjI,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAW,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7H,QAAQ,MAAM,CAAC,EAAE,EAAE,CAAC;QAClB,KAAK,aAAa,CAAC,MAAM,CAAC;QAC1B,KAAK,aAAa,CAAC,QAAQ;YACzB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9F,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM;QACR,KAAK,aAAa,CAAC,SAAS,CAAC;QAC7B,KAAK,aAAa,CAAC,OAAO;YACxB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9F,MAAM;QACR,KAAK,aAAa,CAAC,WAAW;YAC5B,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9F,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM;QACR,KAAK,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YACxB,IAAK,OAAO,CAAC,CAAC,CAAY,IAAK,IAAI,CAAC,CAAC,CAAY;gBAAE,MAAM,IAAI,qBAAqB,CAAC,gCAAgC,CAAC,CAAC;YACrH,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAW,CAAW,CAAC;YACnD,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9F,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9F,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9F,IAAI,EAAE,KAAK,YAAY,CAAC,MAAM;gBAAE,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;iBAC1F,IAAI,EAAE,KAAK,YAAY,CAAC,MAAM;gBAAE,MAAM,IAAI,qBAAqB,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;YAC/F,MAAM;QACR,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,OAAmB,EACnB,OAAiB,EACjB,IAAc,EACd,MAAqB,EACrB,YAAoB,EACpB,MAAkB,EAClB,OAAe;IAEf,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;IAClC,MAAM,WAAW,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACzE,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;QAC9C,IAAI,CAAE,MAAM,CAAC,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAY,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,SAAS;QACvF,MAAM,MAAM,GAAG,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC;QACzC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAW,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACzI,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,OAAmB,EAAE,OAAiB,EAAE,IAAc,EAAE,MAAc,EAAE,MAAc,EAAE,MAAkB,EAAE,OAAe;IACvI,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAW,CAAC;IACxC,IAAI,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,MAAM,GAAI,IAAI,CAAC,MAAM,CAAY;QAAE,MAAM,IAAI,qBAAqB,CAAC,gCAAgC,CAAC,CAAC;IAC/H,IAAI,OAAO,CAAC,GAAG,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM;QAAE,MAAM,IAAI,qBAAqB,CAAC,iCAAiC,CAAC,CAAC;IAC7G,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC;IACjC,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC;AACxB,CAAC","sourcesContent":["// Twin of G9SyncData.Protocol/RowBatch/G9RowBatchColumnLayout.cs: the column-grouped body of G9RowBatch version 2\r\n// (ADR-0040), converted to and from the row-wise layout of version 1. Only the order of the bytes changes, so the\r\n// conversion is exact both ways.\r\nimport { G9ESyncColumnType } from '../../abstractions/enums.js';\r\nimport { G9SyncKey } from '../../abstractions/key.js';\r\nimport {\r\n type Cursor,\r\n G9EPushRowOp,\r\n G9ERowBatchOp,\r\n G9RowBatchFormat,\r\n G9RowBatchFormatError,\r\n isRowBatchOp,\r\n readInt32LE,\r\n readVarint,\r\n varintLength,\r\n writeInt32LE,\r\n} from './format.js';\r\n\r\nconst KEY_STREAM = 0;\r\n\r\ninterface SectionHeader {\r\n start: number;\r\n length: number;\r\n op: number;\r\n keyType: number;\r\n types: Uint8Array;\r\n rowCount: number;\r\n}\r\n\r\nfunction readSectionHeader(body: Uint8Array, cursor: Cursor): SectionHeader {\r\n const start = cursor.pos;\r\n const op = available(body, cursor.pos, 1)[0] as number;\r\n cursor.pos++;\r\n if (!isRowBatchOp(op)) throw new G9RowBatchFormatError(`Unknown op ${op}.`);\r\n readVarint(body, cursor);\r\n const keyType = available(body, cursor.pos, 1)[0] as number;\r\n cursor.pos++;\r\n if (!G9SyncKey.isSupportedKeyType(keyType)) throw new G9RowBatchFormatError(`Unsupported key type ${keyType}.`);\r\n const columnCount = readVarint(body, cursor);\r\n if (columnCount > 1024) throw new G9RowBatchFormatError('Too many columns.');\r\n const types = available(body, cursor.pos, columnCount);\r\n cursor.pos += columnCount;\r\n const rowCount = readInt32LE(available(body, cursor.pos, 4), 0);\r\n cursor.pos += 4;\r\n if (rowCount < 0) throw new G9RowBatchFormatError('Negative row count.');\r\n return { start, length: cursor.pos - start, op, keyType, types, rowCount };\r\n}\r\n\r\nfunction streamCount(header: SectionHeader): number {\r\n switch (header.op) {\r\n case G9ERowBatchOp.Upsert:\r\n case G9ERowBatchOp.Backfill:\r\n return 3 + header.types.length;\r\n case G9ERowBatchOp.Tombstone:\r\n case G9ERowBatchOp.MoveOut:\r\n return 2;\r\n case G9ERowBatchOp.KeyVersions:\r\n return 3;\r\n case G9ERowBatchOp.Push:\r\n return 7 + header.types.length;\r\n default:\r\n throw new G9RowBatchFormatError(`Unknown op ${header.op}.`);\r\n }\r\n}\r\n\r\nfunction available(body: Uint8Array, position: number, length: number): Uint8Array {\r\n if (length < 0 || position + length > body.length) throw new G9RowBatchFormatError('Row batch is truncated.');\r\n return body.subarray(position, position + length);\r\n}\r\n\r\nfunction keyLength(body: Uint8Array, position: number, keyType: number): number {\r\n if (keyType === G9ESyncColumnType.Guid) return 16;\r\n if (keyType === G9ESyncColumnType.Int32 || keyType === G9ESyncColumnType.Int64) return varintLength(body, position);\r\n return prefixedLength(body, position);\r\n}\r\n\r\nfunction valueLength(body: Uint8Array, position: number, type: number): number {\r\n switch (type) {\r\n case G9ESyncColumnType.Boolean:\r\n return 1;\r\n case G9ESyncColumnType.Int32:\r\n case G9ESyncColumnType.Int64:\r\n case G9ESyncColumnType.TimeSpan:\r\n return varintLength(body, position);\r\n case G9ESyncColumnType.Double:\r\n return 8;\r\n case G9ESyncColumnType.Decimal:\r\n case G9ESyncColumnType.Guid:\r\n return 16;\r\n case G9ESyncColumnType.DateTime:\r\n return 9;\r\n case G9ESyncColumnType.DateTimeOffset:\r\n return 10;\r\n case G9ESyncColumnType.String:\r\n case G9ESyncColumnType.Bytes:\r\n return prefixedLength(body, position);\r\n default:\r\n throw new G9RowBatchFormatError(`Unknown column type ${type}.`);\r\n }\r\n}\r\n\r\nfunction prefixedLength(body: Uint8Array, position: number): number {\r\n const cursor = { pos: position };\r\n const length = readVarint(body, cursor);\r\n if (length > 2147483647) throw new G9RowBatchFormatError('Row batch value is too long.');\r\n return cursor.pos - position + length;\r\n}\r\n\r\n/** Counts stream lengths (pass 1) or copies fields to their stream cursors (pass 2). */\r\ninterface StreamSink {\r\n lengths: number[] | null;\r\n cursors: number[] | null;\r\n output: Uint8Array | null;\r\n}\r\n\r\nfunction put(sink: StreamSink, stream: number, body: Uint8Array, cursor: Cursor, length: number): void {\r\n const field = available(body, cursor.pos, length);\r\n if (sink.lengths) {\r\n sink.lengths[stream] = (sink.lengths[stream] as number) + length;\r\n } else {\r\n const cursors = sink.cursors as number[];\r\n (sink.output as Uint8Array).set(field, cursors[stream] as number);\r\n cursors[stream] = (cursors[stream] as number) + length;\r\n }\r\n cursor.pos += length;\r\n}\r\n\r\nfunction scanRow(rows: Uint8Array, cursor: Cursor, header: SectionHeader, sink: StreamSink): void {\r\n put(sink, KEY_STREAM, rows, cursor, keyLength(rows, cursor.pos, header.keyType));\r\n switch (header.op) {\r\n case G9ERowBatchOp.Upsert:\r\n case G9ERowBatchOp.Backfill:\r\n put(sink, 1, rows, cursor, varintLength(rows, cursor.pos));\r\n scanValues(rows, cursor, header, 2, sink);\r\n break;\r\n case G9ERowBatchOp.Tombstone:\r\n case G9ERowBatchOp.MoveOut:\r\n put(sink, 1, rows, cursor, varintLength(rows, cursor.pos));\r\n break;\r\n case G9ERowBatchOp.KeyVersions:\r\n put(sink, 1, rows, cursor, varintLength(rows, cursor.pos));\r\n put(sink, 2, rows, cursor, 8);\r\n break;\r\n case G9ERowBatchOp.Push: {\r\n const op = available(rows, cursor.pos, 1)[0] as number;\r\n put(sink, 1, rows, cursor, 1);\r\n put(sink, 2, rows, cursor, varintLength(rows, cursor.pos));\r\n put(sink, 3, rows, cursor, varintLength(rows, cursor.pos));\r\n put(sink, 4, rows, cursor, 8);\r\n put(sink, 5, rows, cursor, varintLength(rows, cursor.pos));\r\n if (op === G9EPushRowOp.Upsert) scanValues(rows, cursor, header, 6, sink);\r\n else if (op !== G9EPushRowOp.Delete) throw new G9RowBatchFormatError(`Unknown push op ${op}.`);\r\n break;\r\n }\r\n }\r\n}\r\n\r\nfunction scanValues(rows: Uint8Array, cursor: Cursor, header: SectionHeader, bitmapStream: number, sink: StreamSink): void {\r\n const count = header.types.length;\r\n const bitmapBytes = (count + 7) >> 3;\r\n const bitmap = cursor.pos;\r\n put(sink, bitmapStream, rows, cursor, bitmapBytes);\r\n for (let column = 0; column < count; column++) {\r\n if (((rows[bitmap + (column >> 3)] as number) & (1 << (column & 7))) !== 0) continue;\r\n put(sink, bitmapStream + 1 + column, rows, cursor, valueLength(rows, cursor.pos, header.types[column] as number));\r\n }\r\n}\r\n\r\nclass Output {\r\n bytes: Uint8Array;\r\n length = 0;\r\n\r\n constructor(capacity: number) {\r\n this.bytes = new Uint8Array(capacity);\r\n }\r\n\r\n ensure(additional: number): void {\r\n const required = this.length + additional;\r\n if (required <= this.bytes.length) return;\r\n if (required > G9RowBatchFormat.MaxDecodedBytes) throw new Error('Row batch exceeds the maximum body size.');\r\n const next = new Uint8Array(Math.max(required, this.bytes.length * 2));\r\n next.set(this.bytes.subarray(0, this.length));\r\n this.bytes = next;\r\n }\r\n\r\n writeVarint(value: number): void {\r\n this.ensure(10);\r\n let v = value;\r\n while (v >= 128) {\r\n this.bytes[this.length++] = (v % 128) | 0x80;\r\n v = Math.floor(v / 128);\r\n }\r\n this.bytes[this.length++] = v;\r\n }\r\n}\r\n\r\n/** Converts a version 1 (row-wise) body to the version 2 (column-grouped) layout. */\r\nexport function fromRows(rows: Uint8Array): Uint8Array {\r\n const sections = readInt32LE(available(rows, 0, 4), 0);\r\n const out = new Output(rows.length + 256);\r\n writeInt32LE(out.bytes, 0, sections);\r\n out.length = 4;\r\n const cursor: Cursor = { pos: 4 };\r\n for (let s = 0; s < sections; s++) {\r\n const header = readSectionHeader(rows, cursor);\r\n const streams = streamCount(header);\r\n out.ensure(header.length + streams * 10);\r\n out.bytes.set(rows.subarray(header.start, header.start + header.length), out.length);\r\n out.length += header.length;\r\n\r\n // Pass 1: every stream's length.\r\n const lengths: number[] = [];\r\n for (let i = 0; i < streams; i++) lengths.push(0);\r\n const rowsStart = cursor.pos;\r\n const counting: StreamSink = { lengths, cursors: null, output: null };\r\n for (let row = 0; row < header.rowCount; row++) scanRow(rows, cursor, header, counting);\r\n for (let i = 0; i < streams; i++) out.writeVarint(lengths[i] as number);\r\n\r\n // Pass 2: copy each field to its stream.\r\n let total = 0;\r\n const cursors: number[] = [];\r\n for (let i = 0; i < streams; i++) {\r\n cursors.push(out.length + total);\r\n total += lengths[i] as number;\r\n }\r\n out.ensure(total);\r\n cursor.pos = rowsStart;\r\n const copying: StreamSink = { lengths: null, cursors, output: out.bytes };\r\n for (let row = 0; row < header.rowCount; row++) scanRow(rows, cursor, header, copying);\r\n out.length += total;\r\n }\r\n if (cursor.pos !== rows.length) throw new G9RowBatchFormatError('Row batch body has trailing bytes.');\r\n return out.bytes.subarray(0, out.length);\r\n}\r\n\r\n/** Converts a version 2 (column-grouped) body back to the version 1 layout, which is never longer. */\r\nexport function toRows(columns: Uint8Array): Uint8Array {\r\n if (columns.length < 4) throw new G9RowBatchFormatError('Row batch body is too short.');\r\n const sections = readInt32LE(columns, 0);\r\n if (sections < 0) throw new G9RowBatchFormatError('Negative section count.');\r\n const output = new Uint8Array(columns.length);\r\n writeInt32LE(output, 0, sections);\r\n const written: Cursor = { pos: 4 };\r\n const cursor: Cursor = { pos: 4 };\r\n for (let s = 0; s < sections; s++) {\r\n const header = readSectionHeader(columns, cursor);\r\n output.set(columns.subarray(header.start, header.start + header.length), written.pos);\r\n written.pos += header.length;\r\n\r\n const streams = streamCount(header);\r\n const starts: number[] = [];\r\n const ends: number[] = [];\r\n let offset = 0;\r\n for (let i = 0; i < streams; i++) {\r\n const streamLength = readVarint(columns, cursor);\r\n starts.push(offset);\r\n offset += streamLength;\r\n if (offset > columns.length) throw new G9RowBatchFormatError('Row batch stream is truncated.');\r\n ends.push(offset);\r\n }\r\n if (cursor.pos + offset > columns.length) throw new G9RowBatchFormatError('Row batch stream is truncated.');\r\n for (let i = 0; i < streams; i++) {\r\n starts[i] = (starts[i] as number) + cursor.pos;\r\n ends[i] = (ends[i] as number) + cursor.pos;\r\n }\r\n for (let row = 0; row < header.rowCount; row++) copyRow(columns, starts, ends, header, output, written);\r\n for (let i = 0; i < streams; i++) {\r\n if (starts[i] !== ends[i]) throw new G9RowBatchFormatError('Row batch stream has bytes no row used.');\r\n }\r\n cursor.pos += offset;\r\n }\r\n if (cursor.pos !== columns.length) throw new G9RowBatchFormatError('Row batch body has trailing bytes.');\r\n return output.subarray(0, written.pos);\r\n}\r\n\r\nfunction copyRow(columns: Uint8Array, cursors: number[], ends: number[], header: SectionHeader, output: Uint8Array, written: Cursor): void {\r\n take(columns, cursors, ends, KEY_STREAM, keyLength(columns, cursors[KEY_STREAM] as number, header.keyType), output, written);\r\n switch (header.op) {\r\n case G9ERowBatchOp.Upsert:\r\n case G9ERowBatchOp.Backfill:\r\n take(columns, cursors, ends, 1, varintLength(columns, cursors[1] as number), output, written);\r\n copyValues(columns, cursors, ends, header, 2, output, written);\r\n break;\r\n case G9ERowBatchOp.Tombstone:\r\n case G9ERowBatchOp.MoveOut:\r\n take(columns, cursors, ends, 1, varintLength(columns, cursors[1] as number), output, written);\r\n break;\r\n case G9ERowBatchOp.KeyVersions:\r\n take(columns, cursors, ends, 1, varintLength(columns, cursors[1] as number), output, written);\r\n take(columns, cursors, ends, 2, 8, output, written);\r\n break;\r\n case G9ERowBatchOp.Push: {\r\n if ((cursors[1] as number) >= (ends[1] as number)) throw new G9RowBatchFormatError('Row batch stream is truncated.');\r\n const op = columns[cursors[1] as number] as number;\r\n take(columns, cursors, ends, 1, 1, output, written);\r\n take(columns, cursors, ends, 2, varintLength(columns, cursors[2] as number), output, written);\r\n take(columns, cursors, ends, 3, varintLength(columns, cursors[3] as number), output, written);\r\n take(columns, cursors, ends, 4, 8, output, written);\r\n take(columns, cursors, ends, 5, varintLength(columns, cursors[5] as number), output, written);\r\n if (op === G9EPushRowOp.Upsert) copyValues(columns, cursors, ends, header, 6, output, written);\r\n else if (op !== G9EPushRowOp.Delete) throw new G9RowBatchFormatError(`Unknown push op ${op}.`);\r\n break;\r\n }\r\n }\r\n}\r\n\r\nfunction copyValues(\r\n columns: Uint8Array,\r\n cursors: number[],\r\n ends: number[],\r\n header: SectionHeader,\r\n bitmapStream: number,\r\n output: Uint8Array,\r\n written: Cursor,\r\n): void {\r\n const count = header.types.length;\r\n const bitmapBytes = (count + 7) >> 3;\r\n const bitmap = written.pos;\r\n take(columns, cursors, ends, bitmapStream, bitmapBytes, output, written);\r\n for (let column = 0; column < count; column++) {\r\n if (((output[bitmap + (column >> 3)] as number) & (1 << (column & 7))) !== 0) continue;\r\n const stream = bitmapStream + 1 + column;\r\n take(columns, cursors, ends, stream, valueLength(columns, cursors[stream] as number, header.types[column] as number), output, written);\r\n }\r\n}\r\n\r\nfunction take(columns: Uint8Array, cursors: number[], ends: number[], stream: number, length: number, output: Uint8Array, written: Cursor): void {\r\n const start = cursors[stream] as number;\r\n if (length < 0 || start + length > (ends[stream] as number)) throw new G9RowBatchFormatError('Row batch stream is truncated.');\r\n if (written.pos + length > output.length) throw new G9RowBatchFormatError('Row batch body is inconsistent.');\r\n output.set(columns.subarray(start, start + length), written.pos);\r\n cursors[stream] = start + length;\r\n written.pos += length;\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/protocol/rowBatch/format.ts"],"names":[],"mappings":"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","sourcesContent":["// Twins of G9SyncData.Protocol/RowBatch/G9RowBatchTypes.cs and G9Varint.cs.\nimport { G9Long } from '../../abstractions/long.js';\n\n/** What the rows of a G9RowBatch section mean (`G9ERowBatchOp`). */\nexport const G9ERowBatchOp = {\n /** Key, version, full negotiated column values. Insert or update. */\n Upsert: 1,\n /** Key and version of a deleted row. */\n Tombstone: 2,\n /** Key and version of a row that left the chunk's subscription. */\n MoveOut: 3,\n /** Key, version and row hash (reconciliation listing). */\n KeyVersions: 4,\n /** Client upload rows: key, op, local sequence, base version, dirty mask, HLC ms, values for upserts. */\n Push: 5,\n /** Key, version and only the backfilled columns of rows the client already holds. */\n Backfill: 6,\n} as const;\nexport type G9ERowBatchOp = (typeof G9ERowBatchOp)[keyof typeof G9ERowBatchOp];\n\n/** Operation of a push row (`G9EPushRowOp`). */\nexport const G9EPushRowOp = {\n Upsert: 1,\n Delete: 2,\n} as const;\nexport type G9EPushRowOp = (typeof G9EPushRowOp)[keyof typeof G9EPushRowOp];\n\n/** Frame body compression (`G9ECompression`). */\nexport const G9ECompression = {\n None: 0,\n Brotli: 1,\n} as const;\nexport type G9ECompression = (typeof G9ECompression)[keyof typeof G9ECompression];\n\n/** Layout constants (`G9RowBatchFormat`). */\nexport const G9RowBatchFormat = {\n /** Row-wise body. */\n Version: 1,\n /** Column-grouped body (ADR-0040). */\n ColumnVersion: 2,\n MaxVersion: 2,\n HeaderSize: 10,\n MaxBodyBytes: 512 * 1024 * 1024,\n /** The largest body any reader decodes: the writer's ceiling plus the column layout's allowance. */\n MaxDecodedBytes: 512 * 1024 * 1024 + 64 * 1024 * 1024,\n} as const;\n\nexport function isRowBatchOp(op: number): op is G9ERowBatchOp {\n return op >= 1 && op <= 6;\n}\n\n/** True for ops whose rows carry column values. */\nexport function opHasValues(op: number): boolean {\n return op === G9ERowBatchOp.Upsert || op === G9ERowBatchOp.Backfill;\n}\n\n/** A malformed frame (the .NET `FormatException`). */\nexport class G9RowBatchFormatError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'G9RowBatchFormatError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport const VARINT_MAX_BYTES = 10;\n\n/** A read position over a byte array. */\nexport interface Cursor {\n pos: number;\n}\n\n/**\n * Reads an unsigned LEB128 varint as a number. Exact up to 2^53; beyond that the nearest double (callers that need\n * exactness use {@link readVarintLong}). Throws on a truncated or over-long varint.\n */\nexport function readVarint(bytes: Uint8Array, cursor: Cursor, end: number = bytes.length): number {\n let result = 0;\n let multiplier = 1;\n let shift = 0;\n let pos = cursor.pos;\n for (;;) {\n if (pos >= end) throw new G9RowBatchFormatError('Truncated varint.');\n const b = bytes[pos++] as number;\n result += (b & 0x7f) * multiplier;\n if ((b & 0x80) === 0) {\n cursor.pos = pos;\n return result;\n }\n shift += 7;\n if (shift > 63) throw new G9RowBatchFormatError('Varint is too long.');\n multiplier *= 128;\n }\n}\n\n/** Reads an unsigned LEB128 varint exactly, as the bits of an unsigned 64-bit value. */\nexport function readVarintLong(bytes: Uint8Array, cursor: Cursor, end: number = bytes.length): G9Long {\n let lo = 0;\n let hi = 0;\n let shift = 0;\n let pos = cursor.pos;\n for (;;) {\n if (pos >= end) throw new G9RowBatchFormatError('Truncated varint.');\n const b = bytes[pos++] as number;\n const bits = b & 0x7f;\n if (shift < 28) {\n lo |= bits << shift;\n } else if (shift === 28) {\n lo |= (bits & 0x0f) << 28;\n hi |= bits >>> 4;\n } else {\n hi |= bits << (shift - 32);\n }\n if ((b & 0x80) === 0) {\n cursor.pos = pos;\n return new G9Long(hi, lo);\n }\n shift += 7;\n if (shift > 63) throw new G9RowBatchFormatError('Varint is too long.');\n }\n}\n\n/** A varint that must fit an int32 (a length, a count, an id). */\nexport function readVarintInt32(bytes: Uint8Array, cursor: Cursor, end: number = bytes.length): number {\n const value = readVarint(bytes, cursor, end);\n if (value > 2147483647) throw new G9RowBatchFormatError('Varint is out of range.');\n return value;\n}\n\n/** Skips a varint and returns its length in bytes. */\nexport function varintLength(bytes: Uint8Array, position: number, end: number = bytes.length): number {\n let pos = position;\n let shift = 0;\n for (;;) {\n if (pos >= end) throw new G9RowBatchFormatError('Truncated varint.');\n const b = bytes[pos++] as number;\n if ((b & 0x80) === 0) return pos - position;\n shift += 7;\n if (shift > 63) throw new G9RowBatchFormatError('Varint is too long.');\n }\n}\n\n/** Zig-zag of a signed 64-bit value (`(v << 1) ^ (v >> 63)`), as unsigned bits. */\nexport function zigZag(value: G9Long): G9Long {\n return value.shiftLeft(1).xor(value.shiftRight(63));\n}\n\n/** Inverse zig-zag (`(long)(v >> 1) ^ -(long)(v & 1)`). */\nexport function unZigZag(value: G9Long): G9Long {\n const shifted = value.shiftRightUnsigned(1);\n return (value.lo & 1) === 0 ? shifted : shifted.xor(G9Long.MINUS_ONE);\n}\n\n/** Reads a zig-zag varint as a signed number (exact within ±2^53). */\nexport function readZigZagNumber(bytes: Uint8Array, cursor: Cursor, end?: number): number {\n const start = cursor.pos;\n const raw = readVarint(bytes, cursor, end);\n if (raw <= 9007199254740991) return raw % 2 === 0 ? raw / 2 : -(raw + 1) / 2;\n cursor.pos = start;\n return unZigZag(readVarintLong(bytes, cursor, end)).toNumber();\n}\n\n/** Reads a zig-zag varint exactly. */\nexport function readZigZagLong(bytes: Uint8Array, cursor: Cursor, end?: number): G9Long {\n return unZigZag(readVarintLong(bytes, cursor, end));\n}\n\nexport function readInt32LE(bytes: Uint8Array, offset: number): number {\n return (bytes[offset] as number) | ((bytes[offset + 1] as number) << 8) | ((bytes[offset + 2] as number) << 16) | ((bytes[offset + 3] as number) << 24);\n}\n\nexport function writeInt32LE(bytes: Uint8Array, offset: number, value: number): void {\n bytes[offset] = value & 0xff;\n bytes[offset + 1] = (value >>> 8) & 0xff;\n bytes[offset + 2] = (value >>> 16) & 0xff;\n bytes[offset + 3] = (value >>> 24) & 0xff;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/protocol/rowBatch/format.ts"],"names":[],"mappings":"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","sourcesContent":["// Twins of G9SyncData.Protocol/RowBatch/G9RowBatchTypes.cs and G9Varint.cs.\r\nimport { G9Long } from '../../abstractions/long.js';\r\n\r\n/** What the rows of a G9RowBatch section mean (`G9ERowBatchOp`). */\r\nexport const G9ERowBatchOp = {\r\n /** Key, version, full negotiated column values. Insert or update. */\r\n Upsert: 1,\r\n /** Key and version of a deleted row. */\r\n Tombstone: 2,\r\n /** Key and version of a row that left the chunk's subscription. */\r\n MoveOut: 3,\r\n /** Key, version and row hash (reconciliation listing). */\r\n KeyVersions: 4,\r\n /** Client upload rows: key, op, local sequence, base version, dirty mask, HLC ms, values for upserts. */\r\n Push: 5,\r\n /** Key, version and only the backfilled columns of rows the client already holds. */\r\n Backfill: 6,\r\n} as const;\r\nexport type G9ERowBatchOp = (typeof G9ERowBatchOp)[keyof typeof G9ERowBatchOp];\r\n\r\n/** Operation of a push row (`G9EPushRowOp`). */\r\nexport const G9EPushRowOp = {\r\n Upsert: 1,\r\n Delete: 2,\r\n} as const;\r\nexport type G9EPushRowOp = (typeof G9EPushRowOp)[keyof typeof G9EPushRowOp];\r\n\r\n/** Frame body compression (`G9ECompression`). */\r\nexport const G9ECompression = {\r\n None: 0,\r\n Brotli: 1,\r\n} as const;\r\nexport type G9ECompression = (typeof G9ECompression)[keyof typeof G9ECompression];\r\n\r\n/** Layout constants (`G9RowBatchFormat`). */\r\nexport const G9RowBatchFormat = {\r\n /** Row-wise body. */\r\n Version: 1,\r\n /** Column-grouped body (ADR-0040). */\r\n ColumnVersion: 2,\r\n MaxVersion: 2,\r\n HeaderSize: 10,\r\n MaxBodyBytes: 512 * 1024 * 1024,\r\n /** The largest body any reader decodes: the writer's ceiling plus the column layout's allowance. */\r\n MaxDecodedBytes: 512 * 1024 * 1024 + 64 * 1024 * 1024,\r\n} as const;\r\n\r\nexport function isRowBatchOp(op: number): op is G9ERowBatchOp {\r\n return op >= 1 && op <= 6;\r\n}\r\n\r\n/** True for ops whose rows carry column values. */\r\nexport function opHasValues(op: number): boolean {\r\n return op === G9ERowBatchOp.Upsert || op === G9ERowBatchOp.Backfill;\r\n}\r\n\r\n/** A malformed frame (the .NET `FormatException`). */\r\nexport class G9RowBatchFormatError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'G9RowBatchFormatError';\r\n Object.setPrototypeOf(this, new.target.prototype);\r\n }\r\n}\r\n\r\nexport const VARINT_MAX_BYTES = 10;\r\n\r\n/** A read position over a byte array. */\r\nexport interface Cursor {\r\n pos: number;\r\n}\r\n\r\n/**\r\n * Reads an unsigned LEB128 varint as a number. Exact up to 2^53; beyond that the nearest double (callers that need\r\n * exactness use {@link readVarintLong}). Throws on a truncated or over-long varint.\r\n */\r\nexport function readVarint(bytes: Uint8Array, cursor: Cursor, end: number = bytes.length): number {\r\n let result = 0;\r\n let multiplier = 1;\r\n let shift = 0;\r\n let pos = cursor.pos;\r\n for (;;) {\r\n if (pos >= end) throw new G9RowBatchFormatError('Truncated varint.');\r\n const b = bytes[pos++] as number;\r\n result += (b & 0x7f) * multiplier;\r\n if ((b & 0x80) === 0) {\r\n cursor.pos = pos;\r\n return result;\r\n }\r\n shift += 7;\r\n if (shift > 63) throw new G9RowBatchFormatError('Varint is too long.');\r\n multiplier *= 128;\r\n }\r\n}\r\n\r\n/** Reads an unsigned LEB128 varint exactly, as the bits of an unsigned 64-bit value. */\r\nexport function readVarintLong(bytes: Uint8Array, cursor: Cursor, end: number = bytes.length): G9Long {\r\n let lo = 0;\r\n let hi = 0;\r\n let shift = 0;\r\n let pos = cursor.pos;\r\n for (;;) {\r\n if (pos >= end) throw new G9RowBatchFormatError('Truncated varint.');\r\n const b = bytes[pos++] as number;\r\n const bits = b & 0x7f;\r\n if (shift < 28) {\r\n lo |= bits << shift;\r\n } else if (shift === 28) {\r\n lo |= (bits & 0x0f) << 28;\r\n hi |= bits >>> 4;\r\n } else {\r\n hi |= bits << (shift - 32);\r\n }\r\n if ((b & 0x80) === 0) {\r\n cursor.pos = pos;\r\n return new G9Long(hi, lo);\r\n }\r\n shift += 7;\r\n if (shift > 63) throw new G9RowBatchFormatError('Varint is too long.');\r\n }\r\n}\r\n\r\n/** A varint that must fit an int32 (a length, a count, an id). */\r\nexport function readVarintInt32(bytes: Uint8Array, cursor: Cursor, end: number = bytes.length): number {\r\n const value = readVarint(bytes, cursor, end);\r\n if (value > 2147483647) throw new G9RowBatchFormatError('Varint is out of range.');\r\n return value;\r\n}\r\n\r\n/** Skips a varint and returns its length in bytes. */\r\nexport function varintLength(bytes: Uint8Array, position: number, end: number = bytes.length): number {\r\n let pos = position;\r\n let shift = 0;\r\n for (;;) {\r\n if (pos >= end) throw new G9RowBatchFormatError('Truncated varint.');\r\n const b = bytes[pos++] as number;\r\n if ((b & 0x80) === 0) return pos - position;\r\n shift += 7;\r\n if (shift > 63) throw new G9RowBatchFormatError('Varint is too long.');\r\n }\r\n}\r\n\r\n/** Zig-zag of a signed 64-bit value (`(v << 1) ^ (v >> 63)`), as unsigned bits. */\r\nexport function zigZag(value: G9Long): G9Long {\r\n return value.shiftLeft(1).xor(value.shiftRight(63));\r\n}\r\n\r\n/** Inverse zig-zag (`(long)(v >> 1) ^ -(long)(v & 1)`). */\r\nexport function unZigZag(value: G9Long): G9Long {\r\n const shifted = value.shiftRightUnsigned(1);\r\n return (value.lo & 1) === 0 ? shifted : shifted.xor(G9Long.MINUS_ONE);\r\n}\r\n\r\n/** Reads a zig-zag varint as a signed number (exact within ±2^53). */\r\nexport function readZigZagNumber(bytes: Uint8Array, cursor: Cursor, end?: number): number {\r\n const start = cursor.pos;\r\n const raw = readVarint(bytes, cursor, end);\r\n if (raw <= 9007199254740991) return raw % 2 === 0 ? raw / 2 : -(raw + 1) / 2;\r\n cursor.pos = start;\r\n return unZigZag(readVarintLong(bytes, cursor, end)).toNumber();\r\n}\r\n\r\n/** Reads a zig-zag varint exactly. */\r\nexport function readZigZagLong(bytes: Uint8Array, cursor: Cursor, end?: number): G9Long {\r\n return unZigZag(readVarintLong(bytes, cursor, end));\r\n}\r\n\r\nexport function readInt32LE(bytes: Uint8Array, offset: number): number {\r\n return (bytes[offset] as number) | ((bytes[offset + 1] as number) << 8) | ((bytes[offset + 2] as number) << 16) | ((bytes[offset + 3] as number) << 24);\r\n}\r\n\r\nexport function writeInt32LE(bytes: Uint8Array, offset: number, value: number): void {\r\n bytes[offset] = value & 0xff;\r\n bytes[offset + 1] = (value >>> 8) & 0xff;\r\n bytes[offset + 2] = (value >>> 16) & 0xff;\r\n bytes[offset + 3] = (value >>> 24) & 0xff;\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/protocol/rowBatch/reader.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Protocol/RowBatch/G9CRowBatchReader.cs: reads a G9RowBatch frame in either body layout. Forward\n// only; values are decoded from the body on demand.\nimport { G9ESyncColumnType } from '../../abstractions/enums.js';\nimport { readGuidBytes } from '../../abstractions/guid.js';\nimport { G9SyncKey } from '../../abstractions/key.js';\nimport { G9Long } from '../../abstractions/long.js';\nimport type { DecimalParts } from '../../internal/dotnetFormat.js';\nimport { utf8Decode } from '../../internal/utf8.js';\nimport { toRows } from './columnLayout.js';\nimport {\n type Cursor,\n G9ECompression,\n G9EPushRowOp,\n G9ERowBatchOp,\n G9RowBatchFormat,\n G9RowBatchFormatError,\n isRowBatchOp,\n readInt32LE,\n readVarint,\n readVarintInt32,\n readVarintLong,\n readZigZagLong,\n readZigZagNumber,\n} from './format.js';\nimport type { G9DateTimeOffsetValue, G9DateTimeValue } from './writer.js';\n\n/**\n * Decompresses a Brotli frame body. Returns exactly `expectedLength` bytes or throws. Node: `nodeBrotliDecompressor()`\n * (`@g9tm/syncdata/node`); Lynx: the native module of `@g9tm/syncdata-lynx`; anywhere: `jsBrotliDecompressor()`\n * (`@g9tm/syncdata/brotli-js`, pure JavaScript, slower).\n */\nexport interface G9FrameDecompressor {\n decompress(compressed: Uint8Array, expectedLength: number): Uint8Array | Promise<Uint8Array>;\n}\n\n/** The header of a frame, read without decoding the body. */\nexport interface G9FrameHeader {\n version: number;\n compression: number;\n bodyLength: number;\n}\n\n/** Validates a frame's header (magic, version, compression, body length, budget). */\nexport function readFrameHeader(frame: Uint8Array, maxBodyBytes: number = G9RowBatchFormat.MaxDecodedBytes): G9FrameHeader {\n if (!(maxBodyBytes > 0)) throw new RangeError('maxBodyBytes must be positive.');\n if (frame.length < G9RowBatchFormat.HeaderSize || frame[0] !== 0x47 || frame[1] !== 0x39 || frame[2] !== 0x52 || frame[3] !== 0x42) {\n throw new G9RowBatchFormatError('Not a G9RowBatch frame.');\n }\n const version = frame[4] as number;\n if (version !== G9RowBatchFormat.Version && version !== G9RowBatchFormat.ColumnVersion) {\n throw new G9RowBatchFormatError(`Unsupported G9RowBatch version ${version}.`);\n }\n const compression = frame[5] as number;\n const bodyLength = readInt32LE(frame, 6);\n if (bodyLength < 4 || bodyLength > G9RowBatchFormat.MaxDecodedBytes) throw new G9RowBatchFormatError('Invalid body length.');\n if (bodyLength > maxBodyBytes) {\n throw new G9RowBatchFormatError(`The frame declares a ${bodyLength}-byte body; this reader accepts at most ${maxBodyBytes} bytes.`);\n }\n if (compression !== G9ECompression.None && compression !== G9ECompression.Brotli) {\n throw new G9RowBatchFormatError(`Unknown compression ${compression}.`);\n }\n if (compression === G9ECompression.None && frame.length - G9RowBatchFormat.HeaderSize !== bodyLength) {\n throw new G9RowBatchFormatError('Body length mismatch.');\n }\n return { version, compression, bodyLength };\n}\n\nlet defaultDecompressor: G9FrameDecompressor | null = null;\n\n/**\n * Sets the Brotli decoder used wherever none is passed explicitly (the store, the engine's reconciliation). Call it\n * once at start-up: `useNodeBrotli()` (`@g9tm/syncdata/node`), `useLynxBrotli()` (`@g9tm/syncdata-lynx`) or\n * `setDefaultFrameDecompressor(jsBrotliDecompressor())` (`@g9tm/syncdata/brotli-js`).\n */\nexport function setDefaultFrameDecompressor(decompressor: G9FrameDecompressor | null): void {\n defaultDecompressor = decompressor;\n}\n\n/** The decoder set with {@link setDefaultFrameDecompressor}, or null. */\nexport function getDefaultFrameDecompressor(): G9FrameDecompressor | null {\n return defaultDecompressor;\n}\n\n/** Options of {@link openRowBatch}. */\nexport interface G9OpenRowBatchOptions {\n /** Brotli decoder for compressed frames (every frame the server sends over 128 bytes); the default decoder when omitted. */\n decompressor?: G9FrameDecompressor | null;\n /** The largest decoded body this caller allocates for (ADR-0051). */\n maxBodyBytes?: number;\n}\n\n/**\n * Validates, decompresses when needed, and opens a frame. Async because a Lynx decompressor crosses the native bridge;\n * an uncompressed frame resolves without waiting on anything.\n */\nexport async function openRowBatch(frame: Uint8Array, options?: G9OpenRowBatchOptions): Promise<G9RowBatchReader> {\n const header = readFrameHeader(frame, options?.maxBodyBytes);\n if (header.compression === G9ECompression.None) return G9RowBatchReader.fromBody(frame.subarray(G9RowBatchFormat.HeaderSize), header.version);\n const decompressor = options?.decompressor ?? defaultDecompressor;\n if (!decompressor) {\n throw new G9RowBatchFormatError('The frame is Brotli-compressed and no decompressor is configured (see G9FrameDecompressor).');\n }\n let body: Uint8Array;\n try {\n body = await decompressor.decompress(frame.subarray(G9RowBatchFormat.HeaderSize), header.bodyLength);\n } catch (error) {\n throw new G9RowBatchFormatError(`Brotli body could not be decompressed: ${error instanceof Error ? error.message : String(error)}`);\n }\n if (!body || body.length !== header.bodyLength) throw new G9RowBatchFormatError('Brotli body could not be decompressed.');\n return G9RowBatchReader.fromBody(body, header.version);\n}\n\n/** Opens an uncompressed frame synchronously (throws for a compressed one). */\nexport function openRowBatchSync(frame: Uint8Array, maxBodyBytes?: number): G9RowBatchReader {\n const header = readFrameHeader(frame, maxBodyBytes);\n if (header.compression !== G9ECompression.None) throw new G9RowBatchFormatError('The frame is compressed; use openRowBatch.');\n return G9RowBatchReader.fromBody(frame.subarray(G9RowBatchFormat.HeaderSize), header.version);\n}\n\n/** Reads the sections and rows of one G9RowBatch body. */\nexport class G9RowBatchReader {\n private readonly _body: Uint8Array;\n private readonly _cursor: Cursor = { pos: 4 };\n private _sectionsRemaining: number;\n private _sectionOpen = false;\n private _rowsRemaining = 0;\n private _types: number[] = [];\n private _offsets: number[] = [];\n private _keyStart = 0;\n private _keyLength = 0;\n private _keyText: string | null = null;\n private _versionPos = -1;\n private _sequencePos = -1;\n private _baseVersionPos = -1;\n private _hlcPos = -1;\n\n readonly sectionCount: number;\n\n // section\n op = 0;\n tableId = 0;\n keyType = 0;\n rowCount = 0;\n\n // row\n version = 0;\n pushOp = 0;\n sequence = 0;\n baseVersion = 0;\n dirtyMask: G9Long = G9Long.ZERO;\n hlcMs = 0;\n rowHash: G9Long = G9Long.ZERO;\n hasValues = false;\n\n private constructor(body: Uint8Array) {\n if (body.length < 4) throw new G9RowBatchFormatError('Row batch body is too short.');\n this._body = body;\n this.sectionCount = readInt32LE(body, 0);\n if (this.sectionCount < 0) throw new G9RowBatchFormatError('Negative section count.');\n this._sectionsRemaining = this.sectionCount;\n }\n\n /** Opens an already decompressed body of the given layout version. */\n static fromBody(body: Uint8Array, version: number): G9RowBatchReader {\n return new G9RowBatchReader(version === G9RowBatchFormat.ColumnVersion ? toRows(body) : body);\n }\n\n /** The decoded size of this frame's body (row-wise layout). */\n get bodyBytes(): number {\n return this._body.length;\n }\n\n get columnTypes(): readonly number[] {\n return this._types;\n }\n\n get columnCount(): number {\n return this._types.length;\n }\n\n /** Moves to the next section, skipping unread rows of the current one. */\n nextSection(): boolean {\n if (this._sectionOpen) {\n while (this.readRow()) {\n // skip\n }\n }\n if (this._sectionsRemaining === 0) {\n this._sectionOpen = false;\n return false;\n }\n const body = this._body;\n const cursor = this._cursor;\n this.op = this._readByte();\n if (!isRowBatchOp(this.op)) throw new G9RowBatchFormatError(`Unknown op ${this.op}.`);\n this.tableId = readVarintInt32(body, cursor);\n this.keyType = this._readByte();\n if (!G9SyncKey.isSupportedKeyType(this.keyType)) throw new G9RowBatchFormatError(`Unsupported key type ${this.keyType}.`);\n const columnCount = readVarintInt32(body, cursor);\n if (columnCount > 1024) throw new G9RowBatchFormatError('Too many columns.');\n this._ensure(columnCount + 4);\n const types: number[] = [];\n for (let i = 0; i < columnCount; i++) types.push(body[cursor.pos++] as number);\n this._types = types;\n this.rowCount = readInt32LE(body, cursor.pos);\n cursor.pos += 4;\n if (this.rowCount < 0) throw new G9RowBatchFormatError('Negative row count.');\n if (this._offsets.length < columnCount) this._offsets = new Array<number>(columnCount);\n this._rowsRemaining = this.rowCount;\n this._sectionsRemaining--;\n this._sectionOpen = true;\n return true;\n }\n\n /** Moves to the next row of the current section. */\n readRow(): boolean {\n if (!this._sectionOpen || this._rowsRemaining === 0) return false;\n const body = this._body;\n const cursor = this._cursor;\n this._keyText = null;\n this.hasValues = false;\n this.version = 0;\n this.rowHash = G9Long.ZERO;\n\n switch (this.keyType) {\n case G9ESyncColumnType.Guid:\n this._ensure(16);\n this._keyStart = cursor.pos;\n this._keyLength = 16;\n cursor.pos += 16;\n break;\n case G9ESyncColumnType.Int32:\n case G9ESyncColumnType.Int64:\n this._keyStart = cursor.pos;\n readVarintLong(body, cursor);\n this._keyLength = cursor.pos - this._keyStart;\n break;\n default: {\n const length = readVarintInt32(body, cursor);\n this._ensure(length);\n this._keyStart = cursor.pos;\n this._keyLength = length;\n cursor.pos += length;\n break;\n }\n }\n\n switch (this.op) {\n case G9ERowBatchOp.Upsert:\n case G9ERowBatchOp.Backfill:\n this._versionPos = cursor.pos;\n this.version = readVarint(body, cursor);\n this._readValues();\n break;\n case G9ERowBatchOp.Tombstone:\n case G9ERowBatchOp.MoveOut:\n this._versionPos = cursor.pos;\n this.version = readVarint(body, cursor);\n break;\n case G9ERowBatchOp.KeyVersions:\n this._versionPos = cursor.pos;\n this.version = readVarint(body, cursor);\n this._ensure(8);\n this.rowHash = G9Long.readLE(body, cursor.pos);\n cursor.pos += 8;\n break;\n case G9ERowBatchOp.Push:\n this.pushOp = this._readByte();\n if (this.pushOp !== G9EPushRowOp.Upsert && this.pushOp !== G9EPushRowOp.Delete) throw new G9RowBatchFormatError(`Unknown push op ${this.pushOp}.`);\n this._versionPos = -1;\n this._sequencePos = cursor.pos;\n this.sequence = readVarint(body, cursor);\n this._baseVersionPos = cursor.pos;\n this.baseVersion = readVarint(body, cursor);\n this._ensure(8);\n this.dirtyMask = G9Long.readLE(body, cursor.pos);\n cursor.pos += 8;\n this._hlcPos = cursor.pos;\n this.hlcMs = readZigZagNumber(body, cursor);\n if (this.pushOp === G9EPushRowOp.Upsert) this._readValues();\n break;\n }\n this._rowsRemaining--;\n return true;\n }\n\n /** The row's version, exact (the {@link version} number is exact below 2^53). */\n get versionLong(): G9Long {\n return this._versionPos < 0 ? G9Long.ZERO : readVarintLong(this._body, { pos: this._versionPos });\n }\n\n /** A push row's local sequence, exact. */\n get sequenceLong(): G9Long {\n return readVarintLong(this._body, { pos: this._sequencePos });\n }\n\n /** A push row's base version, exact. */\n get baseVersionLong(): G9Long {\n return readVarintLong(this._body, { pos: this._baseVersionPos });\n }\n\n /** A push row's HLC milliseconds, exact. */\n get hlcLong(): G9Long {\n return readZigZagLong(this._body, { pos: this._hlcPos });\n }\n\n // ---------------------------------------------------------------- key\n\n /** Canonical key text (see G9SyncKey). */\n get key(): string {\n if (this._keyText === null) {\n switch (this.keyType) {\n case G9ESyncColumnType.Guid:\n this._keyText = readGuidBytes(this._body, this._keyStart);\n break;\n case G9ESyncColumnType.Int32:\n case G9ESyncColumnType.Int64:\n this._keyText = this.keyInt64.toString();\n break;\n default:\n this._keyText = utf8Decode(this._body.subarray(this._keyStart, this._keyStart + this._keyLength));\n break;\n }\n }\n return this._keyText;\n }\n\n /** The integer key. */\n get keyInt64(): G9Long {\n if (this.keyType !== G9ESyncColumnType.Int32 && this.keyType !== G9ESyncColumnType.Int64) throw new Error(`Key type is ${this.keyType}.`);\n return readZigZagLong(this._body, { pos: this._keyStart });\n }\n\n /** UTF-8 bytes of a string key. */\n get keyUtf8(): Uint8Array {\n if (this.keyType !== G9ESyncColumnType.String) throw new Error(`Key type is ${this.keyType}.`);\n return this._body.subarray(this._keyStart, this._keyStart + this._keyLength);\n }\n\n // ---------------------------------------------------------------- values\n\n isNull(column: number): boolean {\n this._ensureValues(column);\n return (this._offsets[column] as number) < 0;\n }\n\n getBoolean(column: number): boolean {\n return this._body[this._offset(column, G9ESyncColumnType.Boolean)] !== 0;\n }\n\n getInt32(column: number): number {\n const value = readZigZagNumber(this._body, { pos: this._offset(column, G9ESyncColumnType.Int32) });\n if (value < -2147483648 || value > 2147483647) throw new G9RowBatchFormatError('Int32 value is out of range.');\n return value;\n }\n\n /** An Int64 value, exact. */\n getInt64(column: number): G9Long {\n return readZigZagLong(this._body, { pos: this._offset(column, G9ESyncColumnType.Int64) });\n }\n\n getDouble(column: number): number {\n const at = this._offset(column, G9ESyncColumnType.Double);\n for (let i = 0; i < 8; i++) DOUBLE_BYTES[i] = this._body[at + i] as number;\n return DOUBLE_VIEW.getFloat64(0, true);\n }\n\n getDecimal(column: number): DecimalParts {\n const at = this._offset(column, G9ESyncColumnType.Decimal);\n const flags = readInt32LE(this._body, at + 12);\n // decimal.GetBits: bits 0-15 and 24-30 of the flags are zero and the scale is at most 28.\n if ((flags & 0x7f00ffff) !== 0 || ((flags >> 16) & 0xff) > 28) throw new G9RowBatchFormatError('Invalid decimal value.');\n return {\n lo: readInt32LE(this._body, at) >>> 0,\n mid: readInt32LE(this._body, at + 4) >>> 0,\n hi: readInt32LE(this._body, at + 8) >>> 0,\n scale: (flags >> 16) & 0xff,\n negative: flags < 0,\n };\n }\n\n getString(column: number): string {\n return utf8Decode(this.getUtf8(column));\n }\n\n getUtf8(column: number): Uint8Array {\n return this._lengthPrefixed(this._offset(column, G9ESyncColumnType.String));\n }\n\n /** A GUID in canonical text form. */\n getGuid(column: number): string {\n return readGuidBytes(this._body, this._offset(column, G9ESyncColumnType.Guid));\n }\n\n getDateTime(column: number): G9DateTimeValue {\n const at = this._offset(column, G9ESyncColumnType.DateTime);\n const ticks = G9Long.readLE(this._body, at);\n const kind = this._body[at + 8] as number;\n if (ticks.compare(G9Long.ZERO) < 0 || ticks.compare(MAX_TICKS) > 0 || kind > 2) throw new G9RowBatchFormatError('Invalid DateTime value.');\n return { ticks, kind };\n }\n\n getDateTimeOffset(column: number): G9DateTimeOffsetValue {\n const at = this._offset(column, G9ESyncColumnType.DateTimeOffset);\n const utcTicks = G9Long.readLE(this._body, at);\n const raw = (this._body[at + 8] as number) | ((this._body[at + 9] as number) << 8);\n const minutes = raw >= 0x8000 ? raw - 0x10000 : raw;\n const local = utcTicks.add(G9Long.fromNumber(minutes * 600000000));\n if (\n minutes < -840 ||\n minutes > 840 ||\n utcTicks.compare(G9Long.ZERO) < 0 ||\n utcTicks.compare(MAX_TICKS) > 0 ||\n local.compare(G9Long.ZERO) < 0 ||\n local.compare(MAX_TICKS) > 0\n ) {\n throw new G9RowBatchFormatError('Invalid DateTimeOffset value.');\n }\n return { utcTicks, offsetMinutes: minutes };\n }\n\n /** A TimeSpan as ticks, exact. */\n getTimeSpan(column: number): G9Long {\n return readZigZagLong(this._body, { pos: this._offset(column, G9ESyncColumnType.TimeSpan) });\n }\n\n /** The bytes of a Bytes column (a view into the body; copy it to keep it). */\n getBytes(column: number): Uint8Array {\n return this._lengthPrefixed(this._offset(column, G9ESyncColumnType.Bytes));\n }\n\n // ---------------------------------------------------------------- internals\n\n private _readValues(): void {\n const body = this._body;\n const cursor = this._cursor;\n const count = this._types.length;\n const bitmapBytes = (count + 7) >> 3;\n this._ensure(bitmapBytes);\n const bitmap = cursor.pos;\n cursor.pos += bitmapBytes;\n this.hasValues = true;\n const offsets = this._offsets;\n for (let column = 0; column < count; column++) {\n if (((body[bitmap + (column >> 3)] as number) & (1 << (column & 7))) !== 0) {\n offsets[column] = -1;\n continue;\n }\n offsets[column] = cursor.pos;\n switch (this._types[column]) {\n case G9ESyncColumnType.Boolean:\n this._ensure(1);\n cursor.pos += 1;\n break;\n case G9ESyncColumnType.Int32:\n case G9ESyncColumnType.Int64:\n case G9ESyncColumnType.TimeSpan:\n readVarintLong(body, cursor);\n break;\n case G9ESyncColumnType.Double:\n this._ensure(8);\n cursor.pos += 8;\n break;\n case G9ESyncColumnType.Decimal:\n case G9ESyncColumnType.Guid:\n this._ensure(16);\n cursor.pos += 16;\n break;\n case G9ESyncColumnType.DateTime:\n this._ensure(9);\n cursor.pos += 9;\n break;\n case G9ESyncColumnType.DateTimeOffset:\n this._ensure(10);\n cursor.pos += 10;\n break;\n case G9ESyncColumnType.String:\n case G9ESyncColumnType.Bytes: {\n const length = readVarintInt32(body, cursor);\n this._ensure(length);\n cursor.pos += length;\n break;\n }\n default:\n throw new G9RowBatchFormatError(`Unknown column type ${this._types[column]}.`);\n }\n }\n }\n\n private _offset(column: number, expected: number): number {\n this._ensureValues(column);\n if (this._types[column] !== expected) throw new Error(`Column ${column} is ${this._types[column]}, not ${expected}.`);\n const offset = this._offsets[column] as number;\n if (offset < 0) throw new Error(`Column ${column} is NULL.`);\n return offset;\n }\n\n private _ensureValues(column: number): void {\n if (!this.hasValues) throw new Error('The current row carries no column values.');\n if (!(column >= 0 && column < this._types.length)) throw new RangeError(`Column ${column} is out of range.`);\n }\n\n private _lengthPrefixed(position: number): Uint8Array {\n const cursor = { pos: position };\n const length = readVarintInt32(this._body, cursor);\n return this._body.subarray(cursor.pos, cursor.pos + length);\n }\n\n private _readByte(): number {\n this._ensure(1);\n return this._body[this._cursor.pos++] as number;\n }\n\n private _ensure(count: number): void {\n if (count < 0 || this._cursor.pos + count > this._body.length) throw new G9RowBatchFormatError('Row batch is truncated.');\n }\n}\n\n/** DateTime.MaxValue.Ticks. */\nconst MAX_TICKS = G9Long.parse('3155378975999999999');\n\nconst DOUBLE_BUFFER = new ArrayBuffer(8);\nconst DOUBLE_VIEW = new DataView(DOUBLE_BUFFER);\nconst DOUBLE_BYTES = new Uint8Array(DOUBLE_BUFFER);\n"]}
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/protocol/rowBatch/reader.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Protocol/RowBatch/G9CRowBatchReader.cs: reads a G9RowBatch frame in either body layout. Forward\r\n// only; values are decoded from the body on demand.\r\nimport { G9ESyncColumnType } from '../../abstractions/enums.js';\r\nimport { readGuidBytes } from '../../abstractions/guid.js';\r\nimport { G9SyncKey } from '../../abstractions/key.js';\r\nimport { G9Long } from '../../abstractions/long.js';\r\nimport type { DecimalParts } from '../../internal/dotnetFormat.js';\r\nimport { utf8Decode } from '../../internal/utf8.js';\r\nimport { toRows } from './columnLayout.js';\r\nimport {\r\n type Cursor,\r\n G9ECompression,\r\n G9EPushRowOp,\r\n G9ERowBatchOp,\r\n G9RowBatchFormat,\r\n G9RowBatchFormatError,\r\n isRowBatchOp,\r\n readInt32LE,\r\n readVarint,\r\n readVarintInt32,\r\n readVarintLong,\r\n readZigZagLong,\r\n readZigZagNumber,\r\n} from './format.js';\r\nimport type { G9DateTimeOffsetValue, G9DateTimeValue } from './writer.js';\r\n\r\n/**\r\n * Decompresses a Brotli frame body. Returns exactly `expectedLength` bytes or throws. Node: `nodeBrotliDecompressor()`\r\n * (`@g9tm/syncdata/node`); Lynx: the native module of `@g9tm/syncdata-lynx`; anywhere: `jsBrotliDecompressor()`\r\n * (`@g9tm/syncdata/brotli-js`, pure JavaScript, slower).\r\n */\r\nexport interface G9FrameDecompressor {\r\n decompress(compressed: Uint8Array, expectedLength: number): Uint8Array | Promise<Uint8Array>;\r\n}\r\n\r\n/** The header of a frame, read without decoding the body. */\r\nexport interface G9FrameHeader {\r\n version: number;\r\n compression: number;\r\n bodyLength: number;\r\n}\r\n\r\n/** Validates a frame's header (magic, version, compression, body length, budget). */\r\nexport function readFrameHeader(frame: Uint8Array, maxBodyBytes: number = G9RowBatchFormat.MaxDecodedBytes): G9FrameHeader {\r\n if (!(maxBodyBytes > 0)) throw new RangeError('maxBodyBytes must be positive.');\r\n if (frame.length < G9RowBatchFormat.HeaderSize || frame[0] !== 0x47 || frame[1] !== 0x39 || frame[2] !== 0x52 || frame[3] !== 0x42) {\r\n throw new G9RowBatchFormatError('Not a G9RowBatch frame.');\r\n }\r\n const version = frame[4] as number;\r\n if (version !== G9RowBatchFormat.Version && version !== G9RowBatchFormat.ColumnVersion) {\r\n throw new G9RowBatchFormatError(`Unsupported G9RowBatch version ${version}.`);\r\n }\r\n const compression = frame[5] as number;\r\n const bodyLength = readInt32LE(frame, 6);\r\n if (bodyLength < 4 || bodyLength > G9RowBatchFormat.MaxDecodedBytes) throw new G9RowBatchFormatError('Invalid body length.');\r\n if (bodyLength > maxBodyBytes) {\r\n throw new G9RowBatchFormatError(`The frame declares a ${bodyLength}-byte body; this reader accepts at most ${maxBodyBytes} bytes.`);\r\n }\r\n if (compression !== G9ECompression.None && compression !== G9ECompression.Brotli) {\r\n throw new G9RowBatchFormatError(`Unknown compression ${compression}.`);\r\n }\r\n if (compression === G9ECompression.None && frame.length - G9RowBatchFormat.HeaderSize !== bodyLength) {\r\n throw new G9RowBatchFormatError('Body length mismatch.');\r\n }\r\n return { version, compression, bodyLength };\r\n}\r\n\r\nlet defaultDecompressor: G9FrameDecompressor | null = null;\r\n\r\n/**\r\n * Sets the Brotli decoder used wherever none is passed explicitly (the store, the engine's reconciliation). Call it\r\n * once at start-up: `useNodeBrotli()` (`@g9tm/syncdata/node`), `useLynxBrotli()` (`@g9tm/syncdata-lynx`) or\r\n * `setDefaultFrameDecompressor(jsBrotliDecompressor())` (`@g9tm/syncdata/brotli-js`).\r\n */\r\nexport function setDefaultFrameDecompressor(decompressor: G9FrameDecompressor | null): void {\r\n defaultDecompressor = decompressor;\r\n}\r\n\r\n/** The decoder set with {@link setDefaultFrameDecompressor}, or null. */\r\nexport function getDefaultFrameDecompressor(): G9FrameDecompressor | null {\r\n return defaultDecompressor;\r\n}\r\n\r\n/** Options of {@link openRowBatch}. */\r\nexport interface G9OpenRowBatchOptions {\r\n /** Brotli decoder for compressed frames (every frame the server sends over 128 bytes); the default decoder when omitted. */\r\n decompressor?: G9FrameDecompressor | null;\r\n /** The largest decoded body this caller allocates for (ADR-0051). */\r\n maxBodyBytes?: number;\r\n}\r\n\r\n/**\r\n * Validates, decompresses when needed, and opens a frame. Async because a Lynx decompressor crosses the native bridge;\r\n * an uncompressed frame resolves without waiting on anything.\r\n */\r\nexport async function openRowBatch(frame: Uint8Array, options?: G9OpenRowBatchOptions): Promise<G9RowBatchReader> {\r\n const header = readFrameHeader(frame, options?.maxBodyBytes);\r\n if (header.compression === G9ECompression.None) return G9RowBatchReader.fromBody(frame.subarray(G9RowBatchFormat.HeaderSize), header.version);\r\n const decompressor = options?.decompressor ?? defaultDecompressor;\r\n if (!decompressor) {\r\n throw new G9RowBatchFormatError('The frame is Brotli-compressed and no decompressor is configured (see G9FrameDecompressor).');\r\n }\r\n let body: Uint8Array;\r\n try {\r\n body = await decompressor.decompress(frame.subarray(G9RowBatchFormat.HeaderSize), header.bodyLength);\r\n } catch (error) {\r\n throw new G9RowBatchFormatError(`Brotli body could not be decompressed: ${error instanceof Error ? error.message : String(error)}`);\r\n }\r\n if (!body || body.length !== header.bodyLength) throw new G9RowBatchFormatError('Brotli body could not be decompressed.');\r\n return G9RowBatchReader.fromBody(body, header.version);\r\n}\r\n\r\n/** Opens an uncompressed frame synchronously (throws for a compressed one). */\r\nexport function openRowBatchSync(frame: Uint8Array, maxBodyBytes?: number): G9RowBatchReader {\r\n const header = readFrameHeader(frame, maxBodyBytes);\r\n if (header.compression !== G9ECompression.None) throw new G9RowBatchFormatError('The frame is compressed; use openRowBatch.');\r\n return G9RowBatchReader.fromBody(frame.subarray(G9RowBatchFormat.HeaderSize), header.version);\r\n}\r\n\r\n/** Reads the sections and rows of one G9RowBatch body. */\r\nexport class G9RowBatchReader {\r\n private readonly _body: Uint8Array;\r\n private readonly _cursor: Cursor = { pos: 4 };\r\n private _sectionsRemaining: number;\r\n private _sectionOpen = false;\r\n private _rowsRemaining = 0;\r\n private _types: number[] = [];\r\n private _offsets: number[] = [];\r\n private _keyStart = 0;\r\n private _keyLength = 0;\r\n private _keyText: string | null = null;\r\n private _versionPos = -1;\r\n private _sequencePos = -1;\r\n private _baseVersionPos = -1;\r\n private _hlcPos = -1;\r\n\r\n readonly sectionCount: number;\r\n\r\n // section\r\n op = 0;\r\n tableId = 0;\r\n keyType = 0;\r\n rowCount = 0;\r\n\r\n // row\r\n version = 0;\r\n pushOp = 0;\r\n sequence = 0;\r\n baseVersion = 0;\r\n dirtyMask: G9Long = G9Long.ZERO;\r\n hlcMs = 0;\r\n rowHash: G9Long = G9Long.ZERO;\r\n hasValues = false;\r\n\r\n private constructor(body: Uint8Array) {\r\n if (body.length < 4) throw new G9RowBatchFormatError('Row batch body is too short.');\r\n this._body = body;\r\n this.sectionCount = readInt32LE(body, 0);\r\n if (this.sectionCount < 0) throw new G9RowBatchFormatError('Negative section count.');\r\n this._sectionsRemaining = this.sectionCount;\r\n }\r\n\r\n /** Opens an already decompressed body of the given layout version. */\r\n static fromBody(body: Uint8Array, version: number): G9RowBatchReader {\r\n return new G9RowBatchReader(version === G9RowBatchFormat.ColumnVersion ? toRows(body) : body);\r\n }\r\n\r\n /** The decoded size of this frame's body (row-wise layout). */\r\n get bodyBytes(): number {\r\n return this._body.length;\r\n }\r\n\r\n get columnTypes(): readonly number[] {\r\n return this._types;\r\n }\r\n\r\n get columnCount(): number {\r\n return this._types.length;\r\n }\r\n\r\n /** Moves to the next section, skipping unread rows of the current one. */\r\n nextSection(): boolean {\r\n if (this._sectionOpen) {\r\n while (this.readRow()) {\r\n // skip\r\n }\r\n }\r\n if (this._sectionsRemaining === 0) {\r\n this._sectionOpen = false;\r\n return false;\r\n }\r\n const body = this._body;\r\n const cursor = this._cursor;\r\n this.op = this._readByte();\r\n if (!isRowBatchOp(this.op)) throw new G9RowBatchFormatError(`Unknown op ${this.op}.`);\r\n this.tableId = readVarintInt32(body, cursor);\r\n this.keyType = this._readByte();\r\n if (!G9SyncKey.isSupportedKeyType(this.keyType)) throw new G9RowBatchFormatError(`Unsupported key type ${this.keyType}.`);\r\n const columnCount = readVarintInt32(body, cursor);\r\n if (columnCount > 1024) throw new G9RowBatchFormatError('Too many columns.');\r\n this._ensure(columnCount + 4);\r\n const types: number[] = [];\r\n for (let i = 0; i < columnCount; i++) types.push(body[cursor.pos++] as number);\r\n this._types = types;\r\n this.rowCount = readInt32LE(body, cursor.pos);\r\n cursor.pos += 4;\r\n if (this.rowCount < 0) throw new G9RowBatchFormatError('Negative row count.');\r\n if (this._offsets.length < columnCount) this._offsets = new Array<number>(columnCount);\r\n this._rowsRemaining = this.rowCount;\r\n this._sectionsRemaining--;\r\n this._sectionOpen = true;\r\n return true;\r\n }\r\n\r\n /** Moves to the next row of the current section. */\r\n readRow(): boolean {\r\n if (!this._sectionOpen || this._rowsRemaining === 0) return false;\r\n const body = this._body;\r\n const cursor = this._cursor;\r\n this._keyText = null;\r\n this.hasValues = false;\r\n this.version = 0;\r\n this.rowHash = G9Long.ZERO;\r\n\r\n switch (this.keyType) {\r\n case G9ESyncColumnType.Guid:\r\n this._ensure(16);\r\n this._keyStart = cursor.pos;\r\n this._keyLength = 16;\r\n cursor.pos += 16;\r\n break;\r\n case G9ESyncColumnType.Int32:\r\n case G9ESyncColumnType.Int64:\r\n this._keyStart = cursor.pos;\r\n readVarintLong(body, cursor);\r\n this._keyLength = cursor.pos - this._keyStart;\r\n break;\r\n default: {\r\n const length = readVarintInt32(body, cursor);\r\n this._ensure(length);\r\n this._keyStart = cursor.pos;\r\n this._keyLength = length;\r\n cursor.pos += length;\r\n break;\r\n }\r\n }\r\n\r\n switch (this.op) {\r\n case G9ERowBatchOp.Upsert:\r\n case G9ERowBatchOp.Backfill:\r\n this._versionPos = cursor.pos;\r\n this.version = readVarint(body, cursor);\r\n this._readValues();\r\n break;\r\n case G9ERowBatchOp.Tombstone:\r\n case G9ERowBatchOp.MoveOut:\r\n this._versionPos = cursor.pos;\r\n this.version = readVarint(body, cursor);\r\n break;\r\n case G9ERowBatchOp.KeyVersions:\r\n this._versionPos = cursor.pos;\r\n this.version = readVarint(body, cursor);\r\n this._ensure(8);\r\n this.rowHash = G9Long.readLE(body, cursor.pos);\r\n cursor.pos += 8;\r\n break;\r\n case G9ERowBatchOp.Push:\r\n this.pushOp = this._readByte();\r\n if (this.pushOp !== G9EPushRowOp.Upsert && this.pushOp !== G9EPushRowOp.Delete) throw new G9RowBatchFormatError(`Unknown push op ${this.pushOp}.`);\r\n this._versionPos = -1;\r\n this._sequencePos = cursor.pos;\r\n this.sequence = readVarint(body, cursor);\r\n this._baseVersionPos = cursor.pos;\r\n this.baseVersion = readVarint(body, cursor);\r\n this._ensure(8);\r\n this.dirtyMask = G9Long.readLE(body, cursor.pos);\r\n cursor.pos += 8;\r\n this._hlcPos = cursor.pos;\r\n this.hlcMs = readZigZagNumber(body, cursor);\r\n if (this.pushOp === G9EPushRowOp.Upsert) this._readValues();\r\n break;\r\n }\r\n this._rowsRemaining--;\r\n return true;\r\n }\r\n\r\n /** The row's version, exact (the {@link version} number is exact below 2^53). */\r\n get versionLong(): G9Long {\r\n return this._versionPos < 0 ? G9Long.ZERO : readVarintLong(this._body, { pos: this._versionPos });\r\n }\r\n\r\n /** A push row's local sequence, exact. */\r\n get sequenceLong(): G9Long {\r\n return readVarintLong(this._body, { pos: this._sequencePos });\r\n }\r\n\r\n /** A push row's base version, exact. */\r\n get baseVersionLong(): G9Long {\r\n return readVarintLong(this._body, { pos: this._baseVersionPos });\r\n }\r\n\r\n /** A push row's HLC milliseconds, exact. */\r\n get hlcLong(): G9Long {\r\n return readZigZagLong(this._body, { pos: this._hlcPos });\r\n }\r\n\r\n // ---------------------------------------------------------------- key\r\n\r\n /** Canonical key text (see G9SyncKey). */\r\n get key(): string {\r\n if (this._keyText === null) {\r\n switch (this.keyType) {\r\n case G9ESyncColumnType.Guid:\r\n this._keyText = readGuidBytes(this._body, this._keyStart);\r\n break;\r\n case G9ESyncColumnType.Int32:\r\n case G9ESyncColumnType.Int64:\r\n this._keyText = this.keyInt64.toString();\r\n break;\r\n default:\r\n this._keyText = utf8Decode(this._body.subarray(this._keyStart, this._keyStart + this._keyLength));\r\n break;\r\n }\r\n }\r\n return this._keyText;\r\n }\r\n\r\n /** The integer key. */\r\n get keyInt64(): G9Long {\r\n if (this.keyType !== G9ESyncColumnType.Int32 && this.keyType !== G9ESyncColumnType.Int64) throw new Error(`Key type is ${this.keyType}.`);\r\n return readZigZagLong(this._body, { pos: this._keyStart });\r\n }\r\n\r\n /** UTF-8 bytes of a string key. */\r\n get keyUtf8(): Uint8Array {\r\n if (this.keyType !== G9ESyncColumnType.String) throw new Error(`Key type is ${this.keyType}.`);\r\n return this._body.subarray(this._keyStart, this._keyStart + this._keyLength);\r\n }\r\n\r\n // ---------------------------------------------------------------- values\r\n\r\n isNull(column: number): boolean {\r\n this._ensureValues(column);\r\n return (this._offsets[column] as number) < 0;\r\n }\r\n\r\n getBoolean(column: number): boolean {\r\n return this._body[this._offset(column, G9ESyncColumnType.Boolean)] !== 0;\r\n }\r\n\r\n getInt32(column: number): number {\r\n const value = readZigZagNumber(this._body, { pos: this._offset(column, G9ESyncColumnType.Int32) });\r\n if (value < -2147483648 || value > 2147483647) throw new G9RowBatchFormatError('Int32 value is out of range.');\r\n return value;\r\n }\r\n\r\n /** An Int64 value, exact. */\r\n getInt64(column: number): G9Long {\r\n return readZigZagLong(this._body, { pos: this._offset(column, G9ESyncColumnType.Int64) });\r\n }\r\n\r\n getDouble(column: number): number {\r\n const at = this._offset(column, G9ESyncColumnType.Double);\r\n for (let i = 0; i < 8; i++) DOUBLE_BYTES[i] = this._body[at + i] as number;\r\n return DOUBLE_VIEW.getFloat64(0, true);\r\n }\r\n\r\n getDecimal(column: number): DecimalParts {\r\n const at = this._offset(column, G9ESyncColumnType.Decimal);\r\n const flags = readInt32LE(this._body, at + 12);\r\n // decimal.GetBits: bits 0-15 and 24-30 of the flags are zero and the scale is at most 28.\r\n if ((flags & 0x7f00ffff) !== 0 || ((flags >> 16) & 0xff) > 28) throw new G9RowBatchFormatError('Invalid decimal value.');\r\n return {\r\n lo: readInt32LE(this._body, at) >>> 0,\r\n mid: readInt32LE(this._body, at + 4) >>> 0,\r\n hi: readInt32LE(this._body, at + 8) >>> 0,\r\n scale: (flags >> 16) & 0xff,\r\n negative: flags < 0,\r\n };\r\n }\r\n\r\n getString(column: number): string {\r\n return utf8Decode(this.getUtf8(column));\r\n }\r\n\r\n getUtf8(column: number): Uint8Array {\r\n return this._lengthPrefixed(this._offset(column, G9ESyncColumnType.String));\r\n }\r\n\r\n /** A GUID in canonical text form. */\r\n getGuid(column: number): string {\r\n return readGuidBytes(this._body, this._offset(column, G9ESyncColumnType.Guid));\r\n }\r\n\r\n getDateTime(column: number): G9DateTimeValue {\r\n const at = this._offset(column, G9ESyncColumnType.DateTime);\r\n const ticks = G9Long.readLE(this._body, at);\r\n const kind = this._body[at + 8] as number;\r\n if (ticks.compare(G9Long.ZERO) < 0 || ticks.compare(MAX_TICKS) > 0 || kind > 2) throw new G9RowBatchFormatError('Invalid DateTime value.');\r\n return { ticks, kind };\r\n }\r\n\r\n getDateTimeOffset(column: number): G9DateTimeOffsetValue {\r\n const at = this._offset(column, G9ESyncColumnType.DateTimeOffset);\r\n const utcTicks = G9Long.readLE(this._body, at);\r\n const raw = (this._body[at + 8] as number) | ((this._body[at + 9] as number) << 8);\r\n const minutes = raw >= 0x8000 ? raw - 0x10000 : raw;\r\n const local = utcTicks.add(G9Long.fromNumber(minutes * 600000000));\r\n if (\r\n minutes < -840 ||\r\n minutes > 840 ||\r\n utcTicks.compare(G9Long.ZERO) < 0 ||\r\n utcTicks.compare(MAX_TICKS) > 0 ||\r\n local.compare(G9Long.ZERO) < 0 ||\r\n local.compare(MAX_TICKS) > 0\r\n ) {\r\n throw new G9RowBatchFormatError('Invalid DateTimeOffset value.');\r\n }\r\n return { utcTicks, offsetMinutes: minutes };\r\n }\r\n\r\n /** A TimeSpan as ticks, exact. */\r\n getTimeSpan(column: number): G9Long {\r\n return readZigZagLong(this._body, { pos: this._offset(column, G9ESyncColumnType.TimeSpan) });\r\n }\r\n\r\n /** The bytes of a Bytes column (a view into the body; copy it to keep it). */\r\n getBytes(column: number): Uint8Array {\r\n return this._lengthPrefixed(this._offset(column, G9ESyncColumnType.Bytes));\r\n }\r\n\r\n // ---------------------------------------------------------------- internals\r\n\r\n private _readValues(): void {\r\n const body = this._body;\r\n const cursor = this._cursor;\r\n const count = this._types.length;\r\n const bitmapBytes = (count + 7) >> 3;\r\n this._ensure(bitmapBytes);\r\n const bitmap = cursor.pos;\r\n cursor.pos += bitmapBytes;\r\n this.hasValues = true;\r\n const offsets = this._offsets;\r\n for (let column = 0; column < count; column++) {\r\n if (((body[bitmap + (column >> 3)] as number) & (1 << (column & 7))) !== 0) {\r\n offsets[column] = -1;\r\n continue;\r\n }\r\n offsets[column] = cursor.pos;\r\n switch (this._types[column]) {\r\n case G9ESyncColumnType.Boolean:\r\n this._ensure(1);\r\n cursor.pos += 1;\r\n break;\r\n case G9ESyncColumnType.Int32:\r\n case G9ESyncColumnType.Int64:\r\n case G9ESyncColumnType.TimeSpan:\r\n readVarintLong(body, cursor);\r\n break;\r\n case G9ESyncColumnType.Double:\r\n this._ensure(8);\r\n cursor.pos += 8;\r\n break;\r\n case G9ESyncColumnType.Decimal:\r\n case G9ESyncColumnType.Guid:\r\n this._ensure(16);\r\n cursor.pos += 16;\r\n break;\r\n case G9ESyncColumnType.DateTime:\r\n this._ensure(9);\r\n cursor.pos += 9;\r\n break;\r\n case G9ESyncColumnType.DateTimeOffset:\r\n this._ensure(10);\r\n cursor.pos += 10;\r\n break;\r\n case G9ESyncColumnType.String:\r\n case G9ESyncColumnType.Bytes: {\r\n const length = readVarintInt32(body, cursor);\r\n this._ensure(length);\r\n cursor.pos += length;\r\n break;\r\n }\r\n default:\r\n throw new G9RowBatchFormatError(`Unknown column type ${this._types[column]}.`);\r\n }\r\n }\r\n }\r\n\r\n private _offset(column: number, expected: number): number {\r\n this._ensureValues(column);\r\n if (this._types[column] !== expected) throw new Error(`Column ${column} is ${this._types[column]}, not ${expected}.`);\r\n const offset = this._offsets[column] as number;\r\n if (offset < 0) throw new Error(`Column ${column} is NULL.`);\r\n return offset;\r\n }\r\n\r\n private _ensureValues(column: number): void {\r\n if (!this.hasValues) throw new Error('The current row carries no column values.');\r\n if (!(column >= 0 && column < this._types.length)) throw new RangeError(`Column ${column} is out of range.`);\r\n }\r\n\r\n private _lengthPrefixed(position: number): Uint8Array {\r\n const cursor = { pos: position };\r\n const length = readVarintInt32(this._body, cursor);\r\n return this._body.subarray(cursor.pos, cursor.pos + length);\r\n }\r\n\r\n private _readByte(): number {\r\n this._ensure(1);\r\n return this._body[this._cursor.pos++] as number;\r\n }\r\n\r\n private _ensure(count: number): void {\r\n if (count < 0 || this._cursor.pos + count > this._body.length) throw new G9RowBatchFormatError('Row batch is truncated.');\r\n }\r\n}\r\n\r\n/** DateTime.MaxValue.Ticks. */\r\nconst MAX_TICKS = G9Long.parse('3155378975999999999');\r\n\r\nconst DOUBLE_BUFFER = new ArrayBuffer(8);\r\nconst DOUBLE_VIEW = new DataView(DOUBLE_BUFFER);\r\nconst DOUBLE_BYTES = new Uint8Array(DOUBLE_BUFFER);\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/protocol/rowBatch/writer.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Protocol/RowBatch/G9CRowBatchWriter.cs. Same bytes for the same rows: the frame header, the\n// section layout and every value encoding are specified in AiGuides/04-Protocol.md.\nimport { G9ESyncColumnType, isColumnType } from '../../abstractions/enums.js';\nimport { writeGuidBytes } from '../../abstractions/guid.js';\nimport { G9SyncKey } from '../../abstractions/key.js';\nimport { G9Long } from '../../abstractions/long.js';\nimport { type DecimalParts, parseDecimal } from '../../internal/dotnetFormat.js';\nimport { utf8Encode } from '../../internal/utf8.js';\nimport { fromRows } from './columnLayout.js';\nimport { G9ECompression, G9EPushRowOp, G9ERowBatchOp, G9RowBatchFormat, isRowBatchOp, writeInt32LE, zigZag } from './format.js';\n\n/** A DateTime value on the wire: ticks (100 ns since 0001-01-01) and the `DateTimeKind` (0 unspecified, 1 UTC, 2 local). */\nexport interface G9DateTimeValue {\n ticks: G9Long;\n kind: number;\n}\n\n/** A DateTimeOffset value on the wire: UTC ticks and the offset in minutes. */\nexport interface G9DateTimeOffsetValue {\n utcTicks: G9Long;\n offsetMinutes: number;\n}\n\n/**\n * A compressor for push frames. Optional: without one the writer emits uncompressed frames, which every reader\n * accepts (the .NET writer falls back to them whenever compression does not help).\n */\nexport interface G9FrameCompressor {\n compress(body: Uint8Array, quality: number, window: number): Uint8Array | null;\n}\n\n/**\n * Writes a G9RowBatch frame: a 10-byte header (`'G' '9' 'R' 'B' | version | compression | body length i32 LE`) and a\n * body of sections, each holding rows of one table and one op.\n */\nexport class G9RowBatchWriter {\n private _buffer: Uint8Array;\n private _length = 4;\n private _sectionCount = 0;\n private _totalRows = 0;\n\n private _inSection = false;\n private _op: number = 0;\n private _keyType: number = 0;\n private _types: number[] = [];\n private _rowCountPosition = 0;\n private _sectionRows = 0;\n\n private _inRow = false;\n private _rowHasValues = false;\n private _column = 0;\n private _bitmapPosition = 0;\n\n constructor(initialCapacity: number = 64 * 1024) {\n this._buffer = new Uint8Array(Math.max(initialCapacity, 256));\n }\n\n /** Uncompressed body length written so far. */\n get length(): number {\n return this._length;\n }\n\n get totalRows(): number {\n return this._totalRows;\n }\n\n get sectionCount(): number {\n return this._sectionCount;\n }\n\n get currentSectionRows(): number {\n return this._sectionRows;\n }\n\n get inSection(): boolean {\n return this._inSection;\n }\n\n /** Starts a section. Key-only ops (Tombstone, MoveOut, KeyVersions) take no column types. */\n beginSection(op: number, tableId: number, keyType: number, columnTypes: readonly number[]): void {\n if (this._inSection) throw new Error('EndSection must be called before BeginSection.');\n if (!isRowBatchOp(op)) throw new RangeError(`Unknown row batch op ${op}.`);\n if (!G9SyncKey.isSupportedKeyType(keyType)) throw new RangeError(`Unsupported key type ${keyType}.`);\n if (!(tableId >= 0) || Math.floor(tableId) !== tableId) throw new RangeError('The table id must be a non-negative integer.');\n if ((op === G9ERowBatchOp.Tombstone || op === G9ERowBatchOp.MoveOut || op === G9ERowBatchOp.KeyVersions) && columnTypes.length > 0) {\n throw new RangeError('Key-only sections carry no columns.');\n }\n if (columnTypes.length > 1024) throw new RangeError('Too many columns.');\n for (const type of columnTypes) {\n if (!isColumnType(type)) throw new RangeError(`Invalid column type '${type}'.`);\n }\n\n this._ensure(2 + 20 + columnTypes.length + 4);\n this._buffer[this._length++] = op;\n this._varintNumber(tableId);\n this._buffer[this._length++] = keyType;\n this._varintNumber(columnTypes.length);\n for (const type of columnTypes) this._buffer[this._length++] = type;\n this._rowCountPosition = this._length;\n this._length += 4;\n\n this._op = op;\n this._keyType = keyType;\n this._types = columnTypes.slice();\n this._sectionRows = 0;\n this._inSection = true;\n }\n\n endSection(): void {\n if (!this._inSection) throw new Error('No section is open.');\n if (this._inRow) throw new Error('EndRow must be called before EndSection.');\n writeInt32LE(this._buffer, this._rowCountPosition, this._sectionRows);\n this._sectionCount++;\n this._inSection = false;\n }\n\n // ---------------------------------------------------------------- rows\n\n /** Starts an Upsert or Backfill row; write every column, then {@link endRow}. `key` is canonical key text. */\n beginRow(key: string, version: number | G9Long): void {\n this._startRow(G9ERowBatchOp.Upsert, G9ERowBatchOp.Backfill);\n this._writeKey(key);\n this._unsigned(version);\n this._openValues();\n }\n\n /** Adds a complete Tombstone or MoveOut row. */\n addKey(key: string, version: number | G9Long): void {\n this._startRow(G9ERowBatchOp.Tombstone, G9ERowBatchOp.MoveOut);\n this._writeKey(key);\n this._unsigned(version);\n this._completeRow();\n }\n\n /** Adds a complete KeyVersions row. */\n addKeyVersion(key: string, version: number | G9Long, rowHash: G9Long): void {\n this._startRow(G9ERowBatchOp.KeyVersions, G9ERowBatchOp.KeyVersions);\n this._writeKey(key);\n this._unsigned(version);\n this._ensure(8);\n rowHash.writeLE(this._buffer, this._length);\n this._length += 8;\n this._completeRow();\n }\n\n /** Starts a Push row. Upserts must then write every column; deletes write none. Finish with {@link endRow}. */\n beginPushRow(key: string, op: number, sequence: number | G9Long, baseVersion: number | G9Long, dirtyMask: G9Long, hlcMs: number | G9Long): void {\n this._startRow(G9ERowBatchOp.Push, G9ERowBatchOp.Push);\n if (op !== G9EPushRowOp.Upsert && op !== G9EPushRowOp.Delete) throw new RangeError(`Unknown push op ${op}.`);\n this._writeKey(key);\n this._ensure(1);\n this._buffer[this._length++] = op;\n this._unsigned(sequence);\n this._unsigned(baseVersion);\n this._ensure(8);\n dirtyMask.writeLE(this._buffer, this._length);\n this._length += 8;\n if (hlcMs instanceof G9Long) this._varintLong(zigZag(hlcMs));\n else this._zigZagNumber(hlcMs);\n if (op === G9EPushRowOp.Upsert) this._openValues();\n }\n\n /** Completes a row started with beginRow or beginPushRow. */\n endRow(): void {\n if (!this._inRow) throw new Error('No row is open.');\n if (this._rowHasValues && this._column !== this._types.length) {\n throw new Error(`Row ended after ${this._column} of ${this._types.length} column values.`);\n }\n this._completeRow();\n }\n\n // ---------------------------------------------------------------- values\n\n writeNull(): void {\n const column = this._nextColumn(null);\n const at = this._bitmapPosition + (column >> 3);\n this._buffer[at] = (this._buffer[at] as number) | (1 << (column & 7));\n }\n\n writeBoolean(value: boolean): void {\n this._nextColumn(G9ESyncColumnType.Boolean);\n this._ensure(1);\n this._buffer[this._length++] = value ? 1 : 0;\n }\n\n writeInt32(value: number): void {\n this._nextColumn(G9ESyncColumnType.Int32);\n if (!(value >= -2147483648 && value <= 2147483647) || Math.floor(value) !== value) throw new RangeError(`${value} is not an Int32.`);\n this._zigZagNumber(value);\n }\n\n writeInt64(value: number | G9Long): void {\n this._nextColumn(G9ESyncColumnType.Int64);\n if (value instanceof G9Long) this._varintLong(zigZag(value));\n else this._zigZagNumber(value);\n }\n\n writeDouble(value: number): void {\n this._nextColumn(G9ESyncColumnType.Double);\n this._ensure(8);\n DOUBLE_VIEW.setFloat64(0, value, true);\n for (let i = 0; i < 8; i++) this._buffer[this._length + i] = DOUBLE_BYTES[i] as number;\n this._length += 8;\n }\n\n /** A decimal: its .NET parts, or invariant decimal text. */\n writeDecimal(value: DecimalParts | string): void {\n this._nextColumn(G9ESyncColumnType.Decimal);\n const parts = typeof value === 'string' ? parseDecimal(value) : value;\n if (!parts) throw new RangeError(`'${String(value)}' is not a decimal.`);\n if (!(parts.scale >= 0 && parts.scale <= 28)) throw new RangeError('Decimal scale must be 0..28.');\n this._ensure(16);\n const flags = ((parts.scale & 0xff) << 16) | (parts.negative ? 0x80000000 : 0);\n writeInt32LE(this._buffer, this._length, parts.lo);\n writeInt32LE(this._buffer, this._length + 4, parts.mid);\n writeInt32LE(this._buffer, this._length + 8, parts.hi);\n writeInt32LE(this._buffer, this._length + 12, flags);\n this._length += 16;\n }\n\n /** Writes a string, or NULL when `value` is null. */\n writeString(value: string | null): void {\n if (value === null || value === undefined) {\n this.writeNull();\n return;\n }\n this._nextColumn(G9ESyncColumnType.String);\n this._bytesRaw(utf8Encode(value));\n }\n\n /** Writes a string that is already UTF-8 encoded. */\n writeStringUtf8(utf8: Uint8Array): void {\n this._nextColumn(G9ESyncColumnType.String);\n this._bytesRaw(utf8);\n }\n\n /** Writes a GUID given as text in any form `Guid.Parse` accepts. */\n writeGuid(value: string): void {\n this._nextColumn(G9ESyncColumnType.Guid);\n this._ensure(16);\n writeGuidBytes(value, this._buffer, this._length);\n this._length += 16;\n }\n\n writeDateTime(value: G9DateTimeValue): void {\n this._nextColumn(G9ESyncColumnType.DateTime);\n this._ensure(9);\n value.ticks.writeLE(this._buffer, this._length);\n this._length += 8;\n this._buffer[this._length++] = value.kind & 0xff;\n }\n\n writeDateTimeOffset(value: G9DateTimeOffsetValue): void {\n this._nextColumn(G9ESyncColumnType.DateTimeOffset);\n if (!(value.offsetMinutes >= -32768 && value.offsetMinutes <= 32767)) throw new RangeError('The offset does not fit 16 bits.');\n this._ensure(10);\n value.utcTicks.writeLE(this._buffer, this._length);\n this._length += 8;\n this._buffer[this._length++] = value.offsetMinutes & 0xff;\n this._buffer[this._length++] = (value.offsetMinutes >> 8) & 0xff;\n }\n\n /** A TimeSpan as ticks. */\n writeTimeSpan(ticks: number | G9Long): void {\n this._nextColumn(G9ESyncColumnType.TimeSpan);\n if (ticks instanceof G9Long) this._varintLong(zigZag(ticks));\n else this._zigZagNumber(ticks);\n }\n\n writeBytes(value: Uint8Array): void {\n this._nextColumn(G9ESyncColumnType.Bytes);\n this._bytesRaw(value);\n }\n\n // ---------------------------------------------------------------- frame\n\n /**\n * Produces the frame. With a compressor and `compression` Brotli, the body is compressed when it is over 128 bytes\n * and compression helps; otherwise the frame is uncompressed. `version` 2 writes the column-grouped layout (only for\n * a peer that asked for it).\n */\n toFrame(options?: { compression?: number; quality?: number; version?: number; compressor?: G9FrameCompressor | null }): Uint8Array {\n if (this._inSection) throw new Error('EndSection must be called before ToFrame.');\n const version = options?.version ?? G9RowBatchFormat.Version;\n if (version !== G9RowBatchFormat.Version && version !== G9RowBatchFormat.ColumnVersion) {\n throw new RangeError(`Unknown G9RowBatch version ${version}.`);\n }\n writeInt32LE(this._buffer, 0, this._sectionCount);\n const rows = this._buffer.subarray(0, this._length);\n const body = version === G9RowBatchFormat.ColumnVersion ? fromRows(rows) : rows;\n\n const compression = options?.compression ?? G9ECompression.Brotli;\n const compressor = options?.compressor;\n if (compression === G9ECompression.Brotli && compressor && body.length > 128) {\n const compressed = compressor.compress(body, options?.quality ?? 4, 22);\n if (compressed && compressed.length < body.length) {\n const frame = new Uint8Array(G9RowBatchFormat.HeaderSize + compressed.length);\n writeHeader(frame, version, G9ECompression.Brotli, body.length);\n frame.set(compressed, G9RowBatchFormat.HeaderSize);\n return frame;\n }\n }\n const frame = new Uint8Array(G9RowBatchFormat.HeaderSize + body.length);\n writeHeader(frame, version, G9ECompression.None, body.length);\n frame.set(body, G9RowBatchFormat.HeaderSize);\n return frame;\n }\n\n /** Clears all content so the buffer can be reused for the next frame. */\n reset(): void {\n this._length = 4;\n this._sectionCount = 0;\n this._totalRows = 0;\n this._inSection = false;\n this._inRow = false;\n this._rowHasValues = false;\n this._sectionRows = 0;\n }\n\n // ---------------------------------------------------------------- internals\n\n private _startRow(allowed1: number, allowed2: number): void {\n if (!this._inSection) throw new Error('BeginSection must be called before adding rows.');\n if (this._inRow) throw new Error('EndRow must be called before starting another row.');\n if (this._op !== allowed1 && this._op !== allowed2) throw new Error(`This row kind is not valid in a section of op ${this._op}.`);\n this._inRow = true;\n this._rowHasValues = false;\n this._column = 0;\n }\n\n private _completeRow(): void {\n this._inRow = false;\n this._rowHasValues = false;\n this._sectionRows++;\n this._totalRows++;\n }\n\n private _openValues(): void {\n const bitmapBytes = (this._types.length + 7) >> 3;\n this._ensure(bitmapBytes);\n this._bitmapPosition = this._length;\n this._buffer.fill(0, this._length, this._length + bitmapBytes);\n this._length += bitmapBytes;\n this._column = 0;\n this._rowHasValues = true;\n }\n\n private _nextColumn(expected: number | null): number {\n if (!this._inRow || !this._rowHasValues) throw new Error('No row with column values is open.');\n if (this._column >= this._types.length) throw new Error('Every column of this row has already been written.');\n if (expected !== null && this._types[this._column] !== expected) {\n throw new Error(`Column ${this._column} is declared ${this._types[this._column]}, but a ${expected} value was written.`);\n }\n return this._column++;\n }\n\n private _writeKey(key: string): void {\n if (typeof key !== 'string') throw new TypeError('The key is required.');\n switch (this._keyType) {\n case G9ESyncColumnType.Guid:\n this._ensure(16);\n writeGuidBytes(key, this._buffer, this._length);\n this._length += 16;\n break;\n case G9ESyncColumnType.Int32:\n case G9ESyncColumnType.Int64:\n this._varintLong(zigZag(G9Long.parse(key)));\n break;\n default:\n this._bytesRaw(utf8Encode(key));\n break;\n }\n }\n\n private _unsigned(value: number | G9Long): void {\n if (value instanceof G9Long) {\n if (value.isNegative()) throw new RangeError(`${value.toString()} must be non-negative.`);\n this._varintLong(value);\n return;\n }\n if (!(value >= 0) || Math.floor(value) !== value) throw new RangeError(`${value} must be a non-negative integer.`);\n if (value > 9007199254740991) this._varintLong(G9Long.fromNumber(value));\n else this._varintNumber(value);\n }\n\n private _varintNumber(value: number): void {\n this._ensure(10);\n let v = value;\n while (v >= 128) {\n this._buffer[this._length++] = (v % 128) | 0x80;\n v = Math.floor(v / 128);\n }\n this._buffer[this._length++] = v;\n }\n\n private _varintLong(value: G9Long): void {\n this._ensure(10);\n let lo = value.lo;\n let hi = value.hi >>> 0;\n while (hi !== 0 || lo >= 128) {\n this._buffer[this._length++] = (lo & 0x7f) | 0x80;\n lo = ((lo >>> 7) | (hi << 25)) >>> 0;\n hi = hi >>> 7;\n }\n this._buffer[this._length++] = lo;\n }\n\n private _zigZagNumber(value: number): void {\n if (Math.floor(value) !== value) throw new RangeError(`${value} is not an integer.`);\n if (value >= -4503599627370496 && value < 4503599627370496) this._varintNumber(value >= 0 ? value * 2 : -value * 2 - 1);\n else this._varintLong(zigZag(G9Long.fromNumber(value)));\n }\n\n private _bytesRaw(value: Uint8Array): void {\n this._ensure(10 + value.length);\n this._varintNumber(value.length);\n this._buffer.set(value, this._length);\n this._length += value.length;\n }\n\n private _ensure(additional: number): void {\n const required = this._length + additional;\n if (required <= this._buffer.length) return;\n if (required > G9RowBatchFormat.MaxBodyBytes) throw new Error('Row batch exceeds the maximum body size.');\n const next = new Uint8Array(Math.min(Math.max(required, this._buffer.length * 2), G9RowBatchFormat.MaxBodyBytes));\n next.set(this._buffer.subarray(0, this._length));\n this._buffer = next;\n }\n}\n\nconst DOUBLE_BUFFER = new ArrayBuffer(8);\nconst DOUBLE_VIEW = new DataView(DOUBLE_BUFFER);\nconst DOUBLE_BYTES = new Uint8Array(DOUBLE_BUFFER);\n\nfunction writeHeader(frame: Uint8Array, version: number, compression: number, bodyLength: number): void {\n frame[0] = 0x47; // G\n frame[1] = 0x39; // 9\n frame[2] = 0x52; // R\n frame[3] = 0x42; // B\n frame[4] = version;\n frame[5] = compression;\n writeInt32LE(frame, 6, bodyLength);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/protocol/rowBatch/writer.ts"],"names":[],"mappings":"AAAA,iHAAiH;AACjH,oFAAoF;AACpF,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAqB,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAsBhI;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IAkB3B,YAAY,kBAA0B,EAAE,GAAG,IAAI;QAhBvC,YAAO,GAAG,CAAC,CAAC;QACZ,kBAAa,GAAG,CAAC,CAAC;QAClB,eAAU,GAAG,CAAC,CAAC;QAEf,eAAU,GAAG,KAAK,CAAC;QACnB,QAAG,GAAW,CAAC,CAAC;QAChB,aAAQ,GAAW,CAAC,CAAC;QACrB,WAAM,GAAa,EAAE,CAAC;QACtB,sBAAiB,GAAG,CAAC,CAAC;QACtB,iBAAY,GAAG,CAAC,CAAC;QAEjB,WAAM,GAAG,KAAK,CAAC;QACf,kBAAa,GAAG,KAAK,CAAC;QACtB,YAAO,GAAG,CAAC,CAAC;QACZ,oBAAe,GAAG,CAAC,CAAC;QAG1B,IAAI,CAAC,OAAO,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,+CAA+C;IAC/C,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,6FAA6F;IAC7F,YAAY,CAAC,EAAU,EAAE,OAAe,EAAE,OAAe,EAAE,WAA8B;QACvF,IAAI,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACvF,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;QAC3E,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,wBAAwB,OAAO,GAAG,CAAC,CAAC;QACrG,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,OAAO;YAAE,MAAM,IAAI,UAAU,CAAC,8CAA8C,CAAC,CAAC;QAC7H,IAAI,CAAC,EAAE,KAAK,aAAa,CAAC,SAAS,IAAI,EAAE,KAAK,aAAa,CAAC,OAAO,IAAI,EAAE,KAAK,aAAa,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnI,MAAM,IAAI,UAAU,CAAC,qCAAqC,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,GAAG,IAAI;YAAE,MAAM,IAAI,UAAU,CAAC,mBAAmB,CAAC,CAAC;QACzE,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,wBAAwB,IAAI,IAAI,CAAC,CAAC;QAClF,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;QACvC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,WAAW;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;QACpE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QAElB,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,UAAU;QACR,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC7E,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACtE,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,wEAAwE;IAExE,8GAA8G;IAC9G,QAAQ,CAAC,GAAW,EAAE,OAAwB;QAC5C,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,gDAAgD;IAChD,MAAM,CAAC,GAAW,EAAE,OAAwB;QAC1C,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAC/D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,uCAAuC;IACvC,aAAa,CAAC,GAAW,EAAE,OAAwB,EAAE,OAAe;QAClE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;QACrE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,+GAA+G;IAC/G,YAAY,CAAC,GAAW,EAAE,EAAU,EAAE,QAAyB,EAAE,WAA4B,EAAE,SAAiB,EAAE,KAAsB;QACtI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,EAAE,KAAK,YAAY,CAAC,MAAM,IAAI,EAAE,KAAK,YAAY,CAAC,MAAM;YAAE,MAAM,IAAI,UAAU,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;QAC7G,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QAClB,IAAI,KAAK,YAAY,MAAM;YAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;;YACxD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,EAAE,KAAK,YAAY,CAAC,MAAM;YAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IACrD,CAAC;IAED,6DAA6D;IAC7D,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,OAAO,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,iBAAiB,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,0EAA0E;IAE1E,SAAS;QACP,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAY,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,YAAY,CAAC,KAAc;QACzB,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,UAAU,CAAC,KAAa;QACtB,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,UAAU,IAAI,KAAK,IAAI,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK;YAAE,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,mBAAmB,CAAC,CAAC;QACrI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,UAAU,CAAC,KAAsB;QAC/B,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,KAAK,YAAY,MAAM;YAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;;YACxD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,WAAW,CAAC,KAAa;QACvB,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChB,WAAW,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAW,CAAC;QACvF,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,4DAA4D;IAC5D,YAAY,CAAC,KAA4B;QACvC,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACtE,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,UAAU,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzE,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;QACnG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACnD,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACxD,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACvD,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACrB,CAAC;IAED,qDAAqD;IACrD,WAAW,CAAC,KAAoB;QAC9B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,qDAAqD;IACrD,eAAe,CAAC,IAAgB;QAC9B,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,oEAAoE;IACpE,SAAS,CAAC,KAAa;QACrB,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjB,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACrB,CAAC;IAED,aAAa,CAAC,KAAsB;QAClC,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChB,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IACnD,CAAC;IAED,mBAAmB,CAAC,KAA4B;QAC9C,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,kCAAkC,CAAC,CAAC;QAC/H,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjB,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACnE,CAAC;IAED,2BAA2B;IAC3B,aAAa,CAAC,KAAsB;QAClC,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,KAAK,YAAY,MAAM;YAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;;YACxD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,UAAU,CAAC,KAAiB;QAC1B,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,yEAAyE;IAEzE;;;;OAIG;IACH,OAAO,CAAC,OAA6G;;QACnH,IAAI,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAClF,MAAM,OAAO,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,mCAAI,gBAAgB,CAAC,OAAO,CAAC;QAC7D,IAAI,OAAO,KAAK,gBAAgB,CAAC,OAAO,IAAI,OAAO,KAAK,gBAAgB,CAAC,aAAa,EAAE,CAAC;YACvF,MAAM,IAAI,UAAU,CAAC,8BAA8B,OAAO,GAAG,CAAC,CAAC;QACjE,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,OAAO,KAAK,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEhF,MAAM,WAAW,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,mCAAI,cAAc,CAAC,MAAM,CAAC;QAClE,MAAM,UAAU,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,CAAC;QACvC,IAAI,WAAW,KAAK,cAAc,CAAC,MAAM,IAAI,UAAU,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC7E,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,mCAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACxE,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBAClD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,gBAAgB,CAAC,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC9E,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAChE,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBACnD,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,gBAAgB,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACxE,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9D,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,yEAAyE;IACzE,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,6EAA6E;IAErE,SAAS,CAAC,QAAgB,EAAE,QAAgB;QAClD,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACzF,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACvF,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QAClI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;IACnB,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,WAAW;QACjB,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,IAAI,WAAW,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;IAEO,WAAW,CAAC,QAAuB;QACzC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC/F,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAC9G,IAAI,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,OAAO,gBAAgB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,QAAQ,qBAAqB,CAAC,CAAC;QAC3H,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAEO,SAAS,CAAC,GAAW;QAC3B,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACzE,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,KAAK,iBAAiB,CAAC,IAAI;gBACzB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACjB,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAChD,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;gBACnB,MAAM;YACR,KAAK,iBAAiB,CAAC,KAAK,CAAC;YAC7B,KAAK,iBAAiB,CAAC,KAAK;gBAC1B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC5C,MAAM;YACR;gBACE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChC,MAAM;QACV,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,KAAsB;QACtC,IAAI,KAAK,YAAY,MAAM,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,UAAU,EAAE;gBAAE,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;YAC1F,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK;YAAE,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,kCAAkC,CAAC,CAAC;QACnH,IAAI,KAAK,GAAG,gBAAgB;YAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;;YACpE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAEO,aAAa,CAAC,KAAa;QACjC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjB,IAAI,CAAC,GAAG,KAAK,CAAC;QACd,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;YAChD,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAEO,WAAW,CAAC,KAAa;QAC/B,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjB,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QAClB,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QACxB,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YAClD,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YACrC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC;IACpC,CAAC;IAEO,aAAa,CAAC,KAAa;QACjC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK;YAAE,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,qBAAqB,CAAC,CAAC;QACrF,IAAI,KAAK,IAAI,CAAC,gBAAgB,IAAI,KAAK,GAAG,gBAAgB;YAAE,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;;YACnH,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEO,SAAS,CAAC,KAAiB;QACjC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC;IAC/B,CAAC;IAEO,OAAO,CAAC,UAAkB;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC;QAC3C,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO;QAC5C,IAAI,QAAQ,GAAG,gBAAgB,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1G,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC;QAClH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;CACF;AAED,MAAM,aAAa,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;AACzC,MAAM,WAAW,GAAG,IAAI,QAAQ,CAAC,aAAa,CAAC,CAAC;AAChD,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC;AAEnD,SAAS,WAAW,CAAC,KAAiB,EAAE,OAAe,EAAE,WAAmB,EAAE,UAAkB;IAC9F,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI;IACrB,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI;IACrB,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI;IACrB,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI;IACrB,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;IACnB,KAAK,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;IACvB,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC","sourcesContent":["// Twin of G9SyncData.Protocol/RowBatch/G9CRowBatchWriter.cs. Same bytes for the same rows: the frame header, the\r\n// section layout and every value encoding are specified in AiGuides/04-Protocol.md.\r\nimport { G9ESyncColumnType, isColumnType } from '../../abstractions/enums.js';\r\nimport { writeGuidBytes } from '../../abstractions/guid.js';\r\nimport { G9SyncKey } from '../../abstractions/key.js';\r\nimport { G9Long } from '../../abstractions/long.js';\r\nimport { type DecimalParts, parseDecimal } from '../../internal/dotnetFormat.js';\r\nimport { utf8Encode } from '../../internal/utf8.js';\r\nimport { fromRows } from './columnLayout.js';\r\nimport { G9ECompression, G9EPushRowOp, G9ERowBatchOp, G9RowBatchFormat, isRowBatchOp, writeInt32LE, zigZag } from './format.js';\r\n\r\n/** A DateTime value on the wire: ticks (100 ns since 0001-01-01) and the `DateTimeKind` (0 unspecified, 1 UTC, 2 local). */\r\nexport interface G9DateTimeValue {\r\n ticks: G9Long;\r\n kind: number;\r\n}\r\n\r\n/** A DateTimeOffset value on the wire: UTC ticks and the offset in minutes. */\r\nexport interface G9DateTimeOffsetValue {\r\n utcTicks: G9Long;\r\n offsetMinutes: number;\r\n}\r\n\r\n/**\r\n * A compressor for push frames. Optional: without one the writer emits uncompressed frames, which every reader\r\n * accepts (the .NET writer falls back to them whenever compression does not help).\r\n */\r\nexport interface G9FrameCompressor {\r\n compress(body: Uint8Array, quality: number, window: number): Uint8Array | null;\r\n}\r\n\r\n/**\r\n * Writes a G9RowBatch frame: a 10-byte header (`'G' '9' 'R' 'B' | version | compression | body length i32 LE`) and a\r\n * body of sections, each holding rows of one table and one op.\r\n */\r\nexport class G9RowBatchWriter {\r\n private _buffer: Uint8Array;\r\n private _length = 4;\r\n private _sectionCount = 0;\r\n private _totalRows = 0;\r\n\r\n private _inSection = false;\r\n private _op: number = 0;\r\n private _keyType: number = 0;\r\n private _types: number[] = [];\r\n private _rowCountPosition = 0;\r\n private _sectionRows = 0;\r\n\r\n private _inRow = false;\r\n private _rowHasValues = false;\r\n private _column = 0;\r\n private _bitmapPosition = 0;\r\n\r\n constructor(initialCapacity: number = 64 * 1024) {\r\n this._buffer = new Uint8Array(Math.max(initialCapacity, 256));\r\n }\r\n\r\n /** Uncompressed body length written so far. */\r\n get length(): number {\r\n return this._length;\r\n }\r\n\r\n get totalRows(): number {\r\n return this._totalRows;\r\n }\r\n\r\n get sectionCount(): number {\r\n return this._sectionCount;\r\n }\r\n\r\n get currentSectionRows(): number {\r\n return this._sectionRows;\r\n }\r\n\r\n get inSection(): boolean {\r\n return this._inSection;\r\n }\r\n\r\n /** Starts a section. Key-only ops (Tombstone, MoveOut, KeyVersions) take no column types. */\r\n beginSection(op: number, tableId: number, keyType: number, columnTypes: readonly number[]): void {\r\n if (this._inSection) throw new Error('EndSection must be called before BeginSection.');\r\n if (!isRowBatchOp(op)) throw new RangeError(`Unknown row batch op ${op}.`);\r\n if (!G9SyncKey.isSupportedKeyType(keyType)) throw new RangeError(`Unsupported key type ${keyType}.`);\r\n if (!(tableId >= 0) || Math.floor(tableId) !== tableId) throw new RangeError('The table id must be a non-negative integer.');\r\n if ((op === G9ERowBatchOp.Tombstone || op === G9ERowBatchOp.MoveOut || op === G9ERowBatchOp.KeyVersions) && columnTypes.length > 0) {\r\n throw new RangeError('Key-only sections carry no columns.');\r\n }\r\n if (columnTypes.length > 1024) throw new RangeError('Too many columns.');\r\n for (const type of columnTypes) {\r\n if (!isColumnType(type)) throw new RangeError(`Invalid column type '${type}'.`);\r\n }\r\n\r\n this._ensure(2 + 20 + columnTypes.length + 4);\r\n this._buffer[this._length++] = op;\r\n this._varintNumber(tableId);\r\n this._buffer[this._length++] = keyType;\r\n this._varintNumber(columnTypes.length);\r\n for (const type of columnTypes) this._buffer[this._length++] = type;\r\n this._rowCountPosition = this._length;\r\n this._length += 4;\r\n\r\n this._op = op;\r\n this._keyType = keyType;\r\n this._types = columnTypes.slice();\r\n this._sectionRows = 0;\r\n this._inSection = true;\r\n }\r\n\r\n endSection(): void {\r\n if (!this._inSection) throw new Error('No section is open.');\r\n if (this._inRow) throw new Error('EndRow must be called before EndSection.');\r\n writeInt32LE(this._buffer, this._rowCountPosition, this._sectionRows);\r\n this._sectionCount++;\r\n this._inSection = false;\r\n }\r\n\r\n // ---------------------------------------------------------------- rows\r\n\r\n /** Starts an Upsert or Backfill row; write every column, then {@link endRow}. `key` is canonical key text. */\r\n beginRow(key: string, version: number | G9Long): void {\r\n this._startRow(G9ERowBatchOp.Upsert, G9ERowBatchOp.Backfill);\r\n this._writeKey(key);\r\n this._unsigned(version);\r\n this._openValues();\r\n }\r\n\r\n /** Adds a complete Tombstone or MoveOut row. */\r\n addKey(key: string, version: number | G9Long): void {\r\n this._startRow(G9ERowBatchOp.Tombstone, G9ERowBatchOp.MoveOut);\r\n this._writeKey(key);\r\n this._unsigned(version);\r\n this._completeRow();\r\n }\r\n\r\n /** Adds a complete KeyVersions row. */\r\n addKeyVersion(key: string, version: number | G9Long, rowHash: G9Long): void {\r\n this._startRow(G9ERowBatchOp.KeyVersions, G9ERowBatchOp.KeyVersions);\r\n this._writeKey(key);\r\n this._unsigned(version);\r\n this._ensure(8);\r\n rowHash.writeLE(this._buffer, this._length);\r\n this._length += 8;\r\n this._completeRow();\r\n }\r\n\r\n /** Starts a Push row. Upserts must then write every column; deletes write none. Finish with {@link endRow}. */\r\n beginPushRow(key: string, op: number, sequence: number | G9Long, baseVersion: number | G9Long, dirtyMask: G9Long, hlcMs: number | G9Long): void {\r\n this._startRow(G9ERowBatchOp.Push, G9ERowBatchOp.Push);\r\n if (op !== G9EPushRowOp.Upsert && op !== G9EPushRowOp.Delete) throw new RangeError(`Unknown push op ${op}.`);\r\n this._writeKey(key);\r\n this._ensure(1);\r\n this._buffer[this._length++] = op;\r\n this._unsigned(sequence);\r\n this._unsigned(baseVersion);\r\n this._ensure(8);\r\n dirtyMask.writeLE(this._buffer, this._length);\r\n this._length += 8;\r\n if (hlcMs instanceof G9Long) this._varintLong(zigZag(hlcMs));\r\n else this._zigZagNumber(hlcMs);\r\n if (op === G9EPushRowOp.Upsert) this._openValues();\r\n }\r\n\r\n /** Completes a row started with beginRow or beginPushRow. */\r\n endRow(): void {\r\n if (!this._inRow) throw new Error('No row is open.');\r\n if (this._rowHasValues && this._column !== this._types.length) {\r\n throw new Error(`Row ended after ${this._column} of ${this._types.length} column values.`);\r\n }\r\n this._completeRow();\r\n }\r\n\r\n // ---------------------------------------------------------------- values\r\n\r\n writeNull(): void {\r\n const column = this._nextColumn(null);\r\n const at = this._bitmapPosition + (column >> 3);\r\n this._buffer[at] = (this._buffer[at] as number) | (1 << (column & 7));\r\n }\r\n\r\n writeBoolean(value: boolean): void {\r\n this._nextColumn(G9ESyncColumnType.Boolean);\r\n this._ensure(1);\r\n this._buffer[this._length++] = value ? 1 : 0;\r\n }\r\n\r\n writeInt32(value: number): void {\r\n this._nextColumn(G9ESyncColumnType.Int32);\r\n if (!(value >= -2147483648 && value <= 2147483647) || Math.floor(value) !== value) throw new RangeError(`${value} is not an Int32.`);\r\n this._zigZagNumber(value);\r\n }\r\n\r\n writeInt64(value: number | G9Long): void {\r\n this._nextColumn(G9ESyncColumnType.Int64);\r\n if (value instanceof G9Long) this._varintLong(zigZag(value));\r\n else this._zigZagNumber(value);\r\n }\r\n\r\n writeDouble(value: number): void {\r\n this._nextColumn(G9ESyncColumnType.Double);\r\n this._ensure(8);\r\n DOUBLE_VIEW.setFloat64(0, value, true);\r\n for (let i = 0; i < 8; i++) this._buffer[this._length + i] = DOUBLE_BYTES[i] as number;\r\n this._length += 8;\r\n }\r\n\r\n /** A decimal: its .NET parts, or invariant decimal text. */\r\n writeDecimal(value: DecimalParts | string): void {\r\n this._nextColumn(G9ESyncColumnType.Decimal);\r\n const parts = typeof value === 'string' ? parseDecimal(value) : value;\r\n if (!parts) throw new RangeError(`'${String(value)}' is not a decimal.`);\r\n if (!(parts.scale >= 0 && parts.scale <= 28)) throw new RangeError('Decimal scale must be 0..28.');\r\n this._ensure(16);\r\n const flags = ((parts.scale & 0xff) << 16) | (parts.negative ? 0x80000000 : 0);\r\n writeInt32LE(this._buffer, this._length, parts.lo);\r\n writeInt32LE(this._buffer, this._length + 4, parts.mid);\r\n writeInt32LE(this._buffer, this._length + 8, parts.hi);\r\n writeInt32LE(this._buffer, this._length + 12, flags);\r\n this._length += 16;\r\n }\r\n\r\n /** Writes a string, or NULL when `value` is null. */\r\n writeString(value: string | null): void {\r\n if (value === null || value === undefined) {\r\n this.writeNull();\r\n return;\r\n }\r\n this._nextColumn(G9ESyncColumnType.String);\r\n this._bytesRaw(utf8Encode(value));\r\n }\r\n\r\n /** Writes a string that is already UTF-8 encoded. */\r\n writeStringUtf8(utf8: Uint8Array): void {\r\n this._nextColumn(G9ESyncColumnType.String);\r\n this._bytesRaw(utf8);\r\n }\r\n\r\n /** Writes a GUID given as text in any form `Guid.Parse` accepts. */\r\n writeGuid(value: string): void {\r\n this._nextColumn(G9ESyncColumnType.Guid);\r\n this._ensure(16);\r\n writeGuidBytes(value, this._buffer, this._length);\r\n this._length += 16;\r\n }\r\n\r\n writeDateTime(value: G9DateTimeValue): void {\r\n this._nextColumn(G9ESyncColumnType.DateTime);\r\n this._ensure(9);\r\n value.ticks.writeLE(this._buffer, this._length);\r\n this._length += 8;\r\n this._buffer[this._length++] = value.kind & 0xff;\r\n }\r\n\r\n writeDateTimeOffset(value: G9DateTimeOffsetValue): void {\r\n this._nextColumn(G9ESyncColumnType.DateTimeOffset);\r\n if (!(value.offsetMinutes >= -32768 && value.offsetMinutes <= 32767)) throw new RangeError('The offset does not fit 16 bits.');\r\n this._ensure(10);\r\n value.utcTicks.writeLE(this._buffer, this._length);\r\n this._length += 8;\r\n this._buffer[this._length++] = value.offsetMinutes & 0xff;\r\n this._buffer[this._length++] = (value.offsetMinutes >> 8) & 0xff;\r\n }\r\n\r\n /** A TimeSpan as ticks. */\r\n writeTimeSpan(ticks: number | G9Long): void {\r\n this._nextColumn(G9ESyncColumnType.TimeSpan);\r\n if (ticks instanceof G9Long) this._varintLong(zigZag(ticks));\r\n else this._zigZagNumber(ticks);\r\n }\r\n\r\n writeBytes(value: Uint8Array): void {\r\n this._nextColumn(G9ESyncColumnType.Bytes);\r\n this._bytesRaw(value);\r\n }\r\n\r\n // ---------------------------------------------------------------- frame\r\n\r\n /**\r\n * Produces the frame. With a compressor and `compression` Brotli, the body is compressed when it is over 128 bytes\r\n * and compression helps; otherwise the frame is uncompressed. `version` 2 writes the column-grouped layout (only for\r\n * a peer that asked for it).\r\n */\r\n toFrame(options?: { compression?: number; quality?: number; version?: number; compressor?: G9FrameCompressor | null }): Uint8Array {\r\n if (this._inSection) throw new Error('EndSection must be called before ToFrame.');\r\n const version = options?.version ?? G9RowBatchFormat.Version;\r\n if (version !== G9RowBatchFormat.Version && version !== G9RowBatchFormat.ColumnVersion) {\r\n throw new RangeError(`Unknown G9RowBatch version ${version}.`);\r\n }\r\n writeInt32LE(this._buffer, 0, this._sectionCount);\r\n const rows = this._buffer.subarray(0, this._length);\r\n const body = version === G9RowBatchFormat.ColumnVersion ? fromRows(rows) : rows;\r\n\r\n const compression = options?.compression ?? G9ECompression.Brotli;\r\n const compressor = options?.compressor;\r\n if (compression === G9ECompression.Brotli && compressor && body.length > 128) {\r\n const compressed = compressor.compress(body, options?.quality ?? 4, 22);\r\n if (compressed && compressed.length < body.length) {\r\n const frame = new Uint8Array(G9RowBatchFormat.HeaderSize + compressed.length);\r\n writeHeader(frame, version, G9ECompression.Brotli, body.length);\r\n frame.set(compressed, G9RowBatchFormat.HeaderSize);\r\n return frame;\r\n }\r\n }\r\n const frame = new Uint8Array(G9RowBatchFormat.HeaderSize + body.length);\r\n writeHeader(frame, version, G9ECompression.None, body.length);\r\n frame.set(body, G9RowBatchFormat.HeaderSize);\r\n return frame;\r\n }\r\n\r\n /** Clears all content so the buffer can be reused for the next frame. */\r\n reset(): void {\r\n this._length = 4;\r\n this._sectionCount = 0;\r\n this._totalRows = 0;\r\n this._inSection = false;\r\n this._inRow = false;\r\n this._rowHasValues = false;\r\n this._sectionRows = 0;\r\n }\r\n\r\n // ---------------------------------------------------------------- internals\r\n\r\n private _startRow(allowed1: number, allowed2: number): void {\r\n if (!this._inSection) throw new Error('BeginSection must be called before adding rows.');\r\n if (this._inRow) throw new Error('EndRow must be called before starting another row.');\r\n if (this._op !== allowed1 && this._op !== allowed2) throw new Error(`This row kind is not valid in a section of op ${this._op}.`);\r\n this._inRow = true;\r\n this._rowHasValues = false;\r\n this._column = 0;\r\n }\r\n\r\n private _completeRow(): void {\r\n this._inRow = false;\r\n this._rowHasValues = false;\r\n this._sectionRows++;\r\n this._totalRows++;\r\n }\r\n\r\n private _openValues(): void {\r\n const bitmapBytes = (this._types.length + 7) >> 3;\r\n this._ensure(bitmapBytes);\r\n this._bitmapPosition = this._length;\r\n this._buffer.fill(0, this._length, this._length + bitmapBytes);\r\n this._length += bitmapBytes;\r\n this._column = 0;\r\n this._rowHasValues = true;\r\n }\r\n\r\n private _nextColumn(expected: number | null): number {\r\n if (!this._inRow || !this._rowHasValues) throw new Error('No row with column values is open.');\r\n if (this._column >= this._types.length) throw new Error('Every column of this row has already been written.');\r\n if (expected !== null && this._types[this._column] !== expected) {\r\n throw new Error(`Column ${this._column} is declared ${this._types[this._column]}, but a ${expected} value was written.`);\r\n }\r\n return this._column++;\r\n }\r\n\r\n private _writeKey(key: string): void {\r\n if (typeof key !== 'string') throw new TypeError('The key is required.');\r\n switch (this._keyType) {\r\n case G9ESyncColumnType.Guid:\r\n this._ensure(16);\r\n writeGuidBytes(key, this._buffer, this._length);\r\n this._length += 16;\r\n break;\r\n case G9ESyncColumnType.Int32:\r\n case G9ESyncColumnType.Int64:\r\n this._varintLong(zigZag(G9Long.parse(key)));\r\n break;\r\n default:\r\n this._bytesRaw(utf8Encode(key));\r\n break;\r\n }\r\n }\r\n\r\n private _unsigned(value: number | G9Long): void {\r\n if (value instanceof G9Long) {\r\n if (value.isNegative()) throw new RangeError(`${value.toString()} must be non-negative.`);\r\n this._varintLong(value);\r\n return;\r\n }\r\n if (!(value >= 0) || Math.floor(value) !== value) throw new RangeError(`${value} must be a non-negative integer.`);\r\n if (value > 9007199254740991) this._varintLong(G9Long.fromNumber(value));\r\n else this._varintNumber(value);\r\n }\r\n\r\n private _varintNumber(value: number): void {\r\n this._ensure(10);\r\n let v = value;\r\n while (v >= 128) {\r\n this._buffer[this._length++] = (v % 128) | 0x80;\r\n v = Math.floor(v / 128);\r\n }\r\n this._buffer[this._length++] = v;\r\n }\r\n\r\n private _varintLong(value: G9Long): void {\r\n this._ensure(10);\r\n let lo = value.lo;\r\n let hi = value.hi >>> 0;\r\n while (hi !== 0 || lo >= 128) {\r\n this._buffer[this._length++] = (lo & 0x7f) | 0x80;\r\n lo = ((lo >>> 7) | (hi << 25)) >>> 0;\r\n hi = hi >>> 7;\r\n }\r\n this._buffer[this._length++] = lo;\r\n }\r\n\r\n private _zigZagNumber(value: number): void {\r\n if (Math.floor(value) !== value) throw new RangeError(`${value} is not an integer.`);\r\n if (value >= -4503599627370496 && value < 4503599627370496) this._varintNumber(value >= 0 ? value * 2 : -value * 2 - 1);\r\n else this._varintLong(zigZag(G9Long.fromNumber(value)));\r\n }\r\n\r\n private _bytesRaw(value: Uint8Array): void {\r\n this._ensure(10 + value.length);\r\n this._varintNumber(value.length);\r\n this._buffer.set(value, this._length);\r\n this._length += value.length;\r\n }\r\n\r\n private _ensure(additional: number): void {\r\n const required = this._length + additional;\r\n if (required <= this._buffer.length) return;\r\n if (required > G9RowBatchFormat.MaxBodyBytes) throw new Error('Row batch exceeds the maximum body size.');\r\n const next = new Uint8Array(Math.min(Math.max(required, this._buffer.length * 2), G9RowBatchFormat.MaxBodyBytes));\r\n next.set(this._buffer.subarray(0, this._length));\r\n this._buffer = next;\r\n }\r\n}\r\n\r\nconst DOUBLE_BUFFER = new ArrayBuffer(8);\r\nconst DOUBLE_VIEW = new DataView(DOUBLE_BUFFER);\r\nconst DOUBLE_BYTES = new Uint8Array(DOUBLE_BUFFER);\r\n\r\nfunction writeHeader(frame: Uint8Array, version: number, compression: number, bodyLength: number): void {\r\n frame[0] = 0x47; // G\r\n frame[1] = 0x39; // 9\r\n frame[2] = 0x52; // R\r\n frame[3] = 0x42; // B\r\n frame[4] = version;\r\n frame[5] = compression;\r\n writeInt32LE(frame, 6, bodyLength);\r\n}\r\n"]}
|