@serwist/sw 9.0.0-preview.2 → 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.
Files changed (262) hide show
  1. package/dist/abstractions/Serwist.d.ts +82 -0
  2. package/dist/abstractions/Serwist.d.ts.map +1 -0
  3. package/dist/{disableDevLogs.d.ts → abstractions/disableDevLogs.d.ts} +2 -0
  4. package/dist/abstractions/disableDevLogs.d.ts.map +1 -0
  5. package/dist/{fallbacks.d.ts → abstractions/fallbacks.d.ts} +9 -20
  6. package/dist/abstractions/fallbacks.d.ts.map +1 -0
  7. package/dist/{handlePrecaching.d.ts → abstractions/handlePrecaching.d.ts} +8 -10
  8. package/dist/abstractions/handlePrecaching.d.ts.map +1 -0
  9. package/dist/abstractions/installSerwist.d.ts +15 -0
  10. package/dist/abstractions/installSerwist.d.ts.map +1 -0
  11. package/dist/abstractions/navigationPreload.d.ts +20 -0
  12. package/dist/abstractions/navigationPreload.d.ts.map +1 -0
  13. package/dist/{registerRuntimeCaching.d.ts → abstractions/registerRuntimeCaching.d.ts} +2 -0
  14. package/dist/abstractions/registerRuntimeCaching.d.ts.map +1 -0
  15. package/dist/abstractions/types.d.ts +29 -0
  16. package/dist/abstractions/types.d.ts.map +1 -0
  17. package/dist/chunks/NavigationRoute.js +54 -0
  18. package/dist/chunks/NetworkOnly.js +193 -0
  19. package/dist/chunks/PrecacheFallbackPlugin.js +573 -0
  20. package/dist/chunks/Strategy.js +410 -0
  21. package/dist/chunks/precacheAndRoute.js +113 -0
  22. package/dist/chunks/registerRoute.js +7 -0
  23. package/dist/chunks/singletonPrecacheController.js +433 -0
  24. package/dist/chunks/singletonRouter.js +435 -0
  25. package/dist/index.d.ts +11 -9
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +121 -124
  28. package/dist/index.plugins.d.ts +41 -0
  29. package/dist/index.plugins.d.ts.map +1 -0
  30. package/dist/index.plugins.js +671 -0
  31. package/dist/index.precaching.d.ts +25 -0
  32. package/dist/index.precaching.d.ts.map +1 -0
  33. package/dist/index.precaching.js +24 -0
  34. package/dist/index.routing.d.ts +15 -0
  35. package/dist/index.routing.d.ts.map +1 -0
  36. package/dist/index.routing.js +19 -0
  37. package/dist/index.strategies.d.ts +22 -0
  38. package/dist/index.strategies.d.ts.map +1 -0
  39. package/dist/index.strategies.js +146 -0
  40. package/dist/plugins/backgroundSync/BackgroundSyncPlugin.d.ts +23 -0
  41. package/dist/plugins/backgroundSync/BackgroundSyncPlugin.d.ts.map +1 -0
  42. package/dist/plugins/backgroundSync/Queue.d.ts +166 -0
  43. package/dist/plugins/backgroundSync/Queue.d.ts.map +1 -0
  44. package/dist/plugins/backgroundSync/QueueDb.d.ts +90 -0
  45. package/dist/plugins/backgroundSync/QueueDb.d.ts.map +1 -0
  46. package/dist/plugins/backgroundSync/QueueStore.d.ts +75 -0
  47. package/dist/plugins/backgroundSync/QueueStore.d.ts.map +1 -0
  48. package/dist/plugins/backgroundSync/StorableRequest.d.ts +51 -0
  49. package/dist/plugins/backgroundSync/StorableRequest.d.ts.map +1 -0
  50. package/dist/plugins/broadcastUpdate/BroadcastCacheUpdate.d.ts +45 -0
  51. package/dist/plugins/broadcastUpdate/BroadcastCacheUpdate.d.ts.map +1 -0
  52. package/dist/plugins/broadcastUpdate/BroadcastUpdatePlugin.d.ts +27 -0
  53. package/dist/plugins/broadcastUpdate/BroadcastUpdatePlugin.d.ts.map +1 -0
  54. package/dist/plugins/broadcastUpdate/constants.d.ts +5 -0
  55. package/dist/plugins/broadcastUpdate/constants.d.ts.map +1 -0
  56. package/dist/plugins/broadcastUpdate/responsesAreSame.d.ts +11 -0
  57. package/dist/plugins/broadcastUpdate/responsesAreSame.d.ts.map +1 -0
  58. package/dist/plugins/broadcastUpdate/types.d.ts +34 -0
  59. package/dist/plugins/broadcastUpdate/types.d.ts.map +1 -0
  60. package/dist/plugins/cacheableResponse/CacheableResponse.d.ts +40 -0
  61. package/dist/plugins/cacheableResponse/CacheableResponse.d.ts.map +1 -0
  62. package/dist/plugins/cacheableResponse/CacheableResponsePlugin.d.ts +27 -0
  63. package/dist/plugins/cacheableResponse/CacheableResponsePlugin.d.ts.map +1 -0
  64. package/dist/plugins/expiration/CacheExpiration.d.ts +66 -0
  65. package/dist/plugins/expiration/CacheExpiration.d.ts.map +1 -0
  66. package/dist/plugins/expiration/ExpirationPlugin.d.ts +116 -0
  67. package/dist/plugins/expiration/ExpirationPlugin.d.ts.map +1 -0
  68. package/dist/plugins/expiration/models/CacheTimestampsModel.d.ts +73 -0
  69. package/dist/plugins/expiration/models/CacheTimestampsModel.d.ts.map +1 -0
  70. package/dist/plugins/googleAnalytics/constants.d.ts +10 -0
  71. package/dist/plugins/googleAnalytics/constants.d.ts.map +1 -0
  72. package/dist/plugins/googleAnalytics/initialize.d.ts +34 -0
  73. package/dist/plugins/googleAnalytics/initialize.d.ts.map +1 -0
  74. package/dist/plugins/precaching/PrecacheFallbackPlugin.d.ts +54 -0
  75. package/dist/plugins/precaching/PrecacheFallbackPlugin.d.ts.map +1 -0
  76. package/dist/plugins/rangeRequests/RangeRequestsPlugin.d.ts +19 -0
  77. package/dist/plugins/rangeRequests/RangeRequestsPlugin.d.ts.map +1 -0
  78. package/dist/plugins/rangeRequests/createPartialResponse.d.ts +18 -0
  79. package/dist/plugins/rangeRequests/createPartialResponse.d.ts.map +1 -0
  80. package/dist/plugins/rangeRequests/utils/calculateEffectiveBoundaries.d.ts +14 -0
  81. package/dist/plugins/rangeRequests/utils/calculateEffectiveBoundaries.d.ts.map +1 -0
  82. package/dist/plugins/rangeRequests/utils/parseRangeHeader.d.ts +12 -0
  83. package/dist/plugins/rangeRequests/utils/parseRangeHeader.d.ts.map +1 -0
  84. package/dist/precaching/PrecacheController.d.ts +145 -0
  85. package/dist/precaching/PrecacheController.d.ts.map +1 -0
  86. package/dist/precaching/PrecacheRoute.d.ts +20 -0
  87. package/dist/precaching/PrecacheRoute.d.ts.map +1 -0
  88. package/dist/precaching/PrecacheStrategy.d.ts +68 -0
  89. package/dist/precaching/PrecacheStrategy.d.ts.map +1 -0
  90. package/dist/precaching/addPlugins.d.ts +8 -0
  91. package/dist/precaching/addPlugins.d.ts.map +1 -0
  92. package/dist/precaching/addRoute.d.ts +15 -0
  93. package/dist/precaching/addRoute.d.ts.map +1 -0
  94. package/dist/precaching/cleanupOutdatedCaches.d.ts +6 -0
  95. package/dist/precaching/cleanupOutdatedCaches.d.ts.map +1 -0
  96. package/dist/precaching/createHandlerBoundToURL.d.ts +17 -0
  97. package/dist/precaching/createHandlerBoundToURL.d.ts.map +1 -0
  98. package/dist/precaching/getCacheKeyForURL.d.ts +20 -0
  99. package/dist/precaching/getCacheKeyForURL.d.ts.map +1 -0
  100. package/dist/precaching/matchPrecache.d.ts +14 -0
  101. package/dist/precaching/matchPrecache.d.ts.map +1 -0
  102. package/dist/precaching/precache.d.ts +19 -0
  103. package/dist/precaching/precache.d.ts.map +1 -0
  104. package/dist/precaching/precacheAndRoute.d.ts +14 -0
  105. package/dist/precaching/precacheAndRoute.d.ts.map +1 -0
  106. package/dist/precaching/singletonPrecacheController.d.ts +38 -0
  107. package/dist/precaching/singletonPrecacheController.d.ts.map +1 -0
  108. package/dist/precaching/types.d.ts +37 -0
  109. package/dist/precaching/types.d.ts.map +1 -0
  110. package/dist/precaching/utils/PrecacheCacheKeyPlugin.d.ts +17 -0
  111. package/dist/precaching/utils/PrecacheCacheKeyPlugin.d.ts.map +1 -0
  112. package/dist/precaching/utils/PrecacheInstallReportPlugin.d.ts +15 -0
  113. package/dist/precaching/utils/PrecacheInstallReportPlugin.d.ts.map +1 -0
  114. package/dist/precaching/utils/createCacheKey.d.ts +16 -0
  115. package/dist/precaching/utils/createCacheKey.d.ts.map +1 -0
  116. package/dist/precaching/utils/deleteOutdatedCaches.d.ts +18 -0
  117. package/dist/precaching/utils/deleteOutdatedCaches.d.ts.map +1 -0
  118. package/dist/precaching/utils/generateURLVariations.d.ts +12 -0
  119. package/dist/precaching/utils/generateURLVariations.d.ts.map +1 -0
  120. package/dist/precaching/utils/getCacheKeyForURL.d.ts +14 -0
  121. package/dist/precaching/utils/getCacheKeyForURL.d.ts.map +1 -0
  122. package/dist/precaching/utils/printCleanupDetails.d.ts +6 -0
  123. package/dist/precaching/utils/printCleanupDetails.d.ts.map +1 -0
  124. package/dist/precaching/utils/printInstallDetails.d.ts +7 -0
  125. package/dist/precaching/utils/printInstallDetails.d.ts.map +1 -0
  126. package/dist/precaching/utils/removeIgnoredSearchParams.d.ts +12 -0
  127. package/dist/precaching/utils/removeIgnoredSearchParams.d.ts.map +1 -0
  128. package/dist/routing/NavigationRoute.d.ts +57 -0
  129. package/dist/routing/NavigationRoute.d.ts.map +1 -0
  130. package/dist/routing/RegExpRoute.d.ts +24 -0
  131. package/dist/routing/RegExpRoute.d.ts.map +1 -0
  132. package/dist/routing/Route.d.ts +33 -0
  133. package/dist/routing/Route.d.ts.map +1 -0
  134. package/dist/routing/Router.d.ts +150 -0
  135. package/dist/routing/Router.d.ts.map +1 -0
  136. package/dist/routing/parseRoute.d.ts +16 -0
  137. package/dist/routing/parseRoute.d.ts.map +1 -0
  138. package/dist/routing/registerRoute.d.ts +15 -0
  139. package/dist/routing/registerRoute.d.ts.map +1 -0
  140. package/dist/routing/setCatchHandler.d.ts +9 -0
  141. package/dist/routing/setCatchHandler.d.ts.map +1 -0
  142. package/dist/routing/setDefaultHandler.d.ts +12 -0
  143. package/dist/routing/setDefaultHandler.d.ts.map +1 -0
  144. package/dist/routing/singletonRouter.d.ts +47 -0
  145. package/dist/routing/singletonRouter.d.ts.map +1 -0
  146. package/dist/routing/unregisterRoute.d.ts +8 -0
  147. package/dist/routing/unregisterRoute.d.ts.map +1 -0
  148. package/dist/routing/utils/constants.d.ts +15 -0
  149. package/dist/routing/utils/constants.d.ts.map +1 -0
  150. package/dist/routing/utils/normalizeHandler.d.ts +10 -0
  151. package/dist/routing/utils/normalizeHandler.d.ts.map +1 -0
  152. package/dist/strategies/CacheFirst.d.ts +23 -0
  153. package/dist/strategies/CacheFirst.d.ts.map +1 -0
  154. package/dist/strategies/CacheOnly.d.ts +20 -0
  155. package/dist/strategies/CacheOnly.d.ts.map +1 -0
  156. package/dist/strategies/NetworkFirst.d.ts +61 -0
  157. package/dist/strategies/NetworkFirst.d.ts.map +1 -0
  158. package/dist/strategies/NetworkOnly.d.ts +32 -0
  159. package/dist/strategies/NetworkOnly.d.ts.map +1 -0
  160. package/dist/strategies/StaleWhileRevalidate.d.ts +35 -0
  161. package/dist/strategies/StaleWhileRevalidate.d.ts.map +1 -0
  162. package/dist/strategies/Strategy.d.ts +83 -0
  163. package/dist/strategies/Strategy.d.ts.map +1 -0
  164. package/dist/strategies/StrategyHandler.d.ts +189 -0
  165. package/dist/strategies/StrategyHandler.d.ts.map +1 -0
  166. package/dist/strategies/plugins/cacheOkAndOpaquePlugin.d.ts +3 -0
  167. package/dist/strategies/plugins/cacheOkAndOpaquePlugin.d.ts.map +1 -0
  168. package/dist/strategies/utils/messages.d.ts +5 -0
  169. package/dist/strategies/utils/messages.d.ts.map +1 -0
  170. package/package.json +42 -19
  171. package/src/abstractions/Serwist.ts +177 -0
  172. package/src/abstractions/disableDevLogs.ts +10 -0
  173. package/src/abstractions/fallbacks.ts +65 -0
  174. package/src/abstractions/handlePrecaching.ts +65 -0
  175. package/src/abstractions/installSerwist.ts +28 -0
  176. package/src/abstractions/navigationPreload.ts +64 -0
  177. package/src/abstractions/registerRuntimeCaching.ts +17 -0
  178. package/src/abstractions/types.ts +29 -0
  179. package/src/index.plugins.ts +95 -0
  180. package/src/index.precaching.ts +41 -0
  181. package/src/index.routing.ts +28 -0
  182. package/src/index.strategies.ts +26 -0
  183. package/src/index.ts +31 -9
  184. package/src/plugins/backgroundSync/BackgroundSyncPlugin.ts +39 -0
  185. package/src/plugins/backgroundSync/Queue.ts +438 -0
  186. package/src/plugins/backgroundSync/QueueDb.ts +176 -0
  187. package/src/plugins/backgroundSync/QueueStore.ts +161 -0
  188. package/src/plugins/backgroundSync/StorableRequest.ts +142 -0
  189. package/src/plugins/broadcastUpdate/BroadcastCacheUpdate.ts +159 -0
  190. package/src/plugins/broadcastUpdate/BroadcastUpdatePlugin.ts +43 -0
  191. package/src/plugins/broadcastUpdate/constants.ts +12 -0
  192. package/src/plugins/broadcastUpdate/responsesAreSame.ts +48 -0
  193. package/src/plugins/broadcastUpdate/types.ts +37 -0
  194. package/src/plugins/cacheableResponse/CacheableResponse.ts +141 -0
  195. package/src/plugins/cacheableResponse/CacheableResponsePlugin.ts +46 -0
  196. package/src/plugins/expiration/CacheExpiration.ts +192 -0
  197. package/src/plugins/expiration/ExpirationPlugin.ts +297 -0
  198. package/src/plugins/expiration/models/CacheTimestampsModel.ts +184 -0
  199. package/src/plugins/googleAnalytics/constants.ts +22 -0
  200. package/src/plugins/googleAnalytics/initialize.ts +213 -0
  201. package/src/plugins/precaching/PrecacheFallbackPlugin.ts +86 -0
  202. package/src/plugins/rangeRequests/RangeRequestsPlugin.ts +39 -0
  203. package/src/plugins/rangeRequests/createPartialResponse.ts +92 -0
  204. package/src/plugins/rangeRequests/utils/calculateEffectiveBoundaries.ts +58 -0
  205. package/src/plugins/rangeRequests/utils/parseRangeHeader.ts +54 -0
  206. package/src/precaching/PrecacheController.ts +332 -0
  207. package/src/precaching/PrecacheRoute.ts +50 -0
  208. package/src/precaching/PrecacheStrategy.ts +238 -0
  209. package/src/precaching/addPlugins.ts +21 -0
  210. package/src/precaching/addRoute.ts +30 -0
  211. package/src/precaching/cleanupOutdatedCaches.ts +33 -0
  212. package/src/precaching/createHandlerBoundToURL.ts +30 -0
  213. package/src/precaching/getCacheKeyForURL.ts +33 -0
  214. package/src/precaching/matchPrecache.ts +25 -0
  215. package/src/precaching/precache.ts +31 -0
  216. package/src/precaching/precacheAndRoute.ts +27 -0
  217. package/src/precaching/singletonPrecacheController.ts +57 -0
  218. package/src/precaching/types.ts +46 -0
  219. package/src/precaching/utils/PrecacheCacheKeyPlugin.ts +36 -0
  220. package/src/precaching/utils/PrecacheInstallReportPlugin.ts +49 -0
  221. package/src/precaching/utils/createCacheKey.ts +68 -0
  222. package/src/precaching/utils/deleteOutdatedCaches.ts +40 -0
  223. package/src/precaching/utils/generateURLVariations.ts +55 -0
  224. package/src/precaching/utils/getCacheKeyForURL.ts +36 -0
  225. package/src/precaching/utils/printCleanupDetails.ts +38 -0
  226. package/src/precaching/utils/printInstallDetails.ts +53 -0
  227. package/src/precaching/utils/removeIgnoredSearchParams.ts +29 -0
  228. package/src/routing/NavigationRoute.ts +119 -0
  229. package/src/routing/RegExpRoute.ts +74 -0
  230. package/src/routing/Route.ts +68 -0
  231. package/src/routing/Router.ts +481 -0
  232. package/src/routing/parseRoute.ts +78 -0
  233. package/src/routing/registerRoute.ts +27 -0
  234. package/src/routing/setCatchHandler.ts +21 -0
  235. package/src/routing/setDefaultHandler.ts +24 -0
  236. package/src/routing/singletonRouter.ts +76 -0
  237. package/src/routing/unregisterRoute.ts +11 -0
  238. package/src/routing/utils/constants.ts +24 -0
  239. package/src/routing/utils/normalizeHandler.ts +40 -0
  240. package/src/strategies/CacheFirst.ts +87 -0
  241. package/src/strategies/CacheOnly.ts +58 -0
  242. package/src/strategies/NetworkFirst.ts +228 -0
  243. package/src/strategies/NetworkOnly.ts +96 -0
  244. package/src/strategies/StaleWhileRevalidate.ts +109 -0
  245. package/src/strategies/Strategy.ts +202 -0
  246. package/src/strategies/StrategyHandler.ts +557 -0
  247. package/src/strategies/plugins/cacheOkAndOpaquePlugin.ts +26 -0
  248. package/src/strategies/utils/messages.ts +20 -0
  249. package/dist/disableDevLogs.d.ts.map +0 -1
  250. package/dist/fallbacks.d.ts.map +0 -1
  251. package/dist/handlePrecaching.d.ts.map +0 -1
  252. package/dist/installSerwist.d.ts +0 -21
  253. package/dist/installSerwist.d.ts.map +0 -1
  254. package/dist/registerRuntimeCaching.d.ts.map +0 -1
  255. package/dist/types.d.ts +0 -110
  256. package/dist/types.d.ts.map +0 -1
  257. package/src/disableDevLogs.ts +0 -10
  258. package/src/fallbacks.ts +0 -83
  259. package/src/handlePrecaching.ts +0 -65
  260. package/src/installSerwist.ts +0 -106
  261. package/src/registerRuntimeCaching.ts +0 -84
  262. package/src/types.ts +0 -113
