@dxos/plugin-pwa 0.9.1-staging.ee54ba693a → 0.11.0
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/lib/PwaPlugin.mjs +100 -0
- package/dist/lib/PwaPlugin.mjs.map +1 -0
- package/dist/lib/{neutral/chunk-N6ICXF4W.mjs → chunk-meta.mjs} +13 -20
- package/dist/lib/chunk-meta.mjs.map +1 -0
- package/dist/lib/index.mjs +2 -0
- package/dist/lib/meta.mjs +2 -0
- package/dist/lib/plugin.mjs +8 -0
- package/dist/lib/plugin.mjs.map +1 -0
- package/dist/lib/translations.mjs +14 -0
- package/dist/lib/translations.mjs.map +1 -0
- package/dist/types/src/PwaPlugin.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +19 -19
- package/src/PwaPlugin.tsx +94 -2
- package/dist/lib/neutral/PwaPlugin.mjs +0 -77
- package/dist/lib/neutral/PwaPlugin.mjs.map +0 -7
- package/dist/lib/neutral/chunk-N6ICXF4W.mjs.map +0 -7
- package/dist/lib/neutral/index.mjs +0 -7
- package/dist/lib/neutral/index.mjs.map +0 -7
- package/dist/lib/neutral/meta.json +0 -1
- package/dist/lib/neutral/meta.mjs +0 -7
- package/dist/lib/neutral/meta.mjs.map +0 -7
- package/dist/lib/neutral/plugin.mjs +0 -11
- package/dist/lib/neutral/plugin.mjs.map +0 -7
- package/dist/lib/neutral/translations.mjs +0 -22
- package/dist/lib/neutral/translations.mjs.map +0 -7
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { ActivationEvent, ActivationEvents, Capabilities, Capability, Plugin } from "@dxos/app-framework";
|
|
2
|
+
import * as Duration from "effect/Duration";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import * as Fiber from "effect/Fiber";
|
|
5
|
+
import * as Predicate from "effect/Predicate";
|
|
6
|
+
import * as Schedule from "effect/Schedule";
|
|
7
|
+
import { registerSW } from "virtual:pwa-register";
|
|
8
|
+
import { AppActivationEvents, AppCapabilities, AppPlugin, LayoutOperation } from "@dxos/app-toolkit";
|
|
9
|
+
import { log } from "@dxos/log";
|
|
10
|
+
import { meta } from "#meta";
|
|
11
|
+
import { translations } from "#translations";
|
|
12
|
+
//#region src/PwaPlugin.tsx
|
|
13
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-pwa/src/PwaPlugin.tsx";
|
|
14
|
+
var UPDATE_CHECK_INTERVAL = Duration.hours(1);
|
|
15
|
+
/**
|
|
16
|
+
* Progress envelope posted by the host's service worker while it precaches a build. The contract is
|
|
17
|
+
* duplicated in `composer-app/src/sw.ts` so the worker bundle stays free of host code — keep in sync.
|
|
18
|
+
*/
|
|
19
|
+
var PRECACHE_PROGRESS = "dxos:precache-progress";
|
|
20
|
+
var isPrecacheProgress = (data) => Predicate.isRecord(data) && data.type === PRECACHE_PROGRESS;
|
|
21
|
+
var PwaPlugin = Plugin.define(meta).pipe(AppPlugin.addTranslationsModule({ translations }), Plugin.addModule({
|
|
22
|
+
id: "register-pwa",
|
|
23
|
+
activatesOn: ActivationEvents.ProcessManagerReady,
|
|
24
|
+
activate: Effect.fnUntraced(function* () {
|
|
25
|
+
const { invokePromise } = yield* Capability.get(Capabilities.OperationInvoker);
|
|
26
|
+
let registration;
|
|
27
|
+
const updateSW = registerSW({
|
|
28
|
+
onRegisteredSW: (_swUrl, swRegistration) => {
|
|
29
|
+
registration = swRegistration;
|
|
30
|
+
},
|
|
31
|
+
onNeedRefresh: () => {
|
|
32
|
+
invokePromise(LayoutOperation.AddToast, {
|
|
33
|
+
id: `${meta.profile.key}.need-refresh`,
|
|
34
|
+
title: ["need-refresh.label", { ns: meta.profile.key }],
|
|
35
|
+
description: ["need-refresh.description", { ns: meta.profile.key }],
|
|
36
|
+
duration: 240 * 1e3,
|
|
37
|
+
actionLabel: ["refresh.label", { ns: meta.profile.key }],
|
|
38
|
+
actionAlt: ["refresh.alt", { ns: meta.profile.key }],
|
|
39
|
+
onAction: () => updateSW(true)
|
|
40
|
+
});
|
|
41
|
+
},
|
|
42
|
+
onOfflineReady: () => {
|
|
43
|
+
invokePromise(LayoutOperation.AddToast, {
|
|
44
|
+
id: `${meta.profile.key}.offline-ready`,
|
|
45
|
+
title: ["offline-ready.label", { ns: meta.profile.key }],
|
|
46
|
+
closeLabel: ["confirm.label", { ns: meta.profile.key }]
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
onRegisterError: (err) => {
|
|
50
|
+
log.error(err, void 0, {
|
|
51
|
+
"~LogMeta": "~LogMeta",
|
|
52
|
+
F: __dxlog_file,
|
|
53
|
+
L: 71,
|
|
54
|
+
S: this
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
const fiber = yield* Effect.tryPromise(async () => {
|
|
59
|
+
await registration?.update();
|
|
60
|
+
}).pipe(Effect.catchAll((error) => Effect.sync(() => log.warn("service worker update check failed", { error }, {
|
|
61
|
+
"~LogMeta": "~LogMeta",
|
|
62
|
+
F: __dxlog_file,
|
|
63
|
+
L: 86,
|
|
64
|
+
S: this
|
|
65
|
+
})))).pipe(Effect.repeat(Schedule.fixed(UPDATE_CHECK_INTERVAL)), Effect.forkDaemon);
|
|
66
|
+
return Capability.contributes(Capabilities.Null, null, () => Fiber.interrupt(fiber));
|
|
67
|
+
})
|
|
68
|
+
}), Plugin.addModule({
|
|
69
|
+
id: "update-progress",
|
|
70
|
+
activatesOn: ActivationEvent.allOf(ActivationEvents.ProcessManagerReady, AppActivationEvents.ProgressRegistryReady),
|
|
71
|
+
activate: Effect.fnUntraced(function* () {
|
|
72
|
+
const registry = yield* Capability.get(AppCapabilities.ProgressRegistry);
|
|
73
|
+
let monitor;
|
|
74
|
+
const handleMessage = (event) => {
|
|
75
|
+
if (!isPrecacheProgress(event.data)) return;
|
|
76
|
+
const { current, total, isUpdate, done } = event.data;
|
|
77
|
+
if (done && !monitor) return;
|
|
78
|
+
monitor ??= registry.register(`${meta.profile.key}.precache`, {
|
|
79
|
+
label: isUpdate ? "Downloading app update" : "Preparing offline use",
|
|
80
|
+
total
|
|
81
|
+
});
|
|
82
|
+
monitor.total(total);
|
|
83
|
+
monitor.set(current);
|
|
84
|
+
if (done) {
|
|
85
|
+
monitor.done();
|
|
86
|
+
monitor.remove();
|
|
87
|
+
monitor = void 0;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
navigator.serviceWorker?.addEventListener("message", handleMessage);
|
|
91
|
+
return Capability.contributes(Capabilities.Null, null, () => Effect.sync(() => {
|
|
92
|
+
navigator.serviceWorker?.removeEventListener("message", handleMessage);
|
|
93
|
+
monitor?.remove();
|
|
94
|
+
}));
|
|
95
|
+
})
|
|
96
|
+
}), Plugin.make);
|
|
97
|
+
//#endregion
|
|
98
|
+
export { PwaPlugin, PwaPlugin as default };
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=PwaPlugin.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PwaPlugin.mjs","names":[],"sources":["../../src/PwaPlugin.tsx"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport * as Duration from 'effect/Duration';\nimport * as Effect from 'effect/Effect';\nimport * as Fiber from 'effect/Fiber';\nimport * as Predicate from 'effect/Predicate';\nimport * as Schedule from 'effect/Schedule';\nimport { registerSW } from 'virtual:pwa-register';\n\nimport { ActivationEvent, ActivationEvents, Capabilities, Capability, Plugin } from '@dxos/app-framework';\nimport { AppActivationEvents, AppCapabilities, AppPlugin, LayoutOperation } from '@dxos/app-toolkit';\nimport { log } from '@dxos/log';\n\nimport { meta } from '#meta';\nimport { translations } from '#translations';\n\nconst UPDATE_CHECK_INTERVAL = Duration.hours(1);\n\n/**\n * Progress envelope posted by the host's service worker while it precaches a build. The contract is\n * duplicated in `composer-app/src/sw.ts` so the worker bundle stays free of host code — keep in sync.\n */\nconst PRECACHE_PROGRESS = 'dxos:precache-progress';\n\ntype PrecacheProgress = {\n type: typeof PRECACHE_PROGRESS;\n current: number;\n total: number;\n isUpdate: boolean;\n done: boolean;\n};\n\nconst isPrecacheProgress = (data: unknown): data is PrecacheProgress =>\n Predicate.isRecord(data) && data.type === PRECACHE_PROGRESS;\n\nexport const PwaPlugin = Plugin.define(meta).pipe(\n AppPlugin.addTranslationsModule({ translations }),\n Plugin.addModule({\n id: 'register-pwa',\n activatesOn: ActivationEvents.ProcessManagerReady,\n activate: Effect.fnUntraced(function* () {\n const { invokePromise } = yield* Capability.get(Capabilities.OperationInvoker);\n\n let registration: ServiceWorkerRegistration | undefined;\n\n const updateSW = registerSW({\n onRegisteredSW: (_swUrl, swRegistration) => {\n registration = swRegistration;\n },\n onNeedRefresh: () => {\n void invokePromise(LayoutOperation.AddToast, {\n id: `${meta.profile.key}.need-refresh`,\n title: ['need-refresh.label', { ns: meta.profile.key }],\n description: ['need-refresh.description', { ns: meta.profile.key }],\n duration: 4 * 60 * 1000, // 4m\n actionLabel: ['refresh.label', { ns: meta.profile.key }],\n actionAlt: ['refresh.alt', { ns: meta.profile.key }],\n onAction: () => updateSW(true),\n });\n },\n onOfflineReady: () => {\n void invokePromise(LayoutOperation.AddToast, {\n id: `${meta.profile.key}.offline-ready`,\n title: ['offline-ready.label', { ns: meta.profile.key }],\n closeLabel: ['confirm.label', { ns: meta.profile.key }],\n });\n },\n onRegisterError: (err) => {\n log.error(err);\n },\n });\n\n // The browser only re-fetches the worker script on navigation, but Composer sessions stay open\n // for days, so without polling a deployed update is never noticed and the refresh toast only\n // ever appears on reload. `Effect.repeat` runs the first check straight away, before\n // `onRegisteredSW` has fired — the optional call makes that opening tick a no-op.\n //\n // `update()` rejects in its own right — `InvalidStateError` while a worker is already\n // installing, a `TypeError` when the script fetch fails offline — so the rejection is recovered\n // rather than left to `Effect.promise`, whose defect would kill the daemon fiber and silently\n // end polling for the rest of the session.\n const checkForUpdate = Effect.tryPromise(async () => {\n await registration?.update();\n }).pipe(Effect.catchAll((error) => Effect.sync(() => log.warn('service worker update check failed', { error }))));\n\n const fiber = yield* checkForUpdate.pipe(Effect.repeat(Schedule.fixed(UPDATE_CHECK_INTERVAL)), Effect.forkDaemon);\n\n // Return the interruption effect directly; Fiber.interrupt is async and would throw\n // AsyncFiberException if wrapped in Effect.runSync.\n return Capability.contributes(Capabilities.Null, null, () => Fiber.interrupt(fiber));\n }),\n }),\n // Separate from `register-pwa` so that an app without the progress registry still registers the\n // service worker — only the meter is lost, not the update flow itself.\n Plugin.addModule({\n id: 'update-progress',\n activatesOn: ActivationEvent.allOf(ActivationEvents.ProcessManagerReady, AppActivationEvents.ProgressRegistryReady),\n activate: Effect.fnUntraced(function* () {\n const registry = yield* Capability.get(AppCapabilities.ProgressRegistry);\n\n let monitor: AppCapabilities.ProgressMonitor | undefined;\n const handleMessage = (event: MessageEvent) => {\n if (!isPrecacheProgress(event.data)) {\n return;\n }\n\n const { current, total, isUpdate, done } = event.data;\n if (done && !monitor) {\n // Completion for a download this window never saw start — nothing to report.\n return;\n }\n\n monitor ??= registry.register(`${meta.profile.key}.precache`, {\n label: isUpdate ? 'Downloading app update' : 'Preparing offline use',\n total,\n });\n monitor.total(total);\n monitor.set(current);\n if (done) {\n monitor.done();\n // Transient monitor: the download is a one-shot, so drop it rather than leave a completed\n // row in the registry until the next reload.\n monitor.remove();\n monitor = undefined;\n }\n };\n\n navigator.serviceWorker?.addEventListener('message', handleMessage);\n\n return Capability.contributes(Capabilities.Null, null, () =>\n Effect.sync(() => {\n navigator.serviceWorker?.removeEventListener('message', handleMessage);\n monitor?.remove();\n }),\n );\n }),\n }),\n Plugin.make,\n);\n\nexport default PwaPlugin;\n"],"mappings":"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"}
|
|
@@ -1,28 +1,21 @@
|
|
|
1
|
-
// src/meta.ts
|
|
2
1
|
import { Plugin } from "@dxos/app-framework";
|
|
3
|
-
|
|
4
|
-
// dx.config.ts
|
|
5
2
|
import { Config2 } from "@dxos/app-framework/config";
|
|
6
3
|
import { trim } from "@dxos/util";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
4
|
+
//#region dx.config.ts
|
|
5
|
+
var dx_config_default = Config2.make({ plugin: {
|
|
6
|
+
key: "org.dxos.plugin.pwa",
|
|
7
|
+
name: "PWA",
|
|
8
|
+
author: "DXOS",
|
|
9
|
+
description: trim`
|
|
13
10
|
Progressive Web App capabilities enabling offline functionality and app-like experience.
|
|
14
11
|
Install to home screen and use the workspace without internet connection.
|
|
15
12
|
`,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
// src/meta.ts
|
|
13
|
+
tags: ["system"]
|
|
14
|
+
} });
|
|
15
|
+
//#endregion
|
|
16
|
+
//#region src/meta.ts
|
|
23
17
|
var meta = Plugin.getMetaFromConfig(dx_config_default);
|
|
18
|
+
//#endregion
|
|
19
|
+
export { meta as t };
|
|
24
20
|
|
|
25
|
-
|
|
26
|
-
meta
|
|
27
|
-
};
|
|
28
|
-
//# sourceMappingURL=chunk-N6ICXF4W.mjs.map
|
|
21
|
+
//# sourceMappingURL=chunk-meta.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-meta.mjs","names":[],"sources":["../../dx.config.ts","../../src/meta.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Config2 } from '@dxos/app-framework/config';\nimport { trim } from '@dxos/util';\n\nexport default Config2.make({\n plugin: {\n key: 'org.dxos.plugin.pwa',\n name: 'PWA',\n author: 'DXOS',\n description: trim`\n Progressive Web App capabilities enabling offline functionality and app-like experience.\n Install to home screen and use the workspace without internet connection.\n `,\n tags: ['system'],\n },\n});\n","//\n// Copyright 2023 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\n\nimport config from '../dx.config';\n\nexport const meta = Plugin.getMetaFromConfig(config);\n"],"mappings":";;;;AAOA,IAAA,oBAAe,QAAQ,KAAK,EAC1B,QAAQ;CACN,KAAK;CACL,MAAM;CACN,QAAQ;CACR,aAAa,IAAI;;;;CAIjB,MAAM,CAAC,QAAQ;AACjB,EACF,CAAC;;;ACVD,IAAa,OAAO,OAAO,kBAAkB,iBAAM"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.mjs","names":[],"sources":["../../src/plugin.ts"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\n\nimport { meta } from './meta';\n\nexport const PwaPlugin = Plugin.lazy(meta, () => import('#plugin'));\n"],"mappings":";;;AAQA,IAAa,YAAY,OAAO,KAAK,YAAY,OAAO,UAAU"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { meta } from "#meta";
|
|
2
|
+
//#region src/translations.ts
|
|
3
|
+
var translations = [{ "en-US": { [meta.profile.key]: {
|
|
4
|
+
"need-refresh.label": "Refresh now to get app updates",
|
|
5
|
+
"need-refresh.description": "You’ll need these updates to continue without interruption.",
|
|
6
|
+
"refresh.label": "Refresh",
|
|
7
|
+
"refresh.alt": "Click your browser’s refresh button or use the refresh keyboard shortcut.",
|
|
8
|
+
"offline-ready.label": "Ready to use offline.",
|
|
9
|
+
"confirm.label": "Okay"
|
|
10
|
+
} } }];
|
|
11
|
+
//#endregion
|
|
12
|
+
export { translations };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=translations.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translations.mjs","names":[],"sources":["../../src/translations.ts"],"sourcesContent":["//\n// Copyright 2022 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nimport { meta } from '#meta';\n\nexport const translations = [\n {\n 'en-US': {\n [meta.profile.key]: {\n 'need-refresh.label': 'Refresh now to get app updates',\n 'need-refresh.description': 'You’ll need these updates to continue without interruption.',\n 'refresh.label': 'Refresh',\n 'refresh.alt': 'Click your browser’s refresh button or use the refresh keyboard shortcut.',\n // TODO(wittjosiah): Non-react translation utils.\n // 'offline ready label': '{{appName}} is ready to use offline.',\n 'offline-ready.label': 'Ready to use offline.',\n 'confirm.label': 'Okay',\n },\n },\n },\n] as const satisfies Resource[];\n"],"mappings":";;AAQA,IAAa,eAAe,CAC1B,EACE,SAAS,GACN,KAAK,QAAQ,MAAM;CAClB,sBAAsB;CACtB,4BAA4B;CAC5B,iBAAiB;CACjB,eAAe;CAGf,uBAAuB;CACvB,iBAAiB;AACnB,EACF,EACF,CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PwaPlugin.d.ts","sourceRoot":"","sources":["../../../src/PwaPlugin.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PwaPlugin.d.ts","sourceRoot":"","sources":["../../../src/PwaPlugin.tsx"],"names":[],"mappings":"AAWA,OAAO,EAA+D,MAAM,EAAE,MAAM,qBAAqB,CAAC;AA0B1G,eAAO,MAAM,SAAS,4BAuGrB,CAAC;eAEa,SAAS"}
|