@serwist/sw 9.0.0-preview.19 → 9.0.0-preview.20
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/abstractions/Serwist.d.ts +5 -7
- package/dist/abstractions/Serwist.d.ts.map +1 -1
- package/dist/chunks/NavigationRoute.js +1 -1
- package/dist/chunks/PrecacheFallbackPlugin.js +9 -9
- package/dist/chunks/precacheAndRoute.js +6 -5
- package/dist/chunks/registerRoute.js +3 -404
- package/dist/chunks/{getOrCreatePrecacheController.js → singletonPrecacheController.js} +10 -6
- package/dist/chunks/singletonRouter.js +435 -0
- package/dist/index.js +8 -7
- package/dist/index.plugins.js +2 -2
- package/dist/index.precaching.d.ts +2 -1
- package/dist/index.precaching.d.ts.map +1 -1
- package/dist/index.precaching.js +7 -7
- package/dist/index.routing.d.ts +3 -1
- package/dist/index.routing.d.ts.map +1 -1
- package/dist/index.routing.js +7 -9
- package/dist/plugins/googleAnalytics/initialize.d.ts +9 -1
- package/dist/plugins/googleAnalytics/initialize.d.ts.map +1 -1
- package/dist/precaching/addRoute.d.ts.map +1 -1
- package/dist/precaching/matchPrecache.d.ts.map +1 -1
- package/dist/precaching/precache.d.ts.map +1 -1
- package/dist/precaching/singletonPrecacheController.d.ts +38 -0
- package/dist/precaching/singletonPrecacheController.d.ts.map +1 -0
- package/dist/precaching/utils/getCacheKeyForURL.d.ts.map +1 -1
- package/dist/routing/RegExpRoute.d.ts +3 -3
- package/dist/routing/Router.d.ts +49 -23
- package/dist/routing/Router.d.ts.map +1 -1
- package/dist/routing/parseRoute.d.ts +16 -0
- package/dist/routing/parseRoute.d.ts.map +1 -0
- package/dist/routing/registerRoute.d.ts +5 -5
- package/dist/routing/registerRoute.d.ts.map +1 -1
- package/dist/routing/setCatchHandler.d.ts +1 -1
- package/dist/routing/setCatchHandler.d.ts.map +1 -1
- package/dist/routing/setDefaultHandler.d.ts +1 -1
- package/dist/routing/setDefaultHandler.d.ts.map +1 -1
- package/dist/routing/singletonRouter.d.ts +47 -0
- package/dist/routing/singletonRouter.d.ts.map +1 -0
- package/dist/routing/unregisterRoute.d.ts +1 -1
- package/dist/routing/unregisterRoute.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/abstractions/Serwist.ts +10 -12
- package/src/abstractions/installSerwist.ts +4 -4
- package/src/index.precaching.ts +3 -0
- package/src/index.routing.ts +15 -1
- package/src/plugins/googleAnalytics/initialize.ts +19 -6
- package/src/plugins/precaching/PrecacheFallbackPlugin.ts +2 -2
- package/src/precaching/addPlugins.ts +2 -2
- package/src/precaching/addRoute.ts +2 -2
- package/src/precaching/createHandlerBoundToURL.ts +2 -2
- package/src/precaching/getCacheKeyForURL.ts +2 -2
- package/src/precaching/matchPrecache.ts +2 -3
- package/src/precaching/precache.ts +2 -2
- package/src/precaching/singletonPrecacheController.ts +57 -0
- package/src/precaching/utils/getCacheKeyForURL.ts +2 -2
- package/src/routing/RegExpRoute.ts +3 -3
- package/src/routing/Router.ts +101 -52
- package/src/routing/{utils/parseRoute.ts → parseRoute.ts} +14 -3
- package/src/routing/registerRoute.ts +7 -13
- package/src/routing/setCatchHandler.ts +3 -4
- package/src/routing/setDefaultHandler.ts +3 -4
- package/src/routing/singletonRouter.ts +76 -0
- package/src/routing/unregisterRoute.ts +3 -4
- package/dist/precaching/utils/getOrCreatePrecacheController.d.ts +0 -7
- package/dist/precaching/utils/getOrCreatePrecacheController.d.ts.map +0 -1
- package/dist/routing/utils/getOrCreateDefaultRouter.d.ts +0 -10
- package/dist/routing/utils/getOrCreateDefaultRouter.d.ts.map +0 -1
- package/dist/routing/utils/parseRoute.d.ts +0 -5
- package/dist/routing/utils/parseRoute.d.ts.map +0 -1
- package/src/precaching/utils/getOrCreatePrecacheController.ts +0 -22
- package/src/routing/utils/getOrCreateDefaultRouter.ts +0 -29
|
@@ -6,15 +6,13 @@ import { type HandlePrecachingOptions } from "./handlePrecaching.js";
|
|
|
6
6
|
import type { RuntimeCaching } from "./types.js";
|
|
7
7
|
export interface SerwistOptions {
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* @see https://serwist.pages.dev/docs/sw/precaching
|
|
9
|
+
* An optional `PrecacheController` instance. If not provided, the singleton
|
|
10
|
+
* `PrecacheController` will be used.
|
|
12
11
|
*/
|
|
13
12
|
precacheController?: PrecacheController;
|
|
14
13
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* @see https://serwist.pages.dev/docs/sw/routing
|
|
14
|
+
* An optional `Router` instance. If not provided, the singleton `Router`
|
|
15
|
+
* will be used.
|
|
18
16
|
*/
|
|
19
17
|
router?: Router;
|
|
20
18
|
}
|
|
@@ -79,6 +77,6 @@ export declare class Serwist {
|
|
|
79
77
|
private _precacheController;
|
|
80
78
|
private _router;
|
|
81
79
|
constructor({ precacheController, router }?: SerwistOptions);
|
|
82
|
-
install({ precacheEntries, precacheOptions, cleanupOutdatedCaches, navigateFallback, navigateFallbackAllowlist, navigateFallbackDenylist, skipWaiting, importScripts, navigationPreload, cacheId, clientsClaim, runtimeCaching, offlineAnalyticsConfig, disableDevLogs, fallbacks, }
|
|
80
|
+
install({ precacheEntries, precacheOptions, cleanupOutdatedCaches, navigateFallback, navigateFallbackAllowlist, navigateFallbackDenylist, skipWaiting, importScripts, navigationPreload, cacheId, clientsClaim, runtimeCaching, offlineAnalyticsConfig, disableDevLogs, fallbacks, }?: SerwistInstallOptions): void;
|
|
83
81
|
}
|
|
84
82
|
//# sourceMappingURL=Serwist.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Serwist.d.ts","sourceRoot":"","sources":["../../src/abstractions/Serwist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,gCAAgC,EAAc,MAAM,0CAA0C,CAAC;AAC7G,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAMzE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAK9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,MAAM,WAAW,cAAc;IAC7B
|
|
1
|
+
{"version":3,"file":"Serwist.d.ts","sourceRoot":"","sources":["../../src/abstractions/Serwist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,gCAAgC,EAAc,MAAM,0CAA0C,CAAC;AAC7G,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAMzE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAK9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAsB,SAAQ,uBAAuB;IACpE;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,cAAc,EAAE,CAAC;IAClC;;;OAGG;IACH,sBAAsB,CAAC,EAAE,gCAAgC,GAAG,OAAO,CAAC;IACpE;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;CACtD;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,OAAO,CAAS;gBACZ,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAE,cAAmB;IAI/D,OAAO,CAAC,EACN,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,EACzB,wBAAwB,EACxB,WAAmB,EACnB,aAAa,EACb,iBAAyB,EACzB,OAAO,EACP,YAAoB,EACpB,cAAc,EACd,sBAAsB,EACtB,cAAsB,EACtB,SAAS,GACV,GAAE,qBAA0B;CA8D9B"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { assert, SerwistError, logger, getFriendlyURL, privateCacheNames } from '@serwist/core/internal';
|
|
2
|
-
import {
|
|
2
|
+
import { g as getSingletonRouter, R as Route } from './singletonRouter.js';
|
|
3
3
|
import { N as NetworkOnly, a as NetworkFirst } from './NetworkOnly.js';
|
|
4
4
|
import { openDB } from 'idb';
|
|
5
|
-
import { g as
|
|
5
|
+
import { g as getSingletonPrecacheController } from './singletonPrecacheController.js';
|
|
6
6
|
|
|
7
7
|
const DB_VERSION = 3;
|
|
8
8
|
const DB_NAME = "serwist-background-sync";
|
|
@@ -528,20 +528,20 @@ const createGtmJsRoute = (cacheName)=>{
|
|
|
528
528
|
});
|
|
529
529
|
return new Route(match, handler, "GET");
|
|
530
530
|
};
|
|
531
|
-
const initialize = (options = {})=>{
|
|
532
|
-
const
|
|
531
|
+
const initialize = ({ cacheName, router = getSingletonRouter(), ...options } = {})=>{
|
|
532
|
+
const resolvedCacheName = privateCacheNames.getGoogleAnalyticsName(cacheName);
|
|
533
533
|
const bgSyncPlugin = new BackgroundSyncPlugin(QUEUE_NAME, {
|
|
534
534
|
maxRetentionTime: MAX_RETENTION_TIME,
|
|
535
535
|
onSync: createOnSyncCallback(options)
|
|
536
536
|
});
|
|
537
537
|
const routes = [
|
|
538
|
-
createGtmJsRoute(
|
|
539
|
-
createAnalyticsJsRoute(
|
|
540
|
-
createGtagJsRoute(
|
|
538
|
+
createGtmJsRoute(resolvedCacheName),
|
|
539
|
+
createAnalyticsJsRoute(resolvedCacheName),
|
|
540
|
+
createGtagJsRoute(resolvedCacheName),
|
|
541
541
|
...createCollectRoutes(bgSyncPlugin)
|
|
542
542
|
];
|
|
543
543
|
for (const route of routes){
|
|
544
|
-
registerRoute(route);
|
|
544
|
+
router.registerRoute(route);
|
|
545
545
|
}
|
|
546
546
|
};
|
|
547
547
|
|
|
@@ -550,7 +550,7 @@ class PrecacheFallbackPlugin {
|
|
|
550
550
|
_precacheController;
|
|
551
551
|
constructor({ fallbackUrls, precacheController }){
|
|
552
552
|
this._fallbackUrls = fallbackUrls;
|
|
553
|
-
this._precacheController = precacheController ||
|
|
553
|
+
this._precacheController = precacheController || getSingletonPrecacheController();
|
|
554
554
|
}
|
|
555
555
|
async handlerDidError(param) {
|
|
556
556
|
for (const fallback of this._fallbackUrls){
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { logger, getFriendlyURL, privateCacheNames } from '@serwist/core/internal';
|
|
2
|
-
import { g as
|
|
3
|
-
import {
|
|
2
|
+
import { g as getSingletonPrecacheController } from './singletonPrecacheController.js';
|
|
3
|
+
import { r as registerRoute } from './registerRoute.js';
|
|
4
|
+
import { R as Route } from './singletonRouter.js';
|
|
4
5
|
|
|
5
6
|
function removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching = []) {
|
|
6
7
|
for (const paramName of [
|
|
@@ -89,18 +90,18 @@ const cleanupOutdatedCaches = ()=>{
|
|
|
89
90
|
};
|
|
90
91
|
|
|
91
92
|
const createHandlerBoundToURL = (url)=>{
|
|
92
|
-
const precacheController =
|
|
93
|
+
const precacheController = getSingletonPrecacheController();
|
|
93
94
|
return precacheController.createHandlerBoundToURL(url);
|
|
94
95
|
};
|
|
95
96
|
|
|
96
97
|
const addRoute = (options)=>{
|
|
97
|
-
const precacheController =
|
|
98
|
+
const precacheController = getSingletonPrecacheController();
|
|
98
99
|
const precacheRoute = new PrecacheRoute(precacheController, options);
|
|
99
100
|
registerRoute(precacheRoute);
|
|
100
101
|
};
|
|
101
102
|
|
|
102
103
|
const precache = (entries)=>{
|
|
103
|
-
const precacheController =
|
|
104
|
+
const precacheController = getSingletonPrecacheController();
|
|
104
105
|
precacheController.precache(entries);
|
|
105
106
|
};
|
|
106
107
|
|
|
@@ -1,408 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
const defaultMethod = "GET";
|
|
4
|
-
const validMethods = [
|
|
5
|
-
"DELETE",
|
|
6
|
-
"GET",
|
|
7
|
-
"HEAD",
|
|
8
|
-
"PATCH",
|
|
9
|
-
"POST",
|
|
10
|
-
"PUT"
|
|
11
|
-
];
|
|
12
|
-
|
|
13
|
-
const normalizeHandler = (handler)=>{
|
|
14
|
-
if (handler && typeof handler === "object") {
|
|
15
|
-
if (process.env.NODE_ENV !== "production") {
|
|
16
|
-
assert.hasMethod(handler, "handle", {
|
|
17
|
-
moduleName: "@serwist/routing",
|
|
18
|
-
className: "Route",
|
|
19
|
-
funcName: "constructor",
|
|
20
|
-
paramName: "handler"
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
return handler;
|
|
24
|
-
}
|
|
25
|
-
if (process.env.NODE_ENV !== "production") {
|
|
26
|
-
assert.isType(handler, "function", {
|
|
27
|
-
moduleName: "@serwist/routing",
|
|
28
|
-
className: "Route",
|
|
29
|
-
funcName: "constructor",
|
|
30
|
-
paramName: "handler"
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
return {
|
|
34
|
-
handle: handler
|
|
35
|
-
};
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
class Route {
|
|
39
|
-
handler;
|
|
40
|
-
match;
|
|
41
|
-
method;
|
|
42
|
-
catchHandler;
|
|
43
|
-
constructor(match, handler, method = defaultMethod){
|
|
44
|
-
if (process.env.NODE_ENV !== "production") {
|
|
45
|
-
assert.isType(match, "function", {
|
|
46
|
-
moduleName: "@serwist/routing",
|
|
47
|
-
className: "Route",
|
|
48
|
-
funcName: "constructor",
|
|
49
|
-
paramName: "match"
|
|
50
|
-
});
|
|
51
|
-
if (method) {
|
|
52
|
-
assert.isOneOf(method, validMethods, {
|
|
53
|
-
paramName: "method"
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
this.handler = normalizeHandler(handler);
|
|
58
|
-
this.match = match;
|
|
59
|
-
this.method = method;
|
|
60
|
-
}
|
|
61
|
-
setCatchHandler(handler) {
|
|
62
|
-
this.catchHandler = normalizeHandler(handler);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
class Router {
|
|
67
|
-
_routes;
|
|
68
|
-
_defaultHandlerMap;
|
|
69
|
-
_catchHandler;
|
|
70
|
-
constructor(){
|
|
71
|
-
this._routes = new Map();
|
|
72
|
-
this._defaultHandlerMap = new Map();
|
|
73
|
-
}
|
|
74
|
-
get routes() {
|
|
75
|
-
return this._routes;
|
|
76
|
-
}
|
|
77
|
-
addFetchListener() {
|
|
78
|
-
self.addEventListener("fetch", (event)=>{
|
|
79
|
-
const { request } = event;
|
|
80
|
-
const responsePromise = this.handleRequest({
|
|
81
|
-
request,
|
|
82
|
-
event
|
|
83
|
-
});
|
|
84
|
-
if (responsePromise) {
|
|
85
|
-
event.respondWith(responsePromise);
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
addCacheListener() {
|
|
90
|
-
self.addEventListener("message", (event)=>{
|
|
91
|
-
if (event.data && event.data.type === "CACHE_URLS") {
|
|
92
|
-
const { payload } = event.data;
|
|
93
|
-
if (process.env.NODE_ENV !== "production") {
|
|
94
|
-
logger.debug("Caching URLs from the window", payload.urlsToCache);
|
|
95
|
-
}
|
|
96
|
-
const requestPromises = Promise.all(payload.urlsToCache.map((entry)=>{
|
|
97
|
-
if (typeof entry === "string") {
|
|
98
|
-
entry = [
|
|
99
|
-
entry
|
|
100
|
-
];
|
|
101
|
-
}
|
|
102
|
-
const request = new Request(...entry);
|
|
103
|
-
return this.handleRequest({
|
|
104
|
-
request,
|
|
105
|
-
event
|
|
106
|
-
});
|
|
107
|
-
}));
|
|
108
|
-
event.waitUntil(requestPromises);
|
|
109
|
-
if (event.ports?.[0]) {
|
|
110
|
-
void requestPromises.then(()=>event.ports[0].postMessage(true));
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
handleRequest({ request, event }) {
|
|
116
|
-
if (process.env.NODE_ENV !== "production") {
|
|
117
|
-
assert.isInstance(request, Request, {
|
|
118
|
-
moduleName: "@serwist/routing",
|
|
119
|
-
className: "Router",
|
|
120
|
-
funcName: "handleRequest",
|
|
121
|
-
paramName: "options.request"
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
const url = new URL(request.url, location.href);
|
|
125
|
-
if (!url.protocol.startsWith("http")) {
|
|
126
|
-
if (process.env.NODE_ENV !== "production") {
|
|
127
|
-
logger.debug("The Serwist router only supports URLs that start with 'http'.");
|
|
128
|
-
}
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
const sameOrigin = url.origin === location.origin;
|
|
132
|
-
const { params, route } = this.findMatchingRoute({
|
|
133
|
-
event,
|
|
134
|
-
request,
|
|
135
|
-
sameOrigin,
|
|
136
|
-
url
|
|
137
|
-
});
|
|
138
|
-
let handler = route?.handler;
|
|
139
|
-
const debugMessages = [];
|
|
140
|
-
if (process.env.NODE_ENV !== "production") {
|
|
141
|
-
if (handler) {
|
|
142
|
-
debugMessages.push([
|
|
143
|
-
"Found a route to handle this request:",
|
|
144
|
-
route
|
|
145
|
-
]);
|
|
146
|
-
if (params) {
|
|
147
|
-
debugMessages.push([
|
|
148
|
-
`Passing the following params to the route's handler:`,
|
|
149
|
-
params
|
|
150
|
-
]);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
const method = request.method;
|
|
155
|
-
if (!handler && this._defaultHandlerMap.has(method)) {
|
|
156
|
-
if (process.env.NODE_ENV !== "production") {
|
|
157
|
-
debugMessages.push(`Failed to find a matching route. Falling back to the default handler for ${method}.`);
|
|
158
|
-
}
|
|
159
|
-
handler = this._defaultHandlerMap.get(method);
|
|
160
|
-
}
|
|
161
|
-
if (!handler) {
|
|
162
|
-
if (process.env.NODE_ENV !== "production") {
|
|
163
|
-
logger.debug(`No route found for: ${getFriendlyURL(url)}`);
|
|
164
|
-
}
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
if (process.env.NODE_ENV !== "production") {
|
|
168
|
-
logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`);
|
|
169
|
-
for (const msg of debugMessages){
|
|
170
|
-
if (Array.isArray(msg)) {
|
|
171
|
-
logger.log(...msg);
|
|
172
|
-
} else {
|
|
173
|
-
logger.log(msg);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
logger.groupEnd();
|
|
177
|
-
}
|
|
178
|
-
let responsePromise;
|
|
179
|
-
try {
|
|
180
|
-
responsePromise = handler.handle({
|
|
181
|
-
url,
|
|
182
|
-
request,
|
|
183
|
-
event,
|
|
184
|
-
params
|
|
185
|
-
});
|
|
186
|
-
} catch (err) {
|
|
187
|
-
responsePromise = Promise.reject(err);
|
|
188
|
-
}
|
|
189
|
-
const catchHandler = route?.catchHandler;
|
|
190
|
-
if (responsePromise instanceof Promise && (this._catchHandler || catchHandler)) {
|
|
191
|
-
responsePromise = responsePromise.catch(async (err)=>{
|
|
192
|
-
if (catchHandler) {
|
|
193
|
-
if (process.env.NODE_ENV !== "production") {
|
|
194
|
-
logger.groupCollapsed(`Error thrown when responding to: ${getFriendlyURL(url)}. Falling back to route's Catch Handler.`);
|
|
195
|
-
logger.error("Error thrown by:", route);
|
|
196
|
-
logger.error(err);
|
|
197
|
-
logger.groupEnd();
|
|
198
|
-
}
|
|
199
|
-
try {
|
|
200
|
-
return await catchHandler.handle({
|
|
201
|
-
url,
|
|
202
|
-
request,
|
|
203
|
-
event,
|
|
204
|
-
params
|
|
205
|
-
});
|
|
206
|
-
} catch (catchErr) {
|
|
207
|
-
if (catchErr instanceof Error) {
|
|
208
|
-
err = catchErr;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
if (this._catchHandler) {
|
|
213
|
-
if (process.env.NODE_ENV !== "production") {
|
|
214
|
-
logger.groupCollapsed(`Error thrown when responding to: ${getFriendlyURL(url)}. Falling back to global Catch Handler.`);
|
|
215
|
-
logger.error("Error thrown by:", route);
|
|
216
|
-
logger.error(err);
|
|
217
|
-
logger.groupEnd();
|
|
218
|
-
}
|
|
219
|
-
return this._catchHandler.handle({
|
|
220
|
-
url,
|
|
221
|
-
request,
|
|
222
|
-
event
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
throw err;
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
return responsePromise;
|
|
229
|
-
}
|
|
230
|
-
findMatchingRoute({ url, sameOrigin, request, event }) {
|
|
231
|
-
const routes = this._routes.get(request.method) || [];
|
|
232
|
-
for (const route of routes){
|
|
233
|
-
let params;
|
|
234
|
-
const matchResult = route.match({
|
|
235
|
-
url,
|
|
236
|
-
sameOrigin,
|
|
237
|
-
request,
|
|
238
|
-
event
|
|
239
|
-
});
|
|
240
|
-
if (matchResult) {
|
|
241
|
-
if (process.env.NODE_ENV !== "production") {
|
|
242
|
-
if (matchResult instanceof Promise) {
|
|
243
|
-
logger.warn(`While routing ${getFriendlyURL(url)}, an async matchCallback function was used. Please convert the following route to use a synchronous matchCallback function:`, route);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
params = matchResult;
|
|
247
|
-
if (Array.isArray(params) && params.length === 0) {
|
|
248
|
-
params = undefined;
|
|
249
|
-
} else if (matchResult.constructor === Object && Object.keys(matchResult).length === 0) {
|
|
250
|
-
params = undefined;
|
|
251
|
-
} else if (typeof matchResult === "boolean") {
|
|
252
|
-
params = undefined;
|
|
253
|
-
}
|
|
254
|
-
return {
|
|
255
|
-
route,
|
|
256
|
-
params
|
|
257
|
-
};
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
return {};
|
|
261
|
-
}
|
|
262
|
-
setDefaultHandler(handler, method = defaultMethod) {
|
|
263
|
-
this._defaultHandlerMap.set(method, normalizeHandler(handler));
|
|
264
|
-
}
|
|
265
|
-
setCatchHandler(handler) {
|
|
266
|
-
this._catchHandler = normalizeHandler(handler);
|
|
267
|
-
}
|
|
268
|
-
registerRoute(route) {
|
|
269
|
-
if (process.env.NODE_ENV !== "production") {
|
|
270
|
-
assert.isType(route, "object", {
|
|
271
|
-
moduleName: "@serwist/routing",
|
|
272
|
-
className: "Router",
|
|
273
|
-
funcName: "registerRoute",
|
|
274
|
-
paramName: "route"
|
|
275
|
-
});
|
|
276
|
-
assert.hasMethod(route, "match", {
|
|
277
|
-
moduleName: "@serwist/routing",
|
|
278
|
-
className: "Router",
|
|
279
|
-
funcName: "registerRoute",
|
|
280
|
-
paramName: "route"
|
|
281
|
-
});
|
|
282
|
-
assert.isType(route.handler, "object", {
|
|
283
|
-
moduleName: "@serwist/routing",
|
|
284
|
-
className: "Router",
|
|
285
|
-
funcName: "registerRoute",
|
|
286
|
-
paramName: "route"
|
|
287
|
-
});
|
|
288
|
-
assert.hasMethod(route.handler, "handle", {
|
|
289
|
-
moduleName: "@serwist/routing",
|
|
290
|
-
className: "Router",
|
|
291
|
-
funcName: "registerRoute",
|
|
292
|
-
paramName: "route.handler"
|
|
293
|
-
});
|
|
294
|
-
assert.isType(route.method, "string", {
|
|
295
|
-
moduleName: "@serwist/routing",
|
|
296
|
-
className: "Router",
|
|
297
|
-
funcName: "registerRoute",
|
|
298
|
-
paramName: "route.method"
|
|
299
|
-
});
|
|
300
|
-
}
|
|
301
|
-
if (!this._routes.has(route.method)) {
|
|
302
|
-
this._routes.set(route.method, []);
|
|
303
|
-
}
|
|
304
|
-
this._routes.get(route.method).push(route);
|
|
305
|
-
}
|
|
306
|
-
unregisterRoute(route) {
|
|
307
|
-
if (!this._routes.has(route.method)) {
|
|
308
|
-
throw new SerwistError("unregister-route-but-not-found-with-method", {
|
|
309
|
-
method: route.method
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
const routeIndex = this._routes.get(route.method).indexOf(route);
|
|
313
|
-
if (routeIndex > -1) {
|
|
314
|
-
this._routes.get(route.method).splice(routeIndex, 1);
|
|
315
|
-
} else {
|
|
316
|
-
throw new SerwistError("unregister-route-route-not-registered");
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
let defaultRouter;
|
|
322
|
-
const getOrCreateDefaultRouter = ()=>{
|
|
323
|
-
if (!defaultRouter) {
|
|
324
|
-
defaultRouter = new Router();
|
|
325
|
-
defaultRouter.addFetchListener();
|
|
326
|
-
defaultRouter.addCacheListener();
|
|
327
|
-
}
|
|
328
|
-
return defaultRouter;
|
|
329
|
-
};
|
|
330
|
-
|
|
331
|
-
class RegExpRoute extends Route {
|
|
332
|
-
constructor(regExp, handler, method){
|
|
333
|
-
if (process.env.NODE_ENV !== "production") {
|
|
334
|
-
assert.isInstance(regExp, RegExp, {
|
|
335
|
-
moduleName: "@serwist/routing",
|
|
336
|
-
className: "RegExpRoute",
|
|
337
|
-
funcName: "constructor",
|
|
338
|
-
paramName: "pattern"
|
|
339
|
-
});
|
|
340
|
-
}
|
|
341
|
-
const match = ({ url })=>{
|
|
342
|
-
const result = regExp.exec(url.href);
|
|
343
|
-
if (!result) {
|
|
344
|
-
return;
|
|
345
|
-
}
|
|
346
|
-
if (url.origin !== location.origin && result.index !== 0) {
|
|
347
|
-
if (process.env.NODE_ENV !== "production") {
|
|
348
|
-
logger.debug(`The regular expression '${regExp.toString()}' only partially matched against the cross-origin URL '${url.toString()}'. RegExpRoute's will only handle cross-origin requests if they match the entire URL.`);
|
|
349
|
-
}
|
|
350
|
-
return;
|
|
351
|
-
}
|
|
352
|
-
return result.slice(1);
|
|
353
|
-
};
|
|
354
|
-
super(match, handler, method);
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
const parseRoute = (capture, handler, method)=>{
|
|
359
|
-
let route;
|
|
360
|
-
if (typeof capture === "string") {
|
|
361
|
-
const captureUrl = new URL(capture, location.href);
|
|
362
|
-
if (process.env.NODE_ENV !== "production") {
|
|
363
|
-
if (!(capture.startsWith("/") || capture.startsWith("http"))) {
|
|
364
|
-
throw new SerwistError("invalid-string", {
|
|
365
|
-
moduleName: "@serwist/routing",
|
|
366
|
-
funcName: "registerRoute",
|
|
367
|
-
paramName: "capture"
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
const valueToCheck = capture.startsWith("http") ? captureUrl.pathname : capture;
|
|
371
|
-
const wildcards = "[*:?+]";
|
|
372
|
-
if (new RegExp(`${wildcards}`).exec(valueToCheck)) {
|
|
373
|
-
logger.debug(`The '$capture' parameter contains an Express-style wildcard character (${wildcards}). Strings are now always interpreted as exact matches; use a RegExp for partial or wildcard matches.`);
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
const matchCallback = ({ url })=>{
|
|
377
|
-
if (process.env.NODE_ENV !== "production") {
|
|
378
|
-
if (url.pathname === captureUrl.pathname && url.origin !== captureUrl.origin) {
|
|
379
|
-
logger.debug(`${capture} only partially matches the cross-origin URL ${url.toString()}. This route will only handle cross-origin requests if they match the entire URL.`);
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
return url.href === captureUrl.href;
|
|
383
|
-
};
|
|
384
|
-
route = new Route(matchCallback, handler, method);
|
|
385
|
-
} else if (capture instanceof RegExp) {
|
|
386
|
-
route = new RegExpRoute(capture, handler, method);
|
|
387
|
-
} else if (typeof capture === "function") {
|
|
388
|
-
route = new Route(capture, handler, method);
|
|
389
|
-
} else if (capture instanceof Route) {
|
|
390
|
-
route = capture;
|
|
391
|
-
} else {
|
|
392
|
-
throw new SerwistError("unsupported-route-type", {
|
|
393
|
-
moduleName: "@serwist/routing",
|
|
394
|
-
funcName: "registerRoute",
|
|
395
|
-
paramName: "capture"
|
|
396
|
-
});
|
|
397
|
-
}
|
|
398
|
-
return route;
|
|
399
|
-
};
|
|
1
|
+
import { g as getSingletonRouter } from './singletonRouter.js';
|
|
400
2
|
|
|
401
3
|
const registerRoute = (capture, handler, method)=>{
|
|
402
|
-
|
|
403
|
-
const defaultRouter = getOrCreateDefaultRouter();
|
|
404
|
-
defaultRouter.registerRoute(route);
|
|
405
|
-
return route;
|
|
4
|
+
return getSingletonRouter().registerCapture(capture, handler, method);
|
|
406
5
|
};
|
|
407
6
|
|
|
408
|
-
export {
|
|
7
|
+
export { registerRoute as r };
|
|
@@ -418,12 +418,16 @@ class PrecacheController {
|
|
|
418
418
|
}
|
|
419
419
|
}
|
|
420
420
|
|
|
421
|
-
let
|
|
422
|
-
const
|
|
423
|
-
if (!
|
|
424
|
-
|
|
421
|
+
let defaultPrecacheController = undefined;
|
|
422
|
+
const getSingletonPrecacheController = ()=>{
|
|
423
|
+
if (!defaultPrecacheController) {
|
|
424
|
+
defaultPrecacheController = new PrecacheController();
|
|
425
425
|
}
|
|
426
|
-
return
|
|
426
|
+
return defaultPrecacheController;
|
|
427
|
+
};
|
|
428
|
+
const setSingletonPrecacheController = (precacheController)=>{
|
|
429
|
+
defaultPrecacheController = precacheController;
|
|
430
|
+
return defaultPrecacheController;
|
|
427
431
|
};
|
|
428
432
|
|
|
429
|
-
export { PrecacheController as P, PrecacheStrategy as a,
|
|
433
|
+
export { PrecacheController as P, PrecacheStrategy as a, getSingletonPrecacheController as g, setSingletonPrecacheController as s };
|