@syncular/transport-http 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/README.md +21 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +65 -1
- package/dist/index.js.map +1 -1
- package/dist/shared.d.ts +6 -1
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/transport-options.test.ts +35 -1
- package/src/index.ts +90 -1
- package/src/shared.ts +6 -0
package/README.md
CHANGED
|
@@ -26,6 +26,27 @@ const transport = createHttpTransport({
|
|
|
26
26
|
});
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
+
## React Native / Expo
|
|
30
|
+
|
|
31
|
+
Use the built-in React Native preset instead of manually tuning transport
|
|
32
|
+
capabilities for Hermes / Expo:
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
import { createReactNativeHttpTransport } from '@syncular/transport-http';
|
|
36
|
+
|
|
37
|
+
const transport = createReactNativeHttpTransport({
|
|
38
|
+
baseUrl: 'https://api.example.com',
|
|
39
|
+
getHeaders: () => ({ Authorization: `Bearer ${token}` }),
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
This preset enables:
|
|
44
|
+
|
|
45
|
+
- byte-based snapshot chunk fetches instead of `ReadableStream`
|
|
46
|
+
- buffered gzip decompression fallback
|
|
47
|
+
- per-subscription bootstrap commits
|
|
48
|
+
- materialized snapshot application preferred for mobile runtimes
|
|
49
|
+
|
|
29
50
|
## Documentation
|
|
30
51
|
|
|
31
52
|
- How sync works (push/pull): https://syncular.dev/docs/introduction/architecture
|
package/dist/index.d.ts
CHANGED
|
@@ -5,12 +5,14 @@
|
|
|
5
5
|
* - a lightweight fetch-based SyncTransport for client runtime use
|
|
6
6
|
* - a separately exported typed API client for advanced/console use
|
|
7
7
|
*/
|
|
8
|
-
import type { SyncTransport } from '@syncular/core';
|
|
8
|
+
import type { SyncTransport, SyncTransportCapabilities } from '@syncular/core';
|
|
9
9
|
import type { SyncClient } from './api-client';
|
|
10
10
|
import { type ClientOptions, type SyncTransportPath, unwrap } from './shared';
|
|
11
11
|
export { type SyncClient, type ClientOptions, type SyncTransportPath, unwrap };
|
|
12
12
|
export type { SyncAuthErrorContext, SyncAuthLifecycle, SyncAuthOperation, SyncTransport, SyncTransportOptions, } from '@syncular/core';
|
|
13
13
|
export { createApiClient } from './api-client';
|
|
14
14
|
export type { operations } from './generated/api';
|
|
15
|
+
export declare const REACT_NATIVE_TRANSPORT_CAPABILITIES: SyncTransportCapabilities;
|
|
15
16
|
export declare function createHttpTransport(clientOrOptions: SyncClient | ClientOptions): SyncTransport;
|
|
17
|
+
export declare function createReactNativeHttpTransport(clientOrOptions: SyncClient | ClientOptions): SyncTransport;
|
|
16
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAIV,aAAa,EACb,yBAAyB,EAE1B,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAGL,KAAK,aAAa,EAKlB,KAAK,iBAAiB,EACtB,MAAM,EACP,MAAM,UAAU,CAAC;AAQlB,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,EAAE,CAAC;AAE/E,YAAY,EACV,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA6DlD,eAAO,MAAM,mCAAmC,EAAE,yBAKjD,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,UAAU,GAAG,aAAa,GAC1C,aAAa,CA6Nf;AAED,wBAAgB,8BAA8B,CAC5C,eAAe,EAAE,UAAU,GAAG,aAAa,GAC1C,aAAa,CAYf"}
|
package/dist/index.js
CHANGED
|
@@ -10,11 +10,63 @@ import { applySnapshotScopesHeader, bytesToReadableStream, executeWithAuthRetry,
|
|
|
10
10
|
import { createTransportApiClient, createTransportAuthRetryResolver, HTTP_TRANSPORT_SOURCE, } from './transport-client.js';
|
|
11
11
|
export { unwrap };
|
|
12
12
|
export { createApiClient } from './api-client.js';
|
|
13
|
+
function detectDefaultTransportCapabilities() {
|
|
14
|
+
const isReactNative = typeof navigator !== 'undefined' && navigator?.product === 'ReactNative';
|
|
15
|
+
const snapshotChunkReadMode = isReactNative ? 'bytes' : 'stream';
|
|
16
|
+
const gzipDecompressionMode = !isReactNative && typeof DecompressionStream !== 'undefined'
|
|
17
|
+
? 'stream'
|
|
18
|
+
: 'buffered';
|
|
19
|
+
const preferredBootstrapApplyMode = snapshotChunkReadMode === 'bytes' || gzipDecompressionMode === 'buffered'
|
|
20
|
+
? 'per-subscription'
|
|
21
|
+
: 'single-transaction';
|
|
22
|
+
return {
|
|
23
|
+
snapshotChunkReadMode,
|
|
24
|
+
gzipDecompressionMode,
|
|
25
|
+
preferredBootstrapApplyMode,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function mergeTransportCapabilities(overrides) {
|
|
29
|
+
const defaults = detectDefaultTransportCapabilities();
|
|
30
|
+
const merged = {
|
|
31
|
+
...defaults,
|
|
32
|
+
...overrides,
|
|
33
|
+
};
|
|
34
|
+
if (overrides?.preferredBootstrapApplyMode) {
|
|
35
|
+
return merged;
|
|
36
|
+
}
|
|
37
|
+
const preferredBootstrapApplyMode = merged.snapshotChunkReadMode === 'bytes' ||
|
|
38
|
+
merged.gzipDecompressionMode === 'buffered'
|
|
39
|
+
? 'per-subscription'
|
|
40
|
+
: 'single-transaction';
|
|
41
|
+
return {
|
|
42
|
+
...merged,
|
|
43
|
+
preferredBootstrapApplyMode,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function shouldUseResponseBodyStream(response, capabilities) {
|
|
47
|
+
if (!response.body)
|
|
48
|
+
return false;
|
|
49
|
+
if (capabilities.snapshotChunkReadMode === 'bytes') {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
return (typeof response.body.getReader ===
|
|
53
|
+
'function');
|
|
54
|
+
}
|
|
55
|
+
export const REACT_NATIVE_TRANSPORT_CAPABILITIES = {
|
|
56
|
+
snapshotChunkReadMode: 'bytes',
|
|
57
|
+
gzipDecompressionMode: 'buffered',
|
|
58
|
+
preferredBootstrapApplyMode: 'per-subscription',
|
|
59
|
+
preferMaterializedSnapshots: true,
|
|
60
|
+
};
|
|
13
61
|
export function createHttpTransport(clientOrOptions) {
|
|
14
62
|
const client = createTransportApiClient(clientOrOptions);
|
|
15
63
|
const resolveAuthRetry = createTransportAuthRetryResolver(clientOrOptions);
|
|
16
64
|
const transportOptions = 'baseUrl' in clientOrOptions ? clientOrOptions : undefined;
|
|
65
|
+
const capabilities = 'baseUrl' in clientOrOptions
|
|
66
|
+
? mergeTransportCapabilities(clientOrOptions.capabilities)
|
|
67
|
+
: mergeTransportCapabilities();
|
|
17
68
|
const transport = {
|
|
69
|
+
capabilities,
|
|
18
70
|
async sync(request, transportRequestOptions) {
|
|
19
71
|
const { data, error, response } = await executeWithTransientNetworkRetry({
|
|
20
72
|
execute: (signal) => executeWithAuthRetry((retrySignal) => client.sync(request, retrySignal), { ...transportRequestOptions, signal }, 'sync', resolveAuthRetry),
|
|
@@ -122,7 +174,7 @@ export function createHttpTransport(clientOrOptions) {
|
|
|
122
174
|
}
|
|
123
175
|
throw new SyncTransportError(`Snapshot chunk download failed: ${reason}`, response.status);
|
|
124
176
|
}
|
|
125
|
-
if (!response
|
|
177
|
+
if (!shouldUseResponseBodyStream(response, capabilities)) {
|
|
126
178
|
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
127
179
|
return bytesToReadableStream(bytes);
|
|
128
180
|
}
|
|
@@ -137,4 +189,16 @@ export function createHttpTransport(clientOrOptions) {
|
|
|
137
189
|
});
|
|
138
190
|
return transport;
|
|
139
191
|
}
|
|
192
|
+
export function createReactNativeHttpTransport(clientOrOptions) {
|
|
193
|
+
if (!('baseUrl' in clientOrOptions)) {
|
|
194
|
+
return createHttpTransport(clientOrOptions);
|
|
195
|
+
}
|
|
196
|
+
return createHttpTransport({
|
|
197
|
+
...clientOrOptions,
|
|
198
|
+
capabilities: {
|
|
199
|
+
...REACT_NATIVE_TRANSPORT_CAPABILITIES,
|
|
200
|
+
...clientOrOptions.capabilities,
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
}
|
|
140
204
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/shared.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ScopeValues, SyncAuthErrorContext, SyncAuthLifecycle, SyncAuthOperation, SyncTransportOptions } from '@syncular/core';
|
|
1
|
+
import type { ScopeValues, SyncAuthErrorContext, SyncAuthLifecycle, SyncAuthOperation, SyncTransportCapabilities, SyncTransportOptions } from '@syncular/core';
|
|
2
2
|
export type SyncTransportPath = 'direct' | 'relay';
|
|
3
3
|
export interface ClientOptions {
|
|
4
4
|
/** Base URL for the API (e.g., 'https://api.example.com') */
|
|
@@ -14,6 +14,11 @@ export interface ClientOptions {
|
|
|
14
14
|
* Defaults to 'direct'.
|
|
15
15
|
*/
|
|
16
16
|
transportPath?: SyncTransportPath;
|
|
17
|
+
/**
|
|
18
|
+
* Explicit runtime capabilities override.
|
|
19
|
+
* Use this to avoid environment sniffing in runtimes like React Native.
|
|
20
|
+
*/
|
|
21
|
+
capabilities?: Partial<SyncTransportCapabilities>;
|
|
17
22
|
}
|
|
18
23
|
export type ApiResult<T> = {
|
|
19
24
|
data?: T;
|
package/dist/shared.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AAGxB,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5E,0DAA0D;IAC1D,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC;;;OAGG;IACH,aAAa,CAAC,EAAE,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,EACzB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AAGxB,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5E,0DAA0D;IAC1D,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC;;;OAGG;IACH,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACnD;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACzB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,CAC7B,OAAO,EAAE,oBAAoB,EAC7B,OAAO,CAAC,EAAE,oBAAoB,KAC3B,OAAO,CAAC,OAAO,CAAC,CAAC;AActB,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAUtD;AAED,wBAAsB,MAAM,CAAC,CAAC,EAC5B,OAAO,EAAE,OAAO,CAAC;IAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAC9C,OAAO,CAAC,CAAC,CAAC,CAMZ;AAED,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACxD,OAAO,EAAE,oBAAoB,GAAG,SAAS,EACzC,SAAS,EAAE,iBAAiB,EAC5B,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAcvB;AAiCD,wBAAsB,gCAAgC,CAAC,CAAC,EAAE,IAAI,EAAE;IAC9D,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC,GAAG,OAAO,CAAC,CAAC,CAAC,CA8Bb;AAED,eAAO,MAAM,sBAAsB,+BAA+B,CAAC;AAEnE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMvE;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,UAAU,GAChB,cAAc,CAAC,UAAU,CAAC,CAO5B;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,WAAW,GAAG,SAAS,GACnC,MAAM,GAAG,IAAI,CAIf;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,GAAG,SAAS,GACnC,IAAI,CAIN;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,WAAW,GAAG,SAAS,GACnC,MAAM,CAYR"}
|
package/dist/shared.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@syncular/transport-http",
|
|
3
|
-
"version": "0.0.6-
|
|
3
|
+
"version": "0.0.6-219",
|
|
4
4
|
"description": "HTTP transport for Syncular client-server communication",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Benjamin Kniffler",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"release": "bunx syncular-publish"
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"@syncular/core": "0.0.6-
|
|
54
|
+
"@syncular/core": "0.0.6-219",
|
|
55
55
|
"openapi-fetch": "^0.17.0"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { describe, expect, it } from 'bun:test';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
createApiClient,
|
|
4
|
+
createHttpTransport,
|
|
5
|
+
createReactNativeHttpTransport,
|
|
6
|
+
} from '../index';
|
|
3
7
|
|
|
4
8
|
function readHeaderFromFetchArgs(
|
|
5
9
|
input: RequestInfo | URL,
|
|
@@ -30,6 +34,36 @@ function readSearchParamFromFetchArgs(
|
|
|
30
34
|
}
|
|
31
35
|
|
|
32
36
|
describe('createHttpTransport SyncTransportOptions', () => {
|
|
37
|
+
it('exposes explicit transport capabilities and merges overrides', () => {
|
|
38
|
+
const transport = createHttpTransport({
|
|
39
|
+
baseUrl: 'http://localhost',
|
|
40
|
+
capabilities: {
|
|
41
|
+
snapshotChunkReadMode: 'bytes',
|
|
42
|
+
preferMaterializedSnapshots: true,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
expect(transport.capabilities?.snapshotChunkReadMode).toBe('bytes');
|
|
47
|
+
expect(transport.capabilities?.preferMaterializedSnapshots).toBe(true);
|
|
48
|
+
expect(transport.capabilities?.gzipDecompressionMode).toBeDefined();
|
|
49
|
+
expect(transport.capabilities?.preferredBootstrapApplyMode).toBe(
|
|
50
|
+
'per-subscription'
|
|
51
|
+
);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('provides a React Native / Expo transport preset', () => {
|
|
55
|
+
const transport = createReactNativeHttpTransport({
|
|
56
|
+
baseUrl: 'http://localhost',
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
expect(transport.capabilities).toMatchObject({
|
|
60
|
+
snapshotChunkReadMode: 'bytes',
|
|
61
|
+
gzipDecompressionMode: 'buffered',
|
|
62
|
+
preferredBootstrapApplyMode: 'per-subscription',
|
|
63
|
+
preferMaterializedSnapshots: true,
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
|
|
33
67
|
it('forwards AbortSignal to sync requests', async () => {
|
|
34
68
|
const controller = new AbortController();
|
|
35
69
|
let capturedSignal: AbortSignal | null = null;
|
package/src/index.ts
CHANGED
|
@@ -7,9 +7,11 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import type {
|
|
10
|
+
SyncBootstrapApplyMode,
|
|
10
11
|
SyncCombinedRequest,
|
|
11
12
|
SyncCombinedResponse,
|
|
12
13
|
SyncTransport,
|
|
14
|
+
SyncTransportCapabilities,
|
|
13
15
|
SyncTransportOptions,
|
|
14
16
|
} from '@syncular/core';
|
|
15
17
|
import { SyncTransportError } from '@syncular/core';
|
|
@@ -44,6 +46,72 @@ export type {
|
|
|
44
46
|
export { createApiClient } from './api-client';
|
|
45
47
|
export type { operations } from './generated/api';
|
|
46
48
|
|
|
49
|
+
function detectDefaultTransportCapabilities(): SyncTransportCapabilities {
|
|
50
|
+
const isReactNative =
|
|
51
|
+
typeof navigator !== 'undefined' && navigator?.product === 'ReactNative';
|
|
52
|
+
const snapshotChunkReadMode = isReactNative ? 'bytes' : 'stream';
|
|
53
|
+
const gzipDecompressionMode =
|
|
54
|
+
!isReactNative && typeof DecompressionStream !== 'undefined'
|
|
55
|
+
? 'stream'
|
|
56
|
+
: 'buffered';
|
|
57
|
+
const preferredBootstrapApplyMode: SyncBootstrapApplyMode =
|
|
58
|
+
snapshotChunkReadMode === 'bytes' || gzipDecompressionMode === 'buffered'
|
|
59
|
+
? 'per-subscription'
|
|
60
|
+
: 'single-transaction';
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
snapshotChunkReadMode,
|
|
64
|
+
gzipDecompressionMode,
|
|
65
|
+
preferredBootstrapApplyMode,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function mergeTransportCapabilities(
|
|
70
|
+
overrides?: Partial<SyncTransportCapabilities>
|
|
71
|
+
): SyncTransportCapabilities {
|
|
72
|
+
const defaults = detectDefaultTransportCapabilities();
|
|
73
|
+
const merged = {
|
|
74
|
+
...defaults,
|
|
75
|
+
...overrides,
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
if (overrides?.preferredBootstrapApplyMode) {
|
|
79
|
+
return merged;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const preferredBootstrapApplyMode: SyncBootstrapApplyMode =
|
|
83
|
+
merged.snapshotChunkReadMode === 'bytes' ||
|
|
84
|
+
merged.gzipDecompressionMode === 'buffered'
|
|
85
|
+
? 'per-subscription'
|
|
86
|
+
: 'single-transaction';
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
...merged,
|
|
90
|
+
preferredBootstrapApplyMode,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function shouldUseResponseBodyStream(
|
|
95
|
+
response: Response,
|
|
96
|
+
capabilities: SyncTransportCapabilities
|
|
97
|
+
): boolean {
|
|
98
|
+
if (!response.body) return false;
|
|
99
|
+
if (capabilities.snapshotChunkReadMode === 'bytes') {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
return (
|
|
103
|
+
typeof (response.body as ReadableStream<Uint8Array>).getReader ===
|
|
104
|
+
'function'
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export const REACT_NATIVE_TRANSPORT_CAPABILITIES: SyncTransportCapabilities = {
|
|
109
|
+
snapshotChunkReadMode: 'bytes',
|
|
110
|
+
gzipDecompressionMode: 'buffered',
|
|
111
|
+
preferredBootstrapApplyMode: 'per-subscription',
|
|
112
|
+
preferMaterializedSnapshots: true,
|
|
113
|
+
};
|
|
114
|
+
|
|
47
115
|
export function createHttpTransport(
|
|
48
116
|
clientOrOptions: SyncClient | ClientOptions
|
|
49
117
|
): SyncTransport {
|
|
@@ -51,8 +119,13 @@ export function createHttpTransport(
|
|
|
51
119
|
const resolveAuthRetry = createTransportAuthRetryResolver(clientOrOptions);
|
|
52
120
|
const transportOptions =
|
|
53
121
|
'baseUrl' in clientOrOptions ? clientOrOptions : undefined;
|
|
122
|
+
const capabilities =
|
|
123
|
+
'baseUrl' in clientOrOptions
|
|
124
|
+
? mergeTransportCapabilities(clientOrOptions.capabilities)
|
|
125
|
+
: mergeTransportCapabilities();
|
|
54
126
|
|
|
55
127
|
const transport: SyncTransport = {
|
|
128
|
+
capabilities,
|
|
56
129
|
async sync(
|
|
57
130
|
request: SyncCombinedRequest,
|
|
58
131
|
transportRequestOptions?: SyncTransportOptions
|
|
@@ -245,7 +318,7 @@ export function createHttpTransport(
|
|
|
245
318
|
);
|
|
246
319
|
}
|
|
247
320
|
|
|
248
|
-
if (!response
|
|
321
|
+
if (!shouldUseResponseBodyStream(response, capabilities)) {
|
|
249
322
|
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
250
323
|
return bytesToReadableStream(bytes);
|
|
251
324
|
}
|
|
@@ -263,3 +336,19 @@ export function createHttpTransport(
|
|
|
263
336
|
|
|
264
337
|
return transport;
|
|
265
338
|
}
|
|
339
|
+
|
|
340
|
+
export function createReactNativeHttpTransport(
|
|
341
|
+
clientOrOptions: SyncClient | ClientOptions
|
|
342
|
+
): SyncTransport {
|
|
343
|
+
if (!('baseUrl' in clientOrOptions)) {
|
|
344
|
+
return createHttpTransport(clientOrOptions);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
return createHttpTransport({
|
|
348
|
+
...clientOrOptions,
|
|
349
|
+
capabilities: {
|
|
350
|
+
...REACT_NATIVE_TRANSPORT_CAPABILITIES,
|
|
351
|
+
...clientOrOptions.capabilities,
|
|
352
|
+
},
|
|
353
|
+
});
|
|
354
|
+
}
|
package/src/shared.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type {
|
|
|
3
3
|
SyncAuthErrorContext,
|
|
4
4
|
SyncAuthLifecycle,
|
|
5
5
|
SyncAuthOperation,
|
|
6
|
+
SyncTransportCapabilities,
|
|
6
7
|
SyncTransportOptions,
|
|
7
8
|
} from '@syncular/core';
|
|
8
9
|
import { resolveUrlFromBase } from '@syncular/core';
|
|
@@ -23,6 +24,11 @@ export interface ClientOptions {
|
|
|
23
24
|
* Defaults to 'direct'.
|
|
24
25
|
*/
|
|
25
26
|
transportPath?: SyncTransportPath;
|
|
27
|
+
/**
|
|
28
|
+
* Explicit runtime capabilities override.
|
|
29
|
+
* Use this to avoid environment sniffing in runtimes like React Native.
|
|
30
|
+
*/
|
|
31
|
+
capabilities?: Partial<SyncTransportCapabilities>;
|
|
26
32
|
}
|
|
27
33
|
|
|
28
34
|
export type ApiResult<T> = {
|