@openmrs/esm-app-shell 10.0.1-pre.5539 → 10.0.1-pre.5545
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/.tmp/{openmrs.fec39e8b2462a601.css → openmrs.2366f8911cecaf0f.css} +1 -1
- package/.tmp/openmrs.css +0 -11
- package/.turbo/turbo-build.log +5 -6
- package/dependencies.json +0 -1
- package/dist/{0c3ec589b00659cd.js → 031753d072f15c69.js} +1 -1
- package/dist/031753d072f15c69.js.map +1 -0
- package/dist/04d8feb9d4359f1f.js +1 -0
- package/dist/04d8feb9d4359f1f.js.map +1 -0
- package/dist/05ce2d37a1daa834.js +1 -0
- package/dist/05ce2d37a1daa834.js.map +1 -0
- package/dist/0b75e238cac98eec.js +1 -0
- package/dist/0b75e238cac98eec.js.map +1 -0
- package/dist/282cf17f6e5687b8.js +1 -0
- package/dist/282cf17f6e5687b8.js.map +1 -0
- package/dist/2920145641c09c4d.js +1 -0
- package/dist/2920145641c09c4d.js.map +1 -0
- package/dist/2dff1a92bc9a2725.js +1 -0
- package/dist/{58b422bb3e2b709e.js.map → 2dff1a92bc9a2725.js.map} +1 -1
- package/dist/2fc836ab8d68dc12.js +1 -0
- package/dist/2fc836ab8d68dc12.js.map +1 -0
- package/dist/3136dd8643999f24.js +1 -0
- package/dist/3136dd8643999f24.js.map +1 -0
- package/dist/3d04297932795708.js +1 -0
- package/dist/3d04297932795708.js.map +1 -0
- package/dist/3df1988d05952ad7.js +1 -0
- package/dist/{28b2d84b9ba8a17b.js.map → 3df1988d05952ad7.js.map} +1 -1
- package/dist/3eef8e80f11ca9b4.js +1 -0
- package/dist/3eef8e80f11ca9b4.js.map +1 -0
- package/dist/4599bd0a9024d405.js +1 -0
- package/dist/4599bd0a9024d405.js.map +1 -0
- package/dist/4fc488cad7664f2c.js +1 -0
- package/dist/4fc488cad7664f2c.js.map +1 -0
- package/dist/54875ca06e6fafcd.js +1 -0
- package/dist/{60b81b0c3de3dbcc.js.map → 54875ca06e6fafcd.js.map} +1 -1
- package/dist/561eaf8f6d79fb62.js +1 -0
- package/dist/{3626ab9863946c7b.js.map → 561eaf8f6d79fb62.js.map} +1 -1
- package/dist/5c14561b268aef46.js +1 -0
- package/dist/5c14561b268aef46.js.map +1 -0
- package/dist/5fed09e37d18c002.js +1 -0
- package/dist/{c7ee0af570bf55cb.js.map → 5fed09e37d18c002.js.map} +1 -1
- package/dist/61f48522baa4d4fc.js +1 -0
- package/dist/61f48522baa4d4fc.js.map +1 -0
- package/dist/627c504a8c682995.js +1 -0
- package/dist/{38500563dff47fc6.js.map → 627c504a8c682995.js.map} +1 -1
- package/dist/65e56db2b03f1d2e.js +1 -0
- package/dist/{f3f7ba7a281d137f.js.map → 65e56db2b03f1d2e.js.map} +1 -1
- package/dist/666fc7daf32c11ca.js +1 -0
- package/dist/{4f25fabfbd242652.js.map → 666fc7daf32c11ca.js.map} +1 -1
- package/dist/75bb42fe7c9c7b77.js +1 -0
- package/dist/75bb42fe7c9c7b77.js.map +1 -0
- package/dist/7cf228c10c916060.js +1 -0
- package/dist/7cf228c10c916060.js.map +1 -0
- package/dist/7e61cf61f0fd8435.js +1 -0
- package/dist/7e61cf61f0fd8435.js.map +1 -0
- package/dist/7e94e985736f6433.js +15 -0
- package/dist/7e94e985736f6433.js.map +1 -0
- package/dist/8663374972b63dd0.js +1 -0
- package/dist/8663374972b63dd0.js.map +1 -0
- package/dist/8b339a4472d42390.js +1 -0
- package/dist/8b339a4472d42390.js.map +1 -0
- package/dist/8bd7e7d4a78b3f5d.js +1 -0
- package/dist/8bd7e7d4a78b3f5d.js.map +1 -0
- package/dist/925df42b4aad54ef.js +1 -0
- package/dist/925df42b4aad54ef.js.map +1 -0
- package/dist/92e934ed6a294b48.js +1 -0
- package/dist/92e934ed6a294b48.js.map +1 -0
- package/dist/94db08c37d74f8e6.js +1 -0
- package/dist/94db08c37d74f8e6.js.map +1 -0
- package/dist/988a6152aee0a71f.js +1 -0
- package/dist/{59811cc6672f3c5e.js.map → 988a6152aee0a71f.js.map} +1 -1
- package/dist/9d8d56053913ece7.js +1 -0
- package/dist/{98fa549e4698bac2.js.map → 9d8d56053913ece7.js.map} +1 -1
- package/dist/a320cc5ebbd578aa.js +1 -0
- package/dist/a320cc5ebbd578aa.js.map +1 -0
- package/dist/a67e6d658966fc03.js +1 -0
- package/dist/{5c5d30b9ce092a45.js.map → a67e6d658966fc03.js.map} +1 -1
- package/dist/a7c6cc5f7d5df3cc.js +1 -0
- package/dist/a7c6cc5f7d5df3cc.js.map +1 -0
- package/dist/a8b748cc933a856d.js +1 -0
- package/dist/{a59e93981b163fef.js.map → a8b748cc933a856d.js.map} +1 -1
- package/dist/ac55fdfb68fa02c5.js +1 -0
- package/dist/ac55fdfb68fa02c5.js.map +1 -0
- package/dist/b3ecca387afbe8fa.js +1 -0
- package/dist/b3ecca387afbe8fa.js.map +1 -0
- package/dist/b5620e973d75fba0.js +1 -0
- package/dist/{7bc873dea9adb0c9.js.map → b5620e973d75fba0.js.map} +1 -1
- package/dist/b846dbad2099678e.js +1 -0
- package/dist/b846dbad2099678e.js.map +1 -0
- package/dist/b8c6d524119f74b4.js +1 -0
- package/dist/{e33d524c1897be67.js.map → b8c6d524119f74b4.js.map} +1 -1
- package/dist/bc45832208db8c5c.js +1 -0
- package/dist/{404d8a9d76a18add.js.map → bc45832208db8c5c.js.map} +1 -1
- package/dist/bde5b3201c26a9c0.js +1 -0
- package/dist/bde5b3201c26a9c0.js.map +1 -0
- package/dist/bf576f8339d92b26.js +1 -0
- package/dist/bf576f8339d92b26.js.map +1 -0
- package/dist/c1a327d747ff700c.js +1 -0
- package/dist/{00781fd40b42efd3.js.map → c1a327d747ff700c.js.map} +1 -1
- package/dist/c33a07a92b70a5fa.js +1 -0
- package/dist/c33a07a92b70a5fa.js.map +1 -0
- package/dist/c6dfbd6a0ee16e37.js +1 -0
- package/dist/c6dfbd6a0ee16e37.js.map +1 -0
- package/dist/c7304711c5bc39f8.js +1 -0
- package/dist/{6787ee9c921c765c.js.map → c7304711c5bc39f8.js.map} +1 -1
- package/dist/c9aff7676587de31.js +1 -0
- package/dist/c9aff7676587de31.js.map +1 -0
- package/dist/cc98f9787ffe3fe3.js +1 -0
- package/dist/cc98f9787ffe3fe3.js.map +1 -0
- package/dist/d08b0fa3251554b6.js +1 -0
- package/dist/d08b0fa3251554b6.js.map +1 -0
- package/dist/d6b0bcfd133f4976.js +1 -0
- package/dist/d6b0bcfd133f4976.js.map +1 -0
- package/dist/db6c5d1e99754082.js +1 -0
- package/dist/{5df0e0969c582637.js.map → db6c5d1e99754082.js.map} +1 -1
- package/dist/de0a68fd6cd85a4a.js +1 -0
- package/dist/{a3a573a33ba2d559.js.map → de0a68fd6cd85a4a.js.map} +1 -1
- package/dist/e8f9c5e0127b55b9.js +1 -0
- package/dist/e8f9c5e0127b55b9.js.map +1 -0
- package/dist/ec2f5f7b8f850190.js +1 -0
- package/dist/ec2f5f7b8f850190.js.map +1 -0
- package/dist/edaba5b3f7d26709.js +1 -0
- package/dist/edaba5b3f7d26709.js.map +1 -0
- package/dist/f30c8750c306425c.js +32 -0
- package/dist/f30c8750c306425c.js.map +1 -0
- package/dist/f49125616d97a3ff.js +1 -0
- package/dist/f49125616d97a3ff.js.map +1 -0
- package/dist/index.html +1 -2
- package/dist/{openmrs.fec39e8b2462a601.css → openmrs.2366f8911cecaf0f.css} +1 -1
- package/dist/openmrs.73b95dcb8ed93fe6.js +8 -0
- package/dist/openmrs.73b95dcb8ed93fe6.js.map +1 -0
- package/lib/{36af6fd3e29fff87.js → 4afcde165187cf34.js} +1 -5
- package/lib/{9585b7e8fd13cf44.js → e33a7cd5a9ebb90f.js} +39 -1144
- package/lib/{46f6744c9bdc7ce1.js → f865020c91218e5f.js} +3 -3
- package/lib/index.html +0 -1
- package/lib/openmrs.css +0 -11
- package/lib/openmrs.js +7 -7
- package/package.json +7 -9
- package/rspack.config.js +0 -3
- package/src/events.test.ts +36 -29
- package/src/events.ts +11 -8
- package/src/index.ejs +0 -1
- package/src/index.ts +1 -6
- package/src/optionaldeps.ts +1 -1
- package/src/run.ts +1 -127
- package/dist/00781fd40b42efd3.js +0 -1
- package/dist/013da7b545f9b832.js +0 -1
- package/dist/013da7b545f9b832.js.map +0 -1
- package/dist/03aa011e42235226.js +0 -1
- package/dist/03aa011e42235226.js.map +0 -1
- package/dist/0c3ec589b00659cd.js.map +0 -1
- package/dist/14cab659fd85b863.js +0 -1
- package/dist/14cab659fd85b863.js.map +0 -1
- package/dist/17af628ac569a1f2.js +0 -1
- package/dist/17af628ac569a1f2.js.map +0 -1
- package/dist/1c79b5f63ceb5f34.js +0 -1
- package/dist/1c79b5f63ceb5f34.js.map +0 -1
- package/dist/205f194d86e5ac67.js +0 -1
- package/dist/205f194d86e5ac67.js.map +0 -1
- package/dist/2193b26fed11886c.js +0 -1
- package/dist/2193b26fed11886c.js.map +0 -1
- package/dist/27bbc85bbabee1a5.js +0 -1
- package/dist/27bbc85bbabee1a5.js.map +0 -1
- package/dist/28b2d84b9ba8a17b.js +0 -1
- package/dist/32623ec20d67b16e.js +0 -1
- package/dist/32623ec20d67b16e.js.map +0 -1
- package/dist/3626ab9863946c7b.js +0 -1
- package/dist/38500563dff47fc6.js +0 -1
- package/dist/3c26a553b5db1c11.js +0 -1
- package/dist/3c26a553b5db1c11.js.map +0 -1
- package/dist/3eecc04b32da713c.js +0 -1
- package/dist/3eecc04b32da713c.js.map +0 -1
- package/dist/404d8a9d76a18add.js +0 -1
- package/dist/4487667604ad6f7b.js +0 -1
- package/dist/4487667604ad6f7b.js.map +0 -1
- package/dist/47bd06b70fa65c4f.js +0 -1
- package/dist/47bd06b70fa65c4f.js.map +0 -1
- package/dist/48dcf82a03f07687.js +0 -1
- package/dist/48dcf82a03f07687.js.map +0 -1
- package/dist/4d8f12edc7efe373.js +0 -1
- package/dist/4d8f12edc7efe373.js.map +0 -1
- package/dist/4f25fabfbd242652.js +0 -1
- package/dist/5120f4771ea4fb54.js +0 -1
- package/dist/5120f4771ea4fb54.js.map +0 -1
- package/dist/557ef6dd5c99796c.js +0 -1
- package/dist/557ef6dd5c99796c.js.map +0 -1
- package/dist/57d3240a2dc16b0d.js +0 -15
- package/dist/57d3240a2dc16b0d.js.map +0 -1
- package/dist/58b422bb3e2b709e.js +0 -1
- package/dist/59811cc6672f3c5e.js +0 -1
- package/dist/5c5d30b9ce092a45.js +0 -1
- package/dist/5df0e0969c582637.js +0 -1
- package/dist/60b81b0c3de3dbcc.js +0 -1
- package/dist/616b2aedcab751be.js +0 -1
- package/dist/616b2aedcab751be.js.map +0 -1
- package/dist/61b616c98ab0405a.js +0 -1
- package/dist/61b616c98ab0405a.js.map +0 -1
- package/dist/6787ee9c921c765c.js +0 -1
- package/dist/698e7aab19095311.js +0 -1
- package/dist/698e7aab19095311.js.map +0 -1
- package/dist/6cd82326717c86ed.js +0 -1
- package/dist/6cd82326717c86ed.js.map +0 -1
- package/dist/724db602f85d13fd.js +0 -1
- package/dist/724db602f85d13fd.js.map +0 -1
- package/dist/78d0228dbe6555c1.js +0 -1
- package/dist/78d0228dbe6555c1.js.map +0 -1
- package/dist/79985e1be7b11090.js +0 -1
- package/dist/79985e1be7b11090.js.map +0 -1
- package/dist/7bc873dea9adb0c9.js +0 -1
- package/dist/820d3a7f53689510.js +0 -32
- package/dist/820d3a7f53689510.js.map +0 -1
- package/dist/87fe0aee69d5a4ad.js +0 -1
- package/dist/87fe0aee69d5a4ad.js.map +0 -1
- package/dist/895f33fe88ab78c6.js +0 -1
- package/dist/895f33fe88ab78c6.js.map +0 -1
- package/dist/8f913fa8d380ebae.js +0 -1
- package/dist/8f913fa8d380ebae.js.map +0 -1
- package/dist/98fa549e4698bac2.js +0 -1
- package/dist/9b71fd53d6597470.js +0 -1
- package/dist/9b71fd53d6597470.js.map +0 -1
- package/dist/9ca23c5ecfdf0b6a.js +0 -1
- package/dist/9ca23c5ecfdf0b6a.js.map +0 -1
- package/dist/a3a573a33ba2d559.js +0 -1
- package/dist/a59e93981b163fef.js +0 -1
- package/dist/a71261b407223792.js +0 -1
- package/dist/a71261b407223792.js.map +0 -1
- package/dist/b1a08d9f518cb48c.js +0 -1
- package/dist/b1a08d9f518cb48c.js.map +0 -1
- package/dist/b3536c459d989096.js +0 -1
- package/dist/b3536c459d989096.js.map +0 -1
- package/dist/b80022326e66d4dd.js +0 -1
- package/dist/b80022326e66d4dd.js.map +0 -1
- package/dist/c0b0b589e927e230.js +0 -1
- package/dist/c0b0b589e927e230.js.map +0 -1
- package/dist/c6f3e7b121439a5d.js +0 -1
- package/dist/c6f3e7b121439a5d.js.map +0 -1
- package/dist/c7ee0af570bf55cb.js +0 -1
- package/dist/ca024710e6f87fbc.js +0 -1
- package/dist/ca024710e6f87fbc.js.map +0 -1
- package/dist/cf39cc1e9ef3d2cd.js +0 -1
- package/dist/cf39cc1e9ef3d2cd.js.map +0 -1
- package/dist/d0374d830553d3ad.js +0 -1
- package/dist/d0374d830553d3ad.js.map +0 -1
- package/dist/d20e6ba912862835.js +0 -1
- package/dist/d20e6ba912862835.js.map +0 -1
- package/dist/e33d524c1897be67.js +0 -1
- package/dist/eb9b3b579b6cf027.js +0 -1
- package/dist/eb9b3b579b6cf027.js.map +0 -1
- package/dist/f3f7ba7a281d137f.js +0 -1
- package/dist/f4e99831687680e7.js +0 -1
- package/dist/f4e99831687680e7.js.map +0 -1
- package/dist/openmrs.8d68b614f8a43669.js +0 -8
- package/dist/openmrs.8d68b614f8a43669.js.map +0 -1
- package/lib/3486b148a0446829.js +0 -336
- package/lib/3847735de5f0c8c6.js +0 -84
- package/src/service-worker/caching.ts +0 -95
- package/src/service-worker/constants.ts +0 -19
- package/src/service-worker/http-header-utils.ts +0 -29
- package/src/service-worker/import-map-utils.ts +0 -65
- package/src/service-worker/index.ts +0 -27
- package/src/service-worker/message.ts +0 -93
- package/src/service-worker/noop.ts +0 -27
- package/src/service-worker/routing.ts +0 -113
- package/src/service-worker/storage.ts +0 -37
- package/src/service-worker/types.ts +0 -21
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
MessageServiceWorkerResult,
|
|
3
|
-
OnImportMapChangedMessage,
|
|
4
|
-
RegisterDynamicRouteMessage,
|
|
5
|
-
} from '@openmrs/esm-offline';
|
|
6
|
-
import escapeRegExp from 'lodash-es/escapeRegExp';
|
|
7
|
-
import { cacheImportMapReferences } from './caching';
|
|
8
|
-
import type { DynamicRouteRegistration } from './storage';
|
|
9
|
-
import { ServiceWorkerDb } from './storage';
|
|
10
|
-
|
|
11
|
-
const messageHandlers = {
|
|
12
|
-
onImportMapChanged,
|
|
13
|
-
clearDynamicRoutes,
|
|
14
|
-
registerDynamicRoute,
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
async function onImportMapChanged({ importMap }: OnImportMapChangedMessage) {
|
|
18
|
-
await cacheImportMapReferences(importMap);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
async function clearDynamicRoutes() {
|
|
22
|
-
await new ServiceWorkerDb().dynamicRouteRegistrations.clear();
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
async function registerDynamicRoute({ pattern, url, strategy }: RegisterDynamicRouteMessage) {
|
|
26
|
-
let finalPattern = pattern;
|
|
27
|
-
if (!finalPattern && url) {
|
|
28
|
-
finalPattern = `^${escapeRegExp(url)}$`;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
if (finalPattern) {
|
|
32
|
-
const registration: DynamicRouteRegistration = {
|
|
33
|
-
pattern: finalPattern,
|
|
34
|
-
strategy,
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
await new ServiceWorkerDb().dynamicRouteRegistrations.put(registration);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Invoked when the service worker receives a message.
|
|
43
|
-
* Matches the message to a handler, invokes that handler and dispatches the result returned
|
|
44
|
-
* by the handler back to the window.
|
|
45
|
-
*
|
|
46
|
-
* For this to work, the message needs to have a defined format.
|
|
47
|
-
* @param event The event data containing the message dispatched to the Service Worker.
|
|
48
|
-
*/
|
|
49
|
-
export async function handleMessage(event: ExtendableMessageEvent) {
|
|
50
|
-
// Defense-in-depth: only process messages from same-origin Client sources.
|
|
51
|
-
// Reject messages with no source or from cross-origin sources.
|
|
52
|
-
if (!event.source || !('url' in event.source)) {
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
let sourceOrigin: string;
|
|
56
|
-
try {
|
|
57
|
-
sourceOrigin = new URL(event.source.url).origin;
|
|
58
|
-
} catch {
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
if (sourceOrigin !== self.location.origin) {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const handler = messageHandlers[event.data?.type?.toString() ?? ''];
|
|
66
|
-
|
|
67
|
-
if (!handler) {
|
|
68
|
-
fail(`Received an unknown message of type "${event.data?.type} which cannot be handled.`);
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
try {
|
|
73
|
-
const result = await handler(event.data);
|
|
74
|
-
resolve({
|
|
75
|
-
success: true,
|
|
76
|
-
result,
|
|
77
|
-
});
|
|
78
|
-
} catch (e) {
|
|
79
|
-
fail(e?.message ?? e?.toString() ?? 'Unknown error.');
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function fail(error: string) {
|
|
83
|
-
console.warn('[SW] Handling a message resulted in an error.', error);
|
|
84
|
-
resolve({
|
|
85
|
-
success: false,
|
|
86
|
-
error,
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
function resolve<T>(result: MessageServiceWorkerResult<T>) {
|
|
91
|
-
event.ports[0].postMessage(result ?? {});
|
|
92
|
-
}
|
|
93
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
self.__WB_DISABLE_DEV_LOGS = true;
|
|
2
|
-
const wbManifest = self.__WB_MANIFEST;
|
|
3
|
-
|
|
4
|
-
self.addEventListener('message', () => {});
|
|
5
|
-
|
|
6
|
-
self.addEventListener('install', () => {
|
|
7
|
-
// Skip over the "waiting" lifecycle state, to ensure that our
|
|
8
|
-
// new service worker is activated immediately, even if there's
|
|
9
|
-
// another tab open controlled by our older service worker code.
|
|
10
|
-
self.skipWaiting();
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
self.addEventListener('activate', () => {
|
|
14
|
-
// Optional: Get a list of all the current open windows/tabs under
|
|
15
|
-
// our service worker's control, and force them to reload.
|
|
16
|
-
// This can "unbreak" any open windows/tabs as soon as the new
|
|
17
|
-
// service worker activates, rather than users having to manually reload.
|
|
18
|
-
self.clients
|
|
19
|
-
.matchAll({
|
|
20
|
-
type: 'window',
|
|
21
|
-
})
|
|
22
|
-
.then((windowClients) => {
|
|
23
|
-
windowClients.forEach((windowClient) => {
|
|
24
|
-
windowClient.navigate(windowClient.url);
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
});
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import type { RouteHandlerCallbackOptions } from 'workbox-core';
|
|
2
|
-
import { registerRoute } from 'workbox-routing';
|
|
3
|
-
import { getOrCreateDefaultRouter } from 'workbox-routing/utils/getOrCreateDefaultRouter';
|
|
4
|
-
import { validMethods } from 'workbox-routing/utils/constants';
|
|
5
|
-
import { CacheOnly, NetworkFirst, NetworkOnly } from 'workbox-strategies';
|
|
6
|
-
import { indexUrl, omrsCacheName, omrsOfflineCachingStrategyHttpHeaderName } from './constants';
|
|
7
|
-
import { ServiceWorkerDb } from './storage';
|
|
8
|
-
import {
|
|
9
|
-
getOmrsHeader,
|
|
10
|
-
parseOmrsOfflineResponseBodyHeader,
|
|
11
|
-
parseOmrsOfflineResponseStatusHeader,
|
|
12
|
-
} from './http-header-utils';
|
|
13
|
-
import type { OmrsOfflineCachingStrategy } from '@openmrs/esm-offline';
|
|
14
|
-
import uniq from 'lodash-es/uniq';
|
|
15
|
-
|
|
16
|
-
const networkOnly = new NetworkOnly();
|
|
17
|
-
const cacheOnly = new CacheOnly({ cacheName: omrsCacheName });
|
|
18
|
-
const networkFirst = new NetworkFirst({ cacheName: omrsCacheName });
|
|
19
|
-
|
|
20
|
-
const defaultStrategy: OmrsOfflineCachingStrategy = 'network-only-or-cache-only';
|
|
21
|
-
const knownStrategyHandlers: Record<
|
|
22
|
-
OmrsOfflineCachingStrategy,
|
|
23
|
-
(options: RouteHandlerCallbackOptions) => Promise<Response>
|
|
24
|
-
> = {
|
|
25
|
-
['network-first']: (options) => networkFirst.handle(options),
|
|
26
|
-
['network-only-or-cache-only']: async (options: RouteHandlerCallbackOptions) => {
|
|
27
|
-
try {
|
|
28
|
-
return await networkOnly.handle(options);
|
|
29
|
-
} catch (e) {
|
|
30
|
-
return await cacheOnly.handle(options);
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Registers required Workbox routes used by the service worker to provide offline functionality.
|
|
37
|
-
*/
|
|
38
|
-
export function registerAllOmrsRoutes() {
|
|
39
|
-
// Navigation requests are, when unresolvable via network (i.e. when offline), routed back
|
|
40
|
-
// to the SPA's index (which should always be precached).
|
|
41
|
-
// This ensures that the page loads correctly when a new navigation occurs to pages
|
|
42
|
-
// like `/openmrs/spa/anything/nested`.
|
|
43
|
-
registerRoute(({ request }) => request.mode === 'navigate', navigationHandler);
|
|
44
|
-
|
|
45
|
-
// Fallback routing behavior.
|
|
46
|
-
// Checks if a dynamic route registration exists and, if so, handles it using a Network First approach.
|
|
47
|
-
// Otherwise falls back to a NetworkOnly - CacheOnly behavior.
|
|
48
|
-
//
|
|
49
|
-
// The latter ensures that:
|
|
50
|
-
// a) precached files (like the app shell and files resolved from the importmap) are returned when offline.
|
|
51
|
-
// b) anything else (e.g. API requests) is not cached.
|
|
52
|
-
const router = getOrCreateDefaultRouter();
|
|
53
|
-
for (const method of validMethods) {
|
|
54
|
-
router.setDefaultHandler(defaultHandler, method);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
async function navigationHandler(options: RouteHandlerCallbackOptions) {
|
|
59
|
-
try {
|
|
60
|
-
return await networkOnly.handle(options);
|
|
61
|
-
} catch (e) {
|
|
62
|
-
const cache = await caches.open(omrsCacheName);
|
|
63
|
-
const response = await cache.match(indexUrl);
|
|
64
|
-
return response ?? Response.error();
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
async function defaultHandler(options: RouteHandlerCallbackOptions) {
|
|
69
|
-
const { request } = options;
|
|
70
|
-
const handlerKey = options.request.method === 'GET' ? await getHandlerKey(options) : defaultStrategy;
|
|
71
|
-
const handler = knownStrategyHandlers[handlerKey] ?? knownStrategyHandlers[defaultStrategy];
|
|
72
|
-
|
|
73
|
-
try {
|
|
74
|
-
return await handler(options);
|
|
75
|
-
} catch (e) {
|
|
76
|
-
console.warn('[SW] Could not handle the request to %s (using handler %s).', request.url, handlerKey, e);
|
|
77
|
-
|
|
78
|
-
return new Response(parseOmrsOfflineResponseBodyHeader(request.headers), {
|
|
79
|
-
status: parseOmrsOfflineResponseStatusHeader(request.headers),
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
async function getHandlerKey({ request }: RouteHandlerCallbackOptions) {
|
|
85
|
-
return getHandlerKeyFromHeaders(request.headers) ?? (await getHandlerKeyFromDynamicRouteRegistrations(request.url));
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function getHandlerKeyFromHeaders(headers: Headers) {
|
|
89
|
-
return getOmrsHeader(headers, omrsOfflineCachingStrategyHttpHeaderName);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
async function getHandlerKeyFromDynamicRouteRegistrations(url: string) {
|
|
93
|
-
const db = new ServiceWorkerDb();
|
|
94
|
-
const allDynamicRouteRegistrations = await db.dynamicRouteRegistrations.toArray();
|
|
95
|
-
const strategies = uniq(
|
|
96
|
-
allDynamicRouteRegistrations
|
|
97
|
-
.filter((route) => new RegExp(route.pattern).test(url))
|
|
98
|
-
.map((route) => route.strategy ?? 'network-first'),
|
|
99
|
-
);
|
|
100
|
-
|
|
101
|
-
if (strategies.length <= 1) {
|
|
102
|
-
return strategies[0];
|
|
103
|
-
} else {
|
|
104
|
-
// Multiple routes can match the URL (multiple RegExps can match).
|
|
105
|
-
// In that case, prioritize the available strategies. When in doubt, cache the resource again.
|
|
106
|
-
const priorities: Array<OmrsOfflineCachingStrategy> = ['network-first', 'network-only-or-cache-only'];
|
|
107
|
-
|
|
108
|
-
return (
|
|
109
|
-
priorities.find((prioritizedStrategy) => strategies.some((strategy) => strategy === prioritizedStrategy)) ??
|
|
110
|
-
defaultStrategy
|
|
111
|
-
);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import type { OmrsOfflineCachingStrategy } from '@openmrs/esm-offline';
|
|
2
|
-
import type { Table } from 'dexie';
|
|
3
|
-
import Dexie from 'dexie';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Contains information about dynamic route registrations.
|
|
7
|
-
* Dynamic route registrations are routes which should be kept in the cache,
|
|
8
|
-
* but are not by default known by the Service Worker.
|
|
9
|
-
* They are typically registerd by the the window/app at runtime as soon as they are known.
|
|
10
|
-
*/
|
|
11
|
-
export interface DynamicRouteRegistration {
|
|
12
|
-
/**
|
|
13
|
-
* A regular expression which matches against a URL.
|
|
14
|
-
* If it matches, the URL should be cached using the `strategy`.
|
|
15
|
-
*/
|
|
16
|
-
pattern: string;
|
|
17
|
-
/**
|
|
18
|
-
* The caching strategy to be used for caching matching URLs.
|
|
19
|
-
* Due to historical reasons, this value might be missing.
|
|
20
|
-
* In such cases, `network-first` should be assumed (the historical default).
|
|
21
|
-
*/
|
|
22
|
-
strategy?: OmrsOfflineCachingStrategy;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Provides access to persistent data used by the Service Worker.
|
|
27
|
-
*/
|
|
28
|
-
export class ServiceWorkerDb extends Dexie {
|
|
29
|
-
dynamicRouteRegistrations: Table<DynamicRouteRegistration, number>;
|
|
30
|
-
|
|
31
|
-
constructor() {
|
|
32
|
-
super('ServiceWorker');
|
|
33
|
-
this.version(1).stores({ dynamicRouteRegistrations: '++,&pattern' });
|
|
34
|
-
|
|
35
|
-
this.dynamicRouteRegistrations = this.table('dynamicRouteRegistrations');
|
|
36
|
-
}
|
|
37
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { PrecacheEntry } from 'workbox-precaching/_types';
|
|
2
|
-
|
|
3
|
-
// Globals injected by Workbox at build time.
|
|
4
|
-
declare global {
|
|
5
|
-
interface Window {
|
|
6
|
-
__WB_MANIFEST: Array<PrecacheEntry>;
|
|
7
|
-
__WB_DISABLE_DEV_LOGS: boolean;
|
|
8
|
-
clients: Clients;
|
|
9
|
-
skipWaiting(): void;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* The expected structure of a build manifest of MFs which can, by resolved via the app's import map.
|
|
15
|
-
* The manifest contains URLs to files which should be cached in order to provide offline support.
|
|
16
|
-
*/
|
|
17
|
-
export interface BuildManifest {
|
|
18
|
-
chunks?: Array<{
|
|
19
|
-
files?: Array<string>;
|
|
20
|
-
}>;
|
|
21
|
-
}
|