@@ -0,0 +1,435 @@
1
+ import { assert, logger, SerwistError, getFriendlyURL } from '@serwist/core/internal';
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 RegExpRoute extends Route {
67
+ constructor(regExp, handler, method){
68
+ if (process.env.NODE_ENV !== "production") {
69
+ assert.isInstance(regExp, RegExp, {
70
+ moduleName: "@serwist/routing",
71
+ className: "RegExpRoute",
72
+ funcName: "constructor",
73
+ paramName: "pattern"
74
+ });
75
+ }
76
+ const match = ({ url })=>{
77
+ const result = regExp.exec(url.href);
78
+ if (!result) {
79
+ return;
80
+ }
81
+ if (url.origin !== location.origin && result.index !== 0) {
82
+ if (process.env.NODE_ENV !== "production") {
83
+ 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.`);
84
+ }
85
+ return;
86
+ }
87
+ return result.slice(1);
88
+ };
89
+ super(match, handler, method);
90
+ }
91
+ }
92
+
93
+ const parseRoute = (capture, handler, method)=>{
94
+ let route;
95
+ if (typeof capture === "string") {
96
+ const captureUrl = new URL(capture, location.href);
97
+ if (process.env.NODE_ENV !== "production") {
98
+ if (!(capture.startsWith("/") || capture.startsWith("http"))) {
99
+ throw new SerwistError("invalid-string", {
100
+ moduleName: "@serwist/routing",
101
+ funcName: "registerRoute",
102
+ paramName: "capture"
103
+ });
104
+ }
105
+ const valueToCheck = capture.startsWith("http") ? captureUrl.pathname : capture;
106
+ const wildcards = "[*:?+]";
107
+ if (new RegExp(`${wildcards}`).exec(valueToCheck)) {
108
+ 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.`);
109
+ }
110
+ }
111
+ const matchCallback = ({ url })=>{
112
+ if (process.env.NODE_ENV !== "production") {
113
+ if (url.pathname === captureUrl.pathname && url.origin !== captureUrl.origin) {
114
+ 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.`);
115
+ }
116
+ }
117
+ return url.href === captureUrl.href;
118
+ };
119
+ route = new Route(matchCallback, handler, method);
120
+ } else if (capture instanceof RegExp) {
121
+ route = new RegExpRoute(capture, handler, method);
122
+ } else if (typeof capture === "function") {
123
+ route = new Route(capture, handler, method);
124
+ } else if (capture instanceof Route) {
125
+ route = capture;
126
+ } else {
127
+ throw new SerwistError("unsupported-route-type", {
128
+ moduleName: "@serwist/routing",
129
+ funcName: "registerRoute",
130
+ paramName: "capture"
131
+ });
132
+ }
133
+ return route;
134
+ };
135
+
136
+ class Router {
137
+ _routes;
138
+ _defaultHandlerMap;
139
+ _fetchListenerHandler = null;
140
+ _cacheListenerHandler = null;
141
+ _catchHandler;
142
+ constructor(){
143
+ this._routes = new Map();
144
+ this._defaultHandlerMap = new Map();
145
+ }
146
+ get routes() {
147
+ return this._routes;
148
+ }
149
+ addFetchListener() {
150
+ if (!this._fetchListenerHandler) {
151
+ this._fetchListenerHandler = (event)=>{
152
+ const { request } = event;
153
+ const responsePromise = this.handleRequest({
154
+ request,
155
+ event
156
+ });
157
+ if (responsePromise) {
158
+ event.respondWith(responsePromise);
159
+ }
160
+ };
161
+ self.addEventListener("fetch", this._fetchListenerHandler);
162
+ }
163
+ }
164
+ removeFetchListener() {
165
+ if (this._fetchListenerHandler) {
166
+ self.removeEventListener("fetch", this._fetchListenerHandler);
167
+ this._fetchListenerHandler = null;
168
+ }
169
+ }
170
+ addCacheListener() {
171
+ if (!this._cacheListenerHandler) {
172
+ this._cacheListenerHandler = (event)=>{
173
+ if (event.data && event.data.type === "CACHE_URLS") {
174
+ const { payload } = event.data;
175
+ if (process.env.NODE_ENV !== "production") {
176
+ logger.debug("Caching URLs from the window", payload.urlsToCache);
177
+ }
178
+ const requestPromises = Promise.all(payload.urlsToCache.map((entry)=>{
179
+ if (typeof entry === "string") {
180
+ entry = [
181
+ entry
182
+ ];
183
+ }
184
+ const request = new Request(...entry);
185
+ return this.handleRequest({
186
+ request,
187
+ event
188
+ });
189
+ }));
190
+ event.waitUntil(requestPromises);
191
+ if (event.ports?.[0]) {
192
+ void requestPromises.then(()=>event.ports[0].postMessage(true));
193
+ }
194
+ }
195
+ };
196
+ self.addEventListener("message", this._cacheListenerHandler);
197
+ }
198
+ }
199
+ removeCacheListener() {
200
+ if (this._cacheListenerHandler) {
201
+ self.removeEventListener("message", this._cacheListenerHandler);
202
+ }
203
+ }
204
+ handleRequest({ request, event }) {
205
+ if (process.env.NODE_ENV !== "production") {
206
+ assert.isInstance(request, Request, {
207
+ moduleName: "@serwist/routing",
208
+ className: "Router",
209
+ funcName: "handleRequest",
210
+ paramName: "options.request"
211
+ });
212
+ }
213
+ const url = new URL(request.url, location.href);
214
+ if (!url.protocol.startsWith("http")) {
215
+ if (process.env.NODE_ENV !== "production") {
216
+ logger.debug("Router only supports URLs that start with 'http'.");
217
+ }
218
+ return;
219
+ }
220
+ const sameOrigin = url.origin === location.origin;
221
+ const { params, route } = this.findMatchingRoute({
222
+ event,
223
+ request,
224
+ sameOrigin,
225
+ url
226
+ });
227
+ let handler = route?.handler;
228
+ const debugMessages = [];
229
+ if (process.env.NODE_ENV !== "production") {
230
+ if (handler) {
231
+ debugMessages.push([
232
+ "Found a route to handle this request:",
233
+ route
234
+ ]);
235
+ if (params) {
236
+ debugMessages.push([
237
+ `Passing the following params to the route's handler:`,
238
+ params
239
+ ]);
240
+ }
241
+ }
242
+ }
243
+ const method = request.method;
244
+ if (!handler && this._defaultHandlerMap.has(method)) {
245
+ if (process.env.NODE_ENV !== "production") {
246
+ debugMessages.push(`Failed to find a matching route. Falling back to the default handler for ${method}.`);
247
+ }
248
+ handler = this._defaultHandlerMap.get(method);
249
+ }
250
+ if (!handler) {
251
+ if (process.env.NODE_ENV !== "production") {
252
+ logger.debug(`No route found for: ${getFriendlyURL(url)}`);
253
+ }
254
+ return;
255
+ }
256
+ if (process.env.NODE_ENV !== "production") {
257
+ logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`);
258
+ for (const msg of debugMessages){
259
+ if (Array.isArray(msg)) {
260
+ logger.log(...msg);
261
+ } else {
262
+ logger.log(msg);
263
+ }
264
+ }
265
+ logger.groupEnd();
266
+ }
267
+ let responsePromise;
268
+ try {
269
+ responsePromise = handler.handle({
270
+ url,
271
+ request,
272
+ event,
273
+ params
274
+ });
275
+ } catch (err) {
276
+ responsePromise = Promise.reject(err);
277
+ }
278
+ const catchHandler = route?.catchHandler;
279
+ if (responsePromise instanceof Promise && (this._catchHandler || catchHandler)) {
280
+ responsePromise = responsePromise.catch(async (err)=>{
281
+ if (catchHandler) {
282
+ if (process.env.NODE_ENV !== "production") {
283
+ logger.groupCollapsed(`Error thrown when responding to: ${getFriendlyURL(url)}. Falling back to route's Catch Handler.`);
284
+ logger.error("Error thrown by:", route);
285
+ logger.error(err);
286
+ logger.groupEnd();
287
+ }
288
+ try {
289
+ return await catchHandler.handle({
290
+ url,
291
+ request,
292
+ event,
293
+ params
294
+ });
295
+ } catch (catchErr) {
296
+ if (catchErr instanceof Error) {
297
+ err = catchErr;
298
+ }
299
+ }
300
+ }
301
+ if (this._catchHandler) {
302
+ if (process.env.NODE_ENV !== "production") {
303
+ logger.groupCollapsed(`Error thrown when responding to: ${getFriendlyURL(url)}. Falling back to global Catch Handler.`);
304
+ logger.error("Error thrown by:", route);
305
+ logger.error(err);
306
+ logger.groupEnd();
307
+ }
308
+ return this._catchHandler.handle({
309
+ url,
310
+ request,
311
+ event
312
+ });
313
+ }
314
+ throw err;
315
+ });
316
+ }
317
+ return responsePromise;
318
+ }
319
+ findMatchingRoute({ url, sameOrigin, request, event }) {
320
+ const routes = this._routes.get(request.method) || [];
321
+ for (const route of routes){
322
+ let params;
323
+ const matchResult = route.match({
324
+ url,
325
+ sameOrigin,
326
+ request,
327
+ event
328
+ });
329
+ if (matchResult) {
330
+ if (process.env.NODE_ENV !== "production") {
331
+ if (matchResult instanceof Promise) {
332
+ logger.warn(`While routing ${getFriendlyURL(url)}, an async matchCallback function was used. Please convert the following route to use a synchronous matchCallback function:`, route);
333
+ }
334
+ }
335
+ params = matchResult;
336
+ if (Array.isArray(params) && params.length === 0) {
337
+ params = undefined;
338
+ } else if (matchResult.constructor === Object && Object.keys(matchResult).length === 0) {
339
+ params = undefined;
340
+ } else if (typeof matchResult === "boolean") {
341
+ params = undefined;
342
+ }
343
+ return {
344
+ route,
345
+ params
346
+ };
347
+ }
348
+ }
349
+ return {};
350
+ }
351
+ setDefaultHandler(handler, method = defaultMethod) {
352
+ this._defaultHandlerMap.set(method, normalizeHandler(handler));
353
+ }
354
+ setCatchHandler(handler) {
355
+ this._catchHandler = normalizeHandler(handler);
356
+ }
357
+ registerCapture(capture, handler, method) {
358
+ const route = parseRoute(capture, handler, method);
359
+ this.registerRoute(route);
360
+ return route;
361
+ }
362
+ registerRoute(route) {
363
+ if (process.env.NODE_ENV !== "production") {
364
+ assert.isType(route, "object", {
365
+ moduleName: "@serwist/routing",
366
+ className: "Router",
367
+ funcName: "registerRoute",
368
+ paramName: "route"
369
+ });
370
+ assert.hasMethod(route, "match", {
371
+ moduleName: "@serwist/routing",
372
+ className: "Router",
373
+ funcName: "registerRoute",
374
+ paramName: "route"
375
+ });
376
+ assert.isType(route.handler, "object", {
377
+ moduleName: "@serwist/routing",
378
+ className: "Router",
379
+ funcName: "registerRoute",
380
+ paramName: "route"
381
+ });
382
+ assert.hasMethod(route.handler, "handle", {
383
+ moduleName: "@serwist/routing",
384
+ className: "Router",
385
+ funcName: "registerRoute",
386
+ paramName: "route.handler"
387
+ });
388
+ assert.isType(route.method, "string", {
389
+ moduleName: "@serwist/routing",
390
+ className: "Router",
391
+ funcName: "registerRoute",
392
+ paramName: "route.method"
393
+ });
394
+ }
395
+ if (!this._routes.has(route.method)) {
396
+ this._routes.set(route.method, []);
397
+ }
398
+ this._routes.get(route.method).push(route);
399
+ }
400
+ unregisterRoute(route) {
401
+ if (!this._routes.has(route.method)) {
402
+ throw new SerwistError("unregister-route-but-not-found-with-method", {
403
+ method: route.method
404
+ });
405
+ }
406
+ const routeIndex = this._routes.get(route.method).indexOf(route);
407
+ if (routeIndex > -1) {
408
+ this._routes.get(route.method).splice(routeIndex, 1);
409
+ } else {
410
+ throw new SerwistError("unregister-route-route-not-registered");
411
+ }
412
+ }
413
+ }
414
+
415
+ let defaultRouter = undefined;
416
+ const getSingletonRouter = ()=>{
417
+ if (!defaultRouter) {
418
+ defaultRouter = new Router();
419
+ defaultRouter.addFetchListener();
420
+ defaultRouter.addCacheListener();
421
+ }
422
+ return defaultRouter;
423
+ };
424
+ const setSingletonRouter = (router)=>{
425
+ if (defaultRouter) {
426
+ defaultRouter.removeFetchListener();
427
+ defaultRouter.removeCacheListener();
428
+ }
429
+ defaultRouter = router;
430
+ defaultRouter.addFetchListener();
431
+ defaultRouter.addCacheListener();
432
+ return defaultRouter;
433
+ };
434
+
435
+ export { Route as R, RegExpRoute as a, Router as b, getSingletonRouter as g, parseRoute as p, setSingletonRouter as s };
package/dist/index.d.ts CHANGED
@@ -1,10 +1,12 @@
1
- import { disableDevLogs } from "./disableDevLogs.js";
2
- import type { FallbackEntry, FallbackMatcher, FallbacksOptions } from "./fallbacks.js";
3
- import { fallbacks } from "./fallbacks.js";
4
- import { type HandlePrecachingOptions, handlePrecaching } from "./handlePrecaching.js";
5
- import { type InstallSerwistOptions, installSerwist } from "./installSerwist.js";
6
- import { registerRuntimeCaching } from "./registerRuntimeCaching.js";
7
- import type { RuntimeCaching } from "./types.js";
8
- export { disableDevLogs, fallbacks, handlePrecaching, installSerwist, registerRuntimeCaching };
9
- export type { FallbackEntry, FallbackMatcher, FallbacksOptions, HandlePrecachingOptions, InstallSerwistOptions as SerwistOptions, RuntimeCaching };
1
+ import { Serwist, type SerwistInstallOptions, type SerwistOptions } from "./abstractions/Serwist.js";
2
+ import { disableDevLogs } from "./abstractions/disableDevLogs.js";
3
+ import type { FallbackEntry, FallbackMatcher, FallbacksOptions } from "./abstractions/fallbacks.js";
4
+ import { fallbacks } from "./abstractions/fallbacks.js";
5
+ import { type HandlePrecachingOptions, handlePrecaching } from "./abstractions/handlePrecaching.js";
6
+ import { type InstallSerwistOptions, installSerwist } from "./abstractions/installSerwist.js";
7
+ import { disableNavigationPreload, enableNavigationPreload, isNavigationPreloadSupported } from "./abstractions/navigationPreload.js";
8
+ import { registerRuntimeCaching } from "./abstractions/registerRuntimeCaching.js";
9
+ import type { RuntimeCaching } from "./abstractions/types.js";
10
+ export { disableDevLogs, fallbacks, handlePrecaching, installSerwist, Serwist, registerRuntimeCaching, disableNavigationPreload, enableNavigationPreload, isNavigationPreloadSupported, };
11
+ export type { FallbackEntry, FallbackMatcher, FallbacksOptions, HandlePrecachingOptions, InstallSerwistOptions, SerwistOptions, SerwistInstallOptions, RuntimeCaching, };
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,KAAK,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAE,KAAK,qBAAqB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,sBAAsB,EAAE,CAAC;AAC/F,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,qBAAqB,IAAI,cAAc,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACrG,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpG,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,KAAK,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACpG,OAAO,EAAE,KAAK,qBAAqB,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAC9F,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;AACtI,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EACL,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,OAAO,EACP,sBAAsB,EAEtB,wBAAwB,EACxB,uBAAuB,EACvB,4BAA4B,GAC7B,CAAC;AACF,YAAY,EACV,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,cAAc,GACf,CAAC"}