@proappstore/sdk 1.16.95 → 1.16.97
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 +6 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/offline/downloads.d.ts +44 -0
- package/dist/offline/downloads.d.ts.map +1 -0
- package/dist/offline/downloads.js +235 -0
- package/dist/offline/downloads.js.map +1 -0
- package/dist/offline/jobs.d.ts +78 -0
- package/dist/offline/jobs.d.ts.map +1 -0
- package/dist/offline/jobs.js +231 -0
- package/dist/offline/jobs.js.map +1 -0
- package/dist/offline/locks.d.ts +6 -0
- package/dist/offline/locks.d.ts.map +1 -0
- package/dist/offline/locks.js +47 -0
- package/dist/offline/locks.js.map +1 -0
- package/dist/offline/store.d.ts +94 -0
- package/dist/offline/store.d.ts.map +1 -0
- package/dist/offline/store.js +271 -0
- package/dist/offline/store.js.map +1 -0
- package/dist/offline.d.ts +8 -0
- package/dist/offline.d.ts.map +1 -0
- package/dist/offline.js +5 -0
- package/dist/offline.js.map +1 -0
- package/dist/sdk-version.js +1 -1
- package/dist/shell-resilience.d.ts +3 -1
- package/dist/shell-resilience.d.ts.map +1 -1
- package/dist/shell-resilience.js +2 -2
- package/dist/shell-resilience.js.map +1 -1
- package/dist/shell.d.ts +11 -2
- package/dist/shell.d.ts.map +1 -1
- package/dist/shell.js +49 -30
- package/dist/shell.js.map +1 -1
- package/package.json +6 -1
package/README.md
CHANGED
|
@@ -29,6 +29,12 @@ Options:
|
|
|
29
29
|
| `proApiBase` | `https://api.proappstore.online` | Platform API base URL |
|
|
30
30
|
| `dataApiBase` | `https://data-{appId}.proappstore.online`, or `/.pas/data` in `platform-cookie` mode | Per-app data worker URL |
|
|
31
31
|
|
|
32
|
+
## Offline content (opt-in)
|
|
33
|
+
|
|
34
|
+
Import `createOfflineStore`, `createDownloadManager`, `createLocalJobs` and `createSyncQueue` from `@proappstore/sdk/offline`. Local records and blobs use transactional IndexedDB, explicit device/account scope and retention; public model downloads require version, size and SHA-256 pins. Durable jobs recover checkpoints, and the optional queue flushes only explicitly idempotent operations. Account access callbacks are local policy, not server authorization.
|
|
35
|
+
|
|
36
|
+
`<AppShell access="local" app={app}>` renders local features without inventing an authenticated user; the default remains authenticated. Keep auth responses out of service-worker caches and checkpoint active work before updates. See the [offline guide](https://docs.proappstore.online/offline-apps/) for API usage, retention, quota, update and browser/device limits.
|
|
37
|
+
|
|
32
38
|
## Types
|
|
33
39
|
|
|
34
40
|
```ts
|
package/dist/index.d.ts
CHANGED
|
@@ -58,7 +58,7 @@ export { AdminConsole, AdminErrorBoundary, useAdminContext, useAction } from './
|
|
|
58
58
|
export type { AdminConsoleProps, AdminContextValue, UseActionOptions, ActionInvoker } from './admin.js';
|
|
59
59
|
export type { ProProviderProps } from './provider.js';
|
|
60
60
|
export { AppShell, ProShell } from './shell.js';
|
|
61
|
-
export type { AppShellProps, AppShellRenderContext, AppShellNavContext, ProShellProps, ProShellRenderContext, ProShellNavContext, MenuItem, ShellErrorContext } from './shell.js';
|
|
61
|
+
export type { AppShellProps, AppShellRenderContext, LocalAppShellRenderContext, AppShellNavContext, ProShellProps, ProShellRenderContext, ProShellNavContext, MenuItem, ShellErrorContext } from './shell.js';
|
|
62
62
|
export { useToast, useOnline } from './shell-resilience.js';
|
|
63
63
|
export type { ToastApi, ToastOptions, ShellToastVariant } from './shell-resilience.js';
|
|
64
64
|
export { PageHeader, useDocumentTitle } from './page.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAsC,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzD,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACrF,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACxH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,YAAY,EACV,MAAM,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EACzD,qBAAqB,EAAE,eAAe,GACvC,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEhJ,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3F,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7F,YAAY,EACV,cAAc,EACd,YAAY,EACZ,kBAAkB,IAAI,sBAAsB,EAC5C,eAAe,EACf,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpF,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACzF,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,YAAY,EACV,cAAc,EACd,eAAe,EACf,WAAW,EACX,eAAe,EACf,cAAc,EACd,YAAY,EACZ,WAAW,GACZ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAItE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3F,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC1F,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACxG,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type OfflineStore } from './store.js';
|
|
2
|
+
export interface DownloadManifest {
|
|
3
|
+
id: string;
|
|
4
|
+
version: string;
|
|
5
|
+
url: string;
|
|
6
|
+
sha256: string;
|
|
7
|
+
bytes: number;
|
|
8
|
+
}
|
|
9
|
+
export interface DownloadProgress {
|
|
10
|
+
loaded: number;
|
|
11
|
+
total: number;
|
|
12
|
+
resumed: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface DownloadStatus {
|
|
15
|
+
state: 'partial' | 'ready';
|
|
16
|
+
loaded: number;
|
|
17
|
+
total: number;
|
|
18
|
+
}
|
|
19
|
+
export interface DownloadOptions {
|
|
20
|
+
signal?: AbortSignal;
|
|
21
|
+
onProgress?: (progress: DownloadProgress) => void;
|
|
22
|
+
}
|
|
23
|
+
export interface DownloadManagerOptions {
|
|
24
|
+
fetch?: typeof fetch;
|
|
25
|
+
maxBytes?: number;
|
|
26
|
+
checkpointBytes?: number;
|
|
27
|
+
}
|
|
28
|
+
export declare class DownloadManager {
|
|
29
|
+
private readonly store;
|
|
30
|
+
private readonly fetcher;
|
|
31
|
+
private readonly maxBytes;
|
|
32
|
+
private readonly checkpointBytes;
|
|
33
|
+
constructor(store: OfflineStore, options?: DownloadManagerOptions);
|
|
34
|
+
status(manifest: DownloadManifest): Promise<DownloadStatus | null>;
|
|
35
|
+
get(manifest: DownloadManifest): Promise<Blob | null>;
|
|
36
|
+
private verify;
|
|
37
|
+
private readReady;
|
|
38
|
+
remove(manifest: DownloadManifest): Promise<void>;
|
|
39
|
+
private removeByKey;
|
|
40
|
+
download(manifest: DownloadManifest, options?: DownloadOptions): Promise<Blob>;
|
|
41
|
+
private transfer;
|
|
42
|
+
}
|
|
43
|
+
export declare function createDownloadManager(store: OfflineStore, options?: DownloadManagerOptions): DownloadManager;
|
|
44
|
+
//# sourceMappingURL=downloads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"downloads.d.ts","sourceRoot":"","sources":["../../src/offline/downloads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAM7D,MAAM,WAAW,gBAAgB;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAC7G,MAAM,WAAW,gBAAgB;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE;AACrF,MAAM,WAAW,cAAc;IAAG,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAE7F,MAAM,WAAW,eAAe;IAAG,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAA;CAAE;AAC5G,MAAM,WAAW,sBAAsB;IAAG,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE;AAsB7G,qBAAa,eAAe;IAId,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHlC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBACZ,KAAK,EAAE,YAAY,EAAE,OAAO,GAAE,sBAA2B;IAShF,MAAM,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAKlE,GAAG,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YAK7C,MAAM;YAON,SAAS;IAcjB,MAAM,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,OAAO,CAAC,WAAW;IAUb,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;YAO1E,QAAQ;CAqFvB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,GAAE,sBAA2B,GAAG,eAAe,CAAgD"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { OfflineError } from './store.js';
|
|
2
|
+
import { offlineLock } from './locks.js';
|
|
3
|
+
function assetKey(manifest, maxBytes) {
|
|
4
|
+
if (!manifest.id || manifest.id.length > 128 || !manifest.version || manifest.version.length > 128 ||
|
|
5
|
+
!/^[a-f0-9]{64}$/i.test(manifest.sha256) || !Number.isSafeInteger(manifest.bytes) || manifest.bytes <= 0 || manifest.bytes > maxBytes) {
|
|
6
|
+
throw new OfflineError('invalid', 'Download requires an id, version, SHA-256 and byte size within the configured limit.');
|
|
7
|
+
}
|
|
8
|
+
let url;
|
|
9
|
+
try {
|
|
10
|
+
url = new URL(manifest.url);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
throw new OfflineError('invalid', 'Download URL must be absolute.');
|
|
14
|
+
}
|
|
15
|
+
const local = ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname);
|
|
16
|
+
if ((url.protocol !== 'https:' && !(url.protocol === 'http:' && local)) || url.username || url.password ||
|
|
17
|
+
url.pathname.startsWith('/.pas/') || url.hostname === 'api.proappstore.online' || url.hostname.startsWith('data-')) {
|
|
18
|
+
throw new OfflineError('invalid', 'Only public immutable assets may use the download manager; authenticated endpoints are excluded.');
|
|
19
|
+
}
|
|
20
|
+
return JSON.stringify([manifest.id, manifest.version, manifest.sha256.toLowerCase(), manifest.bytes, url.href]);
|
|
21
|
+
}
|
|
22
|
+
const partKey = (id, n) => `download-part:${id}:${n}`;
|
|
23
|
+
const readyKey = (id) => `download-ready:${id}`;
|
|
24
|
+
const abort = (signal) => { if (signal?.aborted)
|
|
25
|
+
throw new DOMException('Download cancelled.', 'AbortError'); };
|
|
26
|
+
const strongEtag = (value) => value && /^"[^"\r\n]+"$/.test(value) ? value : null;
|
|
27
|
+
export class DownloadManager {
|
|
28
|
+
store;
|
|
29
|
+
fetcher;
|
|
30
|
+
maxBytes;
|
|
31
|
+
checkpointBytes;
|
|
32
|
+
constructor(store, options = {}) {
|
|
33
|
+
this.store = store;
|
|
34
|
+
if (!options.fetch && typeof globalThis.fetch !== 'function')
|
|
35
|
+
throw new OfflineError('unavailable', 'Fetch is unavailable on this device.');
|
|
36
|
+
this.fetcher = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
37
|
+
this.maxBytes = options.maxBytes ?? 512 * 1024 * 1024;
|
|
38
|
+
this.checkpointBytes = options.checkpointBytes ?? 1024 * 1024;
|
|
39
|
+
if (!Number.isSafeInteger(this.maxBytes) || this.maxBytes <= 0 || !Number.isSafeInteger(this.checkpointBytes) || this.checkpointBytes <= 0) {
|
|
40
|
+
throw new OfflineError('invalid', 'Download byte limits must be positive integers.');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async status(manifest) {
|
|
44
|
+
manifest = Object.freeze({ ...manifest });
|
|
45
|
+
const row = await this.store.read('downloads', assetKey(manifest, this.maxBytes));
|
|
46
|
+
return row ? { state: row.state, loaded: row.loaded, total: row.total } : null;
|
|
47
|
+
}
|
|
48
|
+
async get(manifest) {
|
|
49
|
+
manifest = Object.freeze({ ...manifest });
|
|
50
|
+
const id = assetKey(manifest, this.maxBytes);
|
|
51
|
+
return this.store.runWork(() => offlineLock(`${this.store.databaseName}:${id}`, () => this.readReady(id, manifest), true));
|
|
52
|
+
}
|
|
53
|
+
async verify(blob, manifest) {
|
|
54
|
+
if (!globalThis.crypto?.subtle)
|
|
55
|
+
throw new OfflineError('unavailable', 'SHA-256 verification requires a secure browser context.');
|
|
56
|
+
const digest = await crypto.subtle.digest('SHA-256', await blob.arrayBuffer());
|
|
57
|
+
const hash = Array.from(new Uint8Array(digest), (n) => n.toString(16).padStart(2, '0')).join('');
|
|
58
|
+
this.store.assertAccess();
|
|
59
|
+
if (blob.size !== manifest.bytes || hash !== manifest.sha256.toLowerCase())
|
|
60
|
+
throw new OfflineError('integrity', 'Downloaded bytes do not match the pinned model.');
|
|
61
|
+
}
|
|
62
|
+
async readReady(id, manifest) {
|
|
63
|
+
const row = await this.store.read('downloads', id);
|
|
64
|
+
if (row?.state !== 'ready')
|
|
65
|
+
return null;
|
|
66
|
+
const blob = await this.store.read('blobs', readyKey(id));
|
|
67
|
+
try {
|
|
68
|
+
if (!blob)
|
|
69
|
+
throw new OfflineError('integrity', 'The downloaded asset is missing.');
|
|
70
|
+
await this.verify(blob, manifest);
|
|
71
|
+
this.store.assertAccess();
|
|
72
|
+
return blob;
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
if (error instanceof OfflineError && error.code === 'integrity')
|
|
76
|
+
await this.removeByKey(id);
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async remove(manifest) {
|
|
81
|
+
manifest = Object.freeze({ ...manifest });
|
|
82
|
+
const id = assetKey(manifest, this.maxBytes);
|
|
83
|
+
return this.store.runWork(() => offlineLock(`${this.store.databaseName}:${id}`, () => this.removeByKey(id), true));
|
|
84
|
+
}
|
|
85
|
+
removeByKey(id) {
|
|
86
|
+
return this.store.transaction(['downloads', 'blobs'], 'readwrite', (tx, done) => {
|
|
87
|
+
const request = tx.objectStore('downloads').get(id);
|
|
88
|
+
request.onsuccess = () => {
|
|
89
|
+
const row = request.result;
|
|
90
|
+
for (let n = 0; n < (row?.chunks ?? 0); n++)
|
|
91
|
+
tx.objectStore('blobs').delete(partKey(id, n));
|
|
92
|
+
tx.objectStore('blobs').delete(readyKey(id));
|
|
93
|
+
tx.objectStore('downloads').delete(id);
|
|
94
|
+
done(undefined);
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
async download(manifest, options = {}) {
|
|
99
|
+
const signal = options.signal, onProgress = options.onProgress;
|
|
100
|
+
options = { ...(signal ? { signal } : {}), ...(onProgress ? { onProgress } : {}) };
|
|
101
|
+
manifest = Object.freeze({ ...manifest });
|
|
102
|
+
const id = assetKey(manifest, this.maxBytes);
|
|
103
|
+
return this.store.runWork(() => offlineLock(`${this.store.databaseName}:${id}`, () => this.transfer(id, manifest, options), true, options.signal ? { signal: options.signal } : {}), options.signal);
|
|
104
|
+
}
|
|
105
|
+
async transfer(id, manifest, options) {
|
|
106
|
+
abort(options.signal);
|
|
107
|
+
const cached = await this.readReady(id, manifest);
|
|
108
|
+
if (cached) {
|
|
109
|
+
abort(options.signal);
|
|
110
|
+
this.store.assertAccess();
|
|
111
|
+
options.onProgress?.({ loaded: cached.size, total: cached.size, resumed: false });
|
|
112
|
+
return cached;
|
|
113
|
+
}
|
|
114
|
+
let row = await this.store.read('downloads', id);
|
|
115
|
+
if (row && row.loaded < manifest.bytes && !row.etag) {
|
|
116
|
+
await this.removeByKey(id);
|
|
117
|
+
row = null;
|
|
118
|
+
}
|
|
119
|
+
let current = row ?? { state: 'partial', loaded: 0, total: manifest.bytes, chunks: 0, etag: null };
|
|
120
|
+
let resumed = current.loaded > 0;
|
|
121
|
+
let pending = [];
|
|
122
|
+
let pendingBytes = 0;
|
|
123
|
+
const checkpoint = async () => {
|
|
124
|
+
if (!pendingBytes)
|
|
125
|
+
return;
|
|
126
|
+
const blob = new Blob(pending);
|
|
127
|
+
const next = { ...current, loaded: current.loaded + pendingBytes, chunks: current.chunks + 1 };
|
|
128
|
+
await this.store.transaction(['downloads', 'blobs'], 'readwrite', (tx, done) => {
|
|
129
|
+
tx.objectStore('blobs').put(blob, partKey(id, current.chunks));
|
|
130
|
+
tx.objectStore('downloads').put(next, id);
|
|
131
|
+
done(undefined);
|
|
132
|
+
});
|
|
133
|
+
current = next;
|
|
134
|
+
pending = [];
|
|
135
|
+
pendingBytes = 0;
|
|
136
|
+
};
|
|
137
|
+
try {
|
|
138
|
+
if (current.loaded < manifest.bytes) {
|
|
139
|
+
const headers = new Headers();
|
|
140
|
+
if (current.loaded && current.etag) {
|
|
141
|
+
headers.set('Range', `bytes=${current.loaded}-`);
|
|
142
|
+
headers.set('If-Range', current.etag);
|
|
143
|
+
}
|
|
144
|
+
const response = await this.fetcher(manifest.url, { headers, credentials: 'omit', redirect: 'error', cache: 'no-store', ...(options.signal ? { signal: options.signal } : {}) });
|
|
145
|
+
if (response.status === 200 && current.loaded) {
|
|
146
|
+
resumed = false;
|
|
147
|
+
await this.removeByKey(id);
|
|
148
|
+
current = { state: 'partial', loaded: 0, total: manifest.bytes, chunks: 0, etag: null };
|
|
149
|
+
}
|
|
150
|
+
else if (response.status === 206) {
|
|
151
|
+
const range = /^bytes (\d+)-(\d+)\/(\d+)$/.exec(response.headers.get('Content-Range') ?? '');
|
|
152
|
+
if (!current.loaded || !current.etag || strongEtag(response.headers.get('ETag')) !== current.etag || !range ||
|
|
153
|
+
Number(range[1]) !== current.loaded || Number(range[2]) !== manifest.bytes - 1 || Number(range[3]) !== manifest.bytes) {
|
|
154
|
+
await response.body?.cancel();
|
|
155
|
+
await this.removeByKey(id);
|
|
156
|
+
throw new OfflineError('integrity', 'The resumed response does not match the saved asset version and range.');
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else if (response.status !== 200) {
|
|
160
|
+
await response.body?.cancel();
|
|
161
|
+
throw new OfflineError('network', `Download failed with HTTP ${response.status}.`);
|
|
162
|
+
}
|
|
163
|
+
current.etag = strongEtag(response.headers.get('ETag'));
|
|
164
|
+
if (!response.body)
|
|
165
|
+
throw new OfflineError('network', 'Download has no response body.');
|
|
166
|
+
const reader = response.body.getReader();
|
|
167
|
+
const cancelRead = () => { void reader.cancel().catch(() => { }); };
|
|
168
|
+
options.signal?.addEventListener('abort', cancelRead, { once: true });
|
|
169
|
+
try {
|
|
170
|
+
for (;;) {
|
|
171
|
+
abort(options.signal);
|
|
172
|
+
this.store.assertAccess();
|
|
173
|
+
const result = await reader.read();
|
|
174
|
+
abort(options.signal);
|
|
175
|
+
this.store.assertAccess();
|
|
176
|
+
if (result.done)
|
|
177
|
+
break;
|
|
178
|
+
if (current.loaded + pendingBytes + result.value.byteLength > manifest.bytes)
|
|
179
|
+
throw new OfflineError('integrity', 'Download exceeds its declared byte size.');
|
|
180
|
+
// Store independent chunks, never rewrite the already downloaded prefix.
|
|
181
|
+
pending.push(result.value.slice().buffer);
|
|
182
|
+
pendingBytes += result.value.byteLength;
|
|
183
|
+
if (pendingBytes >= this.checkpointBytes)
|
|
184
|
+
await checkpoint();
|
|
185
|
+
abort(options.signal);
|
|
186
|
+
this.store.assertAccess();
|
|
187
|
+
options.onProgress?.({ loaded: current.loaded + pendingBytes, total: manifest.bytes, resumed });
|
|
188
|
+
}
|
|
189
|
+
await checkpoint();
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
await reader.cancel().catch(() => { });
|
|
193
|
+
if (!(error instanceof OfflineError && error.code === 'integrity'))
|
|
194
|
+
await checkpoint();
|
|
195
|
+
throw error;
|
|
196
|
+
}
|
|
197
|
+
finally {
|
|
198
|
+
options.signal?.removeEventListener('abort', cancelRead);
|
|
199
|
+
reader.releaseLock();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
abort(options.signal);
|
|
203
|
+
if (current.loaded !== manifest.bytes)
|
|
204
|
+
throw new OfflineError('network', 'Download ended before the declared byte size. Retry to resume.');
|
|
205
|
+
const parts = [];
|
|
206
|
+
for (let n = 0; n < current.chunks; n++) {
|
|
207
|
+
const part = await this.store.read('blobs', partKey(id, n));
|
|
208
|
+
if (!part)
|
|
209
|
+
throw new OfflineError('integrity', 'A saved download chunk is missing.');
|
|
210
|
+
parts.push(part);
|
|
211
|
+
}
|
|
212
|
+
const complete = new Blob(parts, { type: 'application/octet-stream' });
|
|
213
|
+
await this.verify(complete, manifest);
|
|
214
|
+
abort(options.signal);
|
|
215
|
+
await this.store.transaction(['downloads', 'blobs'], 'readwrite', (tx, done) => {
|
|
216
|
+
tx.objectStore('blobs').put(complete, readyKey(id));
|
|
217
|
+
for (let n = 0; n < current.chunks; n++)
|
|
218
|
+
tx.objectStore('blobs').delete(partKey(id, n));
|
|
219
|
+
tx.objectStore('downloads').put({ ...current, state: 'ready', chunks: 0 }, id);
|
|
220
|
+
done(undefined);
|
|
221
|
+
});
|
|
222
|
+
abort(options.signal);
|
|
223
|
+
this.store.assertAccess();
|
|
224
|
+
options.onProgress?.({ loaded: manifest.bytes, total: manifest.bytes, resumed });
|
|
225
|
+
return complete;
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
if (error instanceof OfflineError && error.code === 'integrity')
|
|
229
|
+
await this.removeByKey(id);
|
|
230
|
+
throw error;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
export function createDownloadManager(store, options = {}) { return new DownloadManager(store, options); }
|
|
235
|
+
//# sourceMappingURL=downloads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"downloads.js","sourceRoot":"","sources":["../../src/offline/downloads.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { type LocalPage, type OfflineStore } from './store.js';
|
|
2
|
+
export type LocalJobStatus = 'pending' | 'running' | 'paused' | 'interrupted' | 'completed' | 'failed';
|
|
3
|
+
export interface LocalJob<I = unknown, C = unknown, R = unknown> {
|
|
4
|
+
id: string;
|
|
5
|
+
kind: string;
|
|
6
|
+
input: I;
|
|
7
|
+
checkpoint: C | null;
|
|
8
|
+
result: R | null;
|
|
9
|
+
status: LocalJobStatus;
|
|
10
|
+
attempts: number;
|
|
11
|
+
updatedAt: number;
|
|
12
|
+
error: string | null;
|
|
13
|
+
}
|
|
14
|
+
export interface LocalJobContext<C = unknown> {
|
|
15
|
+
savedCheckpoint: C | null;
|
|
16
|
+
checkpoint: (value: C) => Promise<void>;
|
|
17
|
+
signal: AbortSignal | undefined;
|
|
18
|
+
}
|
|
19
|
+
export type LocalJobHandler<I = unknown, C = unknown, R = unknown> = (input: I, context: LocalJobContext<C>) => Promise<R>;
|
|
20
|
+
export declare class LocalJobs {
|
|
21
|
+
private readonly store;
|
|
22
|
+
constructor(store: OfflineStore);
|
|
23
|
+
create<I>(input: {
|
|
24
|
+
id: string;
|
|
25
|
+
kind: string;
|
|
26
|
+
input: I;
|
|
27
|
+
}): Promise<LocalJob<I>>;
|
|
28
|
+
get<I = unknown, C = unknown, R = unknown>(id: string): Promise<LocalJob<I, C, R> | null>;
|
|
29
|
+
list(options?: LocalPage): Promise<LocalJob[]>;
|
|
30
|
+
private update;
|
|
31
|
+
checkpoint<C>(id: string, value: C): Promise<void>;
|
|
32
|
+
setStatus(id: string, status: LocalJobStatus): Promise<void>;
|
|
33
|
+
/** No automatic execution. Re-entering run() passes the last committed checkpoint. */
|
|
34
|
+
run<I = unknown, C = unknown, R = unknown>(id: string, handler: LocalJobHandler<I, C, R>, options?: {
|
|
35
|
+
signal?: AbortSignal;
|
|
36
|
+
}): Promise<LocalJob<I, C, R>>;
|
|
37
|
+
/** The same Web Lock excludes active SDK runners before recovery. */
|
|
38
|
+
recover(): Promise<number>;
|
|
39
|
+
}
|
|
40
|
+
export interface SyncOperation {
|
|
41
|
+
id: string;
|
|
42
|
+
kind: string;
|
|
43
|
+
payload: unknown;
|
|
44
|
+
status: 'pending' | 'running' | 'failed' | 'completed';
|
|
45
|
+
attempts: number;
|
|
46
|
+
updatedAt: number;
|
|
47
|
+
error: string | null;
|
|
48
|
+
}
|
|
49
|
+
export type SyncHandler = (payload: unknown, context: {
|
|
50
|
+
operationId: string;
|
|
51
|
+
signal: AbortSignal | undefined;
|
|
52
|
+
}) => Promise<void>;
|
|
53
|
+
/** At-least-once delivery. Handlers MUST enforce server idempotency using operationId. */
|
|
54
|
+
export declare class SyncQueue {
|
|
55
|
+
private readonly store;
|
|
56
|
+
constructor(store: OfflineStore);
|
|
57
|
+
enqueue(input: {
|
|
58
|
+
id: string;
|
|
59
|
+
kind: string;
|
|
60
|
+
payload: unknown;
|
|
61
|
+
idempotent: true;
|
|
62
|
+
}): Promise<SyncOperation>;
|
|
63
|
+
get(id: string): Promise<SyncOperation | null>;
|
|
64
|
+
list(options?: LocalPage): Promise<SyncOperation[]>;
|
|
65
|
+
private change;
|
|
66
|
+
retry(id: string): Promise<void>;
|
|
67
|
+
/** Explicit caller action; never triggered automatically by an online event. */
|
|
68
|
+
flush(handlers: Record<string, SyncHandler>, options?: {
|
|
69
|
+
signal?: AbortSignal;
|
|
70
|
+
limit?: number;
|
|
71
|
+
}): Promise<{
|
|
72
|
+
completed: number;
|
|
73
|
+
failed: number;
|
|
74
|
+
}>;
|
|
75
|
+
}
|
|
76
|
+
export declare function createLocalJobs(store: OfflineStore): LocalJobs;
|
|
77
|
+
export declare function createSyncQueue(store: OfflineStore): SyncQueue;
|
|
78
|
+
//# sourceMappingURL=jobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/offline/jobs.ts"],"names":[],"mappings":"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"}
|