@syncular/core 0.0.6-212 → 0.0.6-219
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/dist/types.d.ts +34 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/compression.d.ts +5 -0
- package/dist/utils/compression.d.ts.map +1 -1
- package/dist/utils/compression.js +47 -1
- package/dist/utils/compression.js.map +1 -1
- package/dist/utils/crypto.d.ts.map +1 -1
- package/dist/utils/crypto.js +14 -1
- package/dist/utils/crypto.js.map +1 -1
- package/dist/utils/internal-runtime.d.ts +1 -0
- package/dist/utils/internal-runtime.d.ts.map +1 -1
- package/dist/utils/internal-runtime.js.map +1 -1
- package/package.json +5 -2
- package/src/__tests__/compression.test.ts +12 -1
- package/src/types.ts +38 -0
- package/src/utils/compression.ts +62 -4
- package/src/utils/crypto.ts +20 -7
- package/src/utils/internal-runtime.ts +1 -0
package/dist/types.d.ts
CHANGED
|
@@ -99,6 +99,36 @@ export interface SyncTransportOptions {
|
|
|
99
99
|
*/
|
|
100
100
|
signal?: AbortSignal;
|
|
101
101
|
}
|
|
102
|
+
export type SyncSnapshotChunkReadMode = 'stream' | 'bytes';
|
|
103
|
+
export type SyncGzipDecompressionMode = 'stream' | 'buffered';
|
|
104
|
+
export type SyncBootstrapApplyMode = 'single-transaction' | 'per-subscription';
|
|
105
|
+
/**
|
|
106
|
+
* Declares transport/runtime capabilities that affect how the client should
|
|
107
|
+
* fetch, decode, and apply bootstrap snapshots.
|
|
108
|
+
*/
|
|
109
|
+
export interface SyncTransportCapabilities {
|
|
110
|
+
/**
|
|
111
|
+
* Preferred snapshot chunk download mode for this runtime.
|
|
112
|
+
* - `stream`: consume the response body as a stream when available
|
|
113
|
+
* - `bytes`: buffer the whole response body before decode/apply
|
|
114
|
+
*/
|
|
115
|
+
snapshotChunkReadMode?: SyncSnapshotChunkReadMode;
|
|
116
|
+
/**
|
|
117
|
+
* Preferred gzip decode mode for this runtime.
|
|
118
|
+
* - `stream`: use `DecompressionStream`
|
|
119
|
+
* - `buffered`: gunzip a materialized byte buffer
|
|
120
|
+
*/
|
|
121
|
+
gzipDecompressionMode?: SyncGzipDecompressionMode;
|
|
122
|
+
/**
|
|
123
|
+
* Hint that chunked bootstrap snapshots should be materialized into rows
|
|
124
|
+
* before plugin/app consumption.
|
|
125
|
+
*/
|
|
126
|
+
preferMaterializedSnapshots?: boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Preferred default transaction strategy for bootstrap apply.
|
|
129
|
+
*/
|
|
130
|
+
preferredBootstrapApplyMode?: SyncBootstrapApplyMode;
|
|
131
|
+
}
|
|
102
132
|
/**
|
|
103
133
|
* Blob transport operations (optional extension to SyncTransport).
|
|
104
134
|
* When present, enables blob upload/download through the same transport.
|
|
@@ -138,6 +168,10 @@ export interface SyncTransportBlobs {
|
|
|
138
168
|
* Transport interface for sync operations.
|
|
139
169
|
*/
|
|
140
170
|
export interface SyncTransport {
|
|
171
|
+
/**
|
|
172
|
+
* Optional runtime/transport capabilities.
|
|
173
|
+
*/
|
|
174
|
+
capabilities?: SyncTransportCapabilities;
|
|
141
175
|
/**
|
|
142
176
|
* Combined push+pull in a single round-trip.
|
|
143
177
|
*/
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyPH;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGzB,MAAM;IACN,IAAI;IAHtB,YACE,OAAe,EACC,MAAe,EACf,IAAa,EAC7B;QACA,KAAK,CAAC,OAAO,CAAC,CAAC;sBAHC,MAAM;oBACN,IAAI;QAGpB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IAAA,CAClC;CACF"}
|
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
* in the current runtime.
|
|
4
4
|
*/
|
|
5
5
|
export declare function gzipBytes(payload: Uint8Array): Promise<Uint8Array>;
|
|
6
|
+
/**
|
|
7
|
+
* Gzip-decompress a byte array using the fastest implementation available in
|
|
8
|
+
* the current runtime, with a pure-JS fallback for runtimes like Expo/Hermes.
|
|
9
|
+
*/
|
|
10
|
+
export declare function gunzipBytes(payload: Uint8Array): Promise<Uint8Array>;
|
|
6
11
|
/**
|
|
7
12
|
* Gzip-compress bytes and return a stream. When streaming compression is not
|
|
8
13
|
* available, falls back to eager compression and includes byteLength metadata.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../src/utils/compression.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../src/utils/compression.ts"],"names":[],"mappings":"AAkCA;;;GAGG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CA6BxE;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAkC1E;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC;IACpE,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,CAoBD"}
|
|
@@ -1,12 +1,26 @@
|
|
|
1
|
+
import { gunzipSync as gunzipSyncFflate } from 'fflate';
|
|
1
2
|
import { bytesToReadableStream, readAllBytesFromStream } from './bytes.js';
|
|
2
3
|
import { getBunRuntime, usesNodeRuntimeModules } from './internal-runtime.js';
|
|
3
4
|
let nodeZlibModulePromise = null;
|
|
5
|
+
function importNodeModule(specifier) {
|
|
6
|
+
return new Function('specifier', 'return import(specifier);')(specifier);
|
|
7
|
+
}
|
|
8
|
+
function tryImportNodeModule(specifier) {
|
|
9
|
+
try {
|
|
10
|
+
return importNodeModule(specifier);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return Promise.resolve(null);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
4
16
|
async function getNodeZlibModule() {
|
|
5
17
|
if (!usesNodeRuntimeModules()) {
|
|
6
18
|
return null;
|
|
7
19
|
}
|
|
8
20
|
if (!nodeZlibModulePromise) {
|
|
9
|
-
nodeZlibModulePromise =
|
|
21
|
+
nodeZlibModulePromise = tryImportNodeModule('node:zlib')
|
|
22
|
+
.then((module) => module)
|
|
23
|
+
.catch(() => null);
|
|
10
24
|
}
|
|
11
25
|
return nodeZlibModulePromise;
|
|
12
26
|
}
|
|
@@ -37,6 +51,38 @@ export async function gzipBytes(payload) {
|
|
|
37
51
|
}
|
|
38
52
|
throw new Error('Failed to gzip bytes, no compression implementation available');
|
|
39
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Gzip-decompress a byte array using the fastest implementation available in
|
|
56
|
+
* the current runtime, with a pure-JS fallback for runtimes like Expo/Hermes.
|
|
57
|
+
*/
|
|
58
|
+
export async function gunzipBytes(payload) {
|
|
59
|
+
const bun = getBunRuntime();
|
|
60
|
+
if (bun?.gunzipSync) {
|
|
61
|
+
return bun.gunzipSync(payload);
|
|
62
|
+
}
|
|
63
|
+
const nodeZlib = await getNodeZlibModule();
|
|
64
|
+
if (nodeZlib?.gunzip) {
|
|
65
|
+
return await new Promise((resolve, reject) => {
|
|
66
|
+
nodeZlib.gunzip(payload, (error, decompressed) => {
|
|
67
|
+
if (error) {
|
|
68
|
+
reject(error);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
resolve(new Uint8Array(decompressed));
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
if (typeof DecompressionStream !== 'undefined') {
|
|
76
|
+
const stream = bytesToReadableStream(payload).pipeThrough(new DecompressionStream('gzip'));
|
|
77
|
+
return readAllBytesFromStream(stream);
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
return gunzipSyncFflate(payload);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
throw new Error('Failed to gunzip bytes, no decompression implementation available', { cause: error });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
40
86
|
/**
|
|
41
87
|
* Gzip-compress bytes and return a stream. When streaming compression is not
|
|
42
88
|
* available, falls back to eager compression and includes byteLength metadata.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compression.js","sourceRoot":"","sources":["../../src/utils/compression.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"compression.js","sourceRoot":"","sources":["../../src/utils/compression.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"AAsDA,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAqC1E;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA0B3E"}
|
package/dist/utils/crypto.js
CHANGED
|
@@ -15,12 +15,25 @@ function toDigestBufferSource(payload) {
|
|
|
15
15
|
return owned;
|
|
16
16
|
}
|
|
17
17
|
let nodeCryptoModulePromise = null;
|
|
18
|
+
function importNodeModule(specifier) {
|
|
19
|
+
return new Function('specifier', 'return import(specifier);')(specifier);
|
|
20
|
+
}
|
|
21
|
+
function tryImportNodeModule(specifier) {
|
|
22
|
+
try {
|
|
23
|
+
return importNodeModule(specifier);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return Promise.resolve(null);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
18
29
|
async function getNodeCryptoModule() {
|
|
19
30
|
if (!usesNodeRuntimeModules()) {
|
|
20
31
|
return null;
|
|
21
32
|
}
|
|
22
33
|
if (!nodeCryptoModulePromise) {
|
|
23
|
-
nodeCryptoModulePromise =
|
|
34
|
+
nodeCryptoModulePromise = tryImportNodeModule('node:crypto')
|
|
35
|
+
.then((module) => module)
|
|
36
|
+
.catch(() => null);
|
|
24
37
|
}
|
|
25
38
|
return nodeCryptoModulePromise;
|
|
26
39
|
}
|
package/dist/utils/crypto.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ interface BunCryptoHasher {
|
|
|
5
5
|
interface BunRuntime {
|
|
6
6
|
CryptoHasher?: new (algorithm: string) => BunCryptoHasher;
|
|
7
7
|
gzipSync?: (data: Uint8Array) => Uint8Array;
|
|
8
|
+
gunzipSync?: (data: Uint8Array) => Uint8Array;
|
|
8
9
|
readableStreamToBytes?: (stream: ReadableStream<Uint8Array>) => Promise<Uint8Array | ArrayBuffer>;
|
|
9
10
|
}
|
|
10
11
|
export declare function getBunRuntime(): BunRuntime | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal-runtime.d.ts","sourceRoot":"","sources":["../../src/utils/internal-runtime.ts"],"names":[],"mappings":"AAAA,UAAU,eAAe;IACvB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IACxC,MAAM,CAAC,QAAQ,EAAE,KAAK,GAAG,MAAM,CAAC;CACjC;AAED,UAAU,UAAU;IAClB,YAAY,CAAC,EAAE,KAAK,SAAS,EAAE,MAAM,KAAK,eAAe,CAAC;IAC1D,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,UAAU,CAAC;IAC5C,qBAAqB,CAAC,EAAE,CACtB,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,KAC/B,OAAO,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC;CACxC;AAgBD,wBAAgB,aAAa,IAAI,UAAU,GAAG,IAAI,CAEjD;AAED,wBAAgB,sBAAsB,IAAI,OAAO,CAMhD"}
|
|
1
|
+
{"version":3,"file":"internal-runtime.d.ts","sourceRoot":"","sources":["../../src/utils/internal-runtime.ts"],"names":[],"mappings":"AAAA,UAAU,eAAe;IACvB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IACxC,MAAM,CAAC,QAAQ,EAAE,KAAK,GAAG,MAAM,CAAC;CACjC;AAED,UAAU,UAAU;IAClB,YAAY,CAAC,EAAE,KAAK,SAAS,EAAE,MAAM,KAAK,eAAe,CAAC;IAC1D,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,UAAU,CAAC;IAC5C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,UAAU,CAAC;IAC9C,qBAAqB,CAAC,EAAE,CACtB,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,KAC/B,OAAO,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC;CACxC;AAgBD,wBAAgB,aAAa,IAAI,UAAU,GAAG,IAAI,CAEjD;AAED,wBAAgB,sBAAsB,IAAI,OAAO,CAMhD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal-runtime.js","sourceRoot":"","sources":["../../src/utils/internal-runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"internal-runtime.js","sourceRoot":"","sources":["../../src/utils/internal-runtime.ts"],"names":[],"mappings":"AAwBA,SAAS,iBAAiB,GAAmB;IAC3C,OAAO,UAA4B,CAAC;AAAA,CACrC;AAED,MAAM,UAAU,aAAa,GAAsB;IACjD,OAAO,iBAAiB,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC;AAAA,CACxC;AAED,MAAM,UAAU,sBAAsB,GAAY;IAChD,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IACpC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAAO,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,KAAK,QAAQ,CAAC;AAAA,CAC5D"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@syncular/core",
|
|
3
|
-
"version": "0.0.6-
|
|
3
|
+
"version": "0.0.6-219",
|
|
4
4
|
"description": "Core protocol types and shared utilities for the Syncular sync framework",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Benjamin Kniffler",
|
|
@@ -54,5 +54,8 @@
|
|
|
54
54
|
"files": [
|
|
55
55
|
"dist",
|
|
56
56
|
"src"
|
|
57
|
-
]
|
|
57
|
+
],
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"fflate": "^0.8.2"
|
|
60
|
+
}
|
|
58
61
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, expect, it } from 'bun:test';
|
|
2
2
|
import { gunzipSync } from 'node:zlib';
|
|
3
|
-
import { gzipBytes, gzipBytesToStream } from '../utils';
|
|
3
|
+
import { gunzipBytes, gzipBytes, gzipBytesToStream } from '../utils';
|
|
4
4
|
|
|
5
5
|
async function readStream(
|
|
6
6
|
stream: ReadableStream<Uint8Array>
|
|
@@ -40,6 +40,17 @@ describe('gzipBytes', () => {
|
|
|
40
40
|
});
|
|
41
41
|
});
|
|
42
42
|
|
|
43
|
+
describe('gunzipBytes', () => {
|
|
44
|
+
it('decompresses gzip-compressed bytes', async () => {
|
|
45
|
+
const payload = new TextEncoder().encode(
|
|
46
|
+
'syncular decompression test '.repeat(64)
|
|
47
|
+
);
|
|
48
|
+
const compressed = await gzipBytes(payload);
|
|
49
|
+
const decompressed = await gunzipBytes(compressed);
|
|
50
|
+
expect(decompressed).toEqual(payload);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
43
54
|
describe('gzipBytesToStream', () => {
|
|
44
55
|
it('returns a gzip stream that round-trips', async () => {
|
|
45
56
|
const payload = new TextEncoder().encode('stream compression '.repeat(64));
|
package/src/types.ts
CHANGED
|
@@ -135,6 +135,40 @@ export interface SyncTransportOptions {
|
|
|
135
135
|
signal?: AbortSignal;
|
|
136
136
|
}
|
|
137
137
|
|
|
138
|
+
export type SyncSnapshotChunkReadMode = 'stream' | 'bytes';
|
|
139
|
+
|
|
140
|
+
export type SyncGzipDecompressionMode = 'stream' | 'buffered';
|
|
141
|
+
|
|
142
|
+
export type SyncBootstrapApplyMode = 'single-transaction' | 'per-subscription';
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Declares transport/runtime capabilities that affect how the client should
|
|
146
|
+
* fetch, decode, and apply bootstrap snapshots.
|
|
147
|
+
*/
|
|
148
|
+
export interface SyncTransportCapabilities {
|
|
149
|
+
/**
|
|
150
|
+
* Preferred snapshot chunk download mode for this runtime.
|
|
151
|
+
* - `stream`: consume the response body as a stream when available
|
|
152
|
+
* - `bytes`: buffer the whole response body before decode/apply
|
|
153
|
+
*/
|
|
154
|
+
snapshotChunkReadMode?: SyncSnapshotChunkReadMode;
|
|
155
|
+
/**
|
|
156
|
+
* Preferred gzip decode mode for this runtime.
|
|
157
|
+
* - `stream`: use `DecompressionStream`
|
|
158
|
+
* - `buffered`: gunzip a materialized byte buffer
|
|
159
|
+
*/
|
|
160
|
+
gzipDecompressionMode?: SyncGzipDecompressionMode;
|
|
161
|
+
/**
|
|
162
|
+
* Hint that chunked bootstrap snapshots should be materialized into rows
|
|
163
|
+
* before plugin/app consumption.
|
|
164
|
+
*/
|
|
165
|
+
preferMaterializedSnapshots?: boolean;
|
|
166
|
+
/**
|
|
167
|
+
* Preferred default transaction strategy for bootstrap apply.
|
|
168
|
+
*/
|
|
169
|
+
preferredBootstrapApplyMode?: SyncBootstrapApplyMode;
|
|
170
|
+
}
|
|
171
|
+
|
|
138
172
|
/**
|
|
139
173
|
* Blob transport operations (optional extension to SyncTransport).
|
|
140
174
|
* When present, enables blob upload/download through the same transport.
|
|
@@ -174,6 +208,10 @@ export interface SyncTransportBlobs {
|
|
|
174
208
|
* Transport interface for sync operations.
|
|
175
209
|
*/
|
|
176
210
|
export interface SyncTransport {
|
|
211
|
+
/**
|
|
212
|
+
* Optional runtime/transport capabilities.
|
|
213
|
+
*/
|
|
214
|
+
capabilities?: SyncTransportCapabilities;
|
|
177
215
|
/**
|
|
178
216
|
* Combined push+pull in a single round-trip.
|
|
179
217
|
*/
|
package/src/utils/compression.ts
CHANGED
|
@@ -1,15 +1,33 @@
|
|
|
1
|
+
import { gunzipSync as gunzipSyncFflate } from 'fflate';
|
|
1
2
|
import { bytesToReadableStream, readAllBytesFromStream } from './bytes';
|
|
2
3
|
import { getBunRuntime, usesNodeRuntimeModules } from './internal-runtime';
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
null;
|
|
5
|
+
type NodeZlibModule = typeof import('node:zlib');
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
let nodeZlibModulePromise: Promise<NodeZlibModule | null> | null = null;
|
|
8
|
+
|
|
9
|
+
function importNodeModule(specifier: string): Promise<unknown> {
|
|
10
|
+
return new Function('specifier', 'return import(specifier);')(
|
|
11
|
+
specifier
|
|
12
|
+
) as Promise<unknown>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function tryImportNodeModule(specifier: string): Promise<unknown> {
|
|
16
|
+
try {
|
|
17
|
+
return importNodeModule(specifier);
|
|
18
|
+
} catch {
|
|
19
|
+
return Promise.resolve(null);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async function getNodeZlibModule(): Promise<NodeZlibModule | null> {
|
|
8
24
|
if (!usesNodeRuntimeModules()) {
|
|
9
25
|
return null;
|
|
10
26
|
}
|
|
11
27
|
if (!nodeZlibModulePromise) {
|
|
12
|
-
nodeZlibModulePromise =
|
|
28
|
+
nodeZlibModulePromise = tryImportNodeModule('node:zlib')
|
|
29
|
+
.then((module) => module as NodeZlibModule)
|
|
30
|
+
.catch(() => null);
|
|
13
31
|
}
|
|
14
32
|
return nodeZlibModulePromise;
|
|
15
33
|
}
|
|
@@ -49,6 +67,46 @@ export async function gzipBytes(payload: Uint8Array): Promise<Uint8Array> {
|
|
|
49
67
|
);
|
|
50
68
|
}
|
|
51
69
|
|
|
70
|
+
/**
|
|
71
|
+
* Gzip-decompress a byte array using the fastest implementation available in
|
|
72
|
+
* the current runtime, with a pure-JS fallback for runtimes like Expo/Hermes.
|
|
73
|
+
*/
|
|
74
|
+
export async function gunzipBytes(payload: Uint8Array): Promise<Uint8Array> {
|
|
75
|
+
const bun = getBunRuntime();
|
|
76
|
+
if (bun?.gunzipSync) {
|
|
77
|
+
return bun.gunzipSync(payload);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const nodeZlib = await getNodeZlibModule();
|
|
81
|
+
if (nodeZlib?.gunzip) {
|
|
82
|
+
return await new Promise<Uint8Array>((resolve, reject) => {
|
|
83
|
+
nodeZlib.gunzip(payload, (error, decompressed) => {
|
|
84
|
+
if (error) {
|
|
85
|
+
reject(error);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
resolve(new Uint8Array(decompressed));
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (typeof DecompressionStream !== 'undefined') {
|
|
94
|
+
const stream = bytesToReadableStream(payload).pipeThrough(
|
|
95
|
+
new DecompressionStream('gzip') as TransformStream<Uint8Array, Uint8Array>
|
|
96
|
+
);
|
|
97
|
+
return readAllBytesFromStream(stream);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
try {
|
|
101
|
+
return gunzipSyncFflate(payload);
|
|
102
|
+
} catch (error) {
|
|
103
|
+
throw new Error(
|
|
104
|
+
'Failed to gunzip bytes, no decompression implementation available',
|
|
105
|
+
{ cause: error }
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
52
110
|
/**
|
|
53
111
|
* Gzip-compress bytes and return a stream. When streaming compression is not
|
|
54
112
|
* available, falls back to eager compression and includes byteLength metadata.
|
package/src/utils/crypto.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { concatByteChunks } from './bytes';
|
|
|
2
2
|
import { getBunRuntime, usesNodeRuntimeModules } from './internal-runtime';
|
|
3
3
|
|
|
4
4
|
const textEncoder = new TextEncoder();
|
|
5
|
+
type NodeCryptoModule = typeof import('node:crypto');
|
|
5
6
|
|
|
6
7
|
function toHex(bytes: Uint8Array): string {
|
|
7
8
|
return Array.from(bytes)
|
|
@@ -23,18 +24,30 @@ function toDigestBufferSource(payload: Uint8Array): Uint8Array<ArrayBuffer> {
|
|
|
23
24
|
return owned;
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
let nodeCryptoModulePromise: Promise<
|
|
27
|
-
typeof import('node:crypto') | null
|
|
28
|
-
> | null = null;
|
|
27
|
+
let nodeCryptoModulePromise: Promise<NodeCryptoModule | null> | null = null;
|
|
29
28
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
function importNodeModule(specifier: string): Promise<unknown> {
|
|
30
|
+
return new Function('specifier', 'return import(specifier);')(
|
|
31
|
+
specifier
|
|
32
|
+
) as Promise<unknown>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function tryImportNodeModule(specifier: string): Promise<unknown> {
|
|
36
|
+
try {
|
|
37
|
+
return importNodeModule(specifier);
|
|
38
|
+
} catch {
|
|
39
|
+
return Promise.resolve(null);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function getNodeCryptoModule(): Promise<NodeCryptoModule | null> {
|
|
33
44
|
if (!usesNodeRuntimeModules()) {
|
|
34
45
|
return null;
|
|
35
46
|
}
|
|
36
47
|
if (!nodeCryptoModulePromise) {
|
|
37
|
-
nodeCryptoModulePromise =
|
|
48
|
+
nodeCryptoModulePromise = tryImportNodeModule('node:crypto')
|
|
49
|
+
.then((module) => module as NodeCryptoModule)
|
|
50
|
+
.catch(() => null);
|
|
38
51
|
}
|
|
39
52
|
return nodeCryptoModulePromise;
|
|
40
53
|
}
|
|
@@ -6,6 +6,7 @@ interface BunCryptoHasher {
|
|
|
6
6
|
interface BunRuntime {
|
|
7
7
|
CryptoHasher?: new (algorithm: string) => BunCryptoHasher;
|
|
8
8
|
gzipSync?: (data: Uint8Array) => Uint8Array;
|
|
9
|
+
gunzipSync?: (data: Uint8Array) => Uint8Array;
|
|
9
10
|
readableStreamToBytes?: (
|
|
10
11
|
stream: ReadableStream<Uint8Array>
|
|
11
12
|
) => Promise<Uint8Array | ArrayBuffer>;
|