serwist 9.0.0-preview.24

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 (330) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/dist/NavigationRoute.d.ts +57 -0
  4. package/dist/NavigationRoute.d.ts.map +1 -0
  5. package/dist/PrecacheRoute.d.ts +17 -0
  6. package/dist/PrecacheRoute.d.ts.map +1 -0
  7. package/dist/PrecacheStrategy.d.ts +66 -0
  8. package/dist/PrecacheStrategy.d.ts.map +1 -0
  9. package/dist/RegExpRoute.d.ts +24 -0
  10. package/dist/RegExpRoute.d.ts.map +1 -0
  11. package/dist/Route.d.ts +33 -0
  12. package/dist/Route.d.ts.map +1 -0
  13. package/dist/Serwist.d.ts +331 -0
  14. package/dist/Serwist.d.ts.map +1 -0
  15. package/dist/cacheNames.d.ts +20 -0
  16. package/dist/cacheNames.d.ts.map +1 -0
  17. package/dist/chunks/NetworkOnly.js +599 -0
  18. package/dist/chunks/PrecacheFallbackPlugin.js +634 -0
  19. package/dist/chunks/Serwist.js +1034 -0
  20. package/dist/chunks/registerQuotaErrorCallback.js +17 -0
  21. package/dist/chunks/resultingClientExists.js +32 -0
  22. package/dist/chunks/timeout.js +400 -0
  23. package/dist/chunks/waitUntil.js +24 -0
  24. package/dist/cleanupOutdatedCaches.d.ts +6 -0
  25. package/dist/cleanupOutdatedCaches.d.ts.map +1 -0
  26. package/dist/clientsClaim.d.ts +6 -0
  27. package/dist/clientsClaim.d.ts.map +1 -0
  28. package/dist/constants.d.ts +15 -0
  29. package/dist/constants.d.ts.map +1 -0
  30. package/dist/copyResponse.d.ts +20 -0
  31. package/dist/copyResponse.d.ts.map +1 -0
  32. package/dist/disableDevLogs.d.ts +7 -0
  33. package/dist/disableDevLogs.d.ts.map +1 -0
  34. package/dist/index.d.ts +21 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.internal.d.ts +16 -0
  37. package/dist/index.internal.d.ts.map +1 -0
  38. package/dist/index.internal.js +24 -0
  39. package/dist/index.js +27 -0
  40. package/dist/index.legacy.d.ts +32 -0
  41. package/dist/index.legacy.d.ts.map +1 -0
  42. package/dist/index.legacy.js +640 -0
  43. package/dist/index.plugins.d.ts +41 -0
  44. package/dist/index.plugins.d.ts.map +1 -0
  45. package/dist/index.plugins.js +669 -0
  46. package/dist/index.strategies.d.ts +22 -0
  47. package/dist/index.strategies.d.ts.map +1 -0
  48. package/dist/index.strategies.js +144 -0
  49. package/dist/legacy/PrecacheController.d.ts +146 -0
  50. package/dist/legacy/PrecacheController.d.ts.map +1 -0
  51. package/dist/legacy/PrecacheFallbackPlugin.d.ts +62 -0
  52. package/dist/legacy/PrecacheFallbackPlugin.d.ts.map +1 -0
  53. package/dist/legacy/PrecacheRoute.d.ts +19 -0
  54. package/dist/legacy/PrecacheRoute.d.ts.map +1 -0
  55. package/dist/legacy/Router.d.ts +151 -0
  56. package/dist/legacy/Router.d.ts.map +1 -0
  57. package/dist/legacy/addPlugins.d.ts +9 -0
  58. package/dist/legacy/addPlugins.d.ts.map +1 -0
  59. package/dist/legacy/addRoute.d.ts +16 -0
  60. package/dist/legacy/addRoute.d.ts.map +1 -0
  61. package/dist/legacy/createHandlerBoundToURL.d.ts +18 -0
  62. package/dist/legacy/createHandlerBoundToURL.d.ts.map +1 -0
  63. package/dist/legacy/fallbacks.d.ts +59 -0
  64. package/dist/legacy/fallbacks.d.ts.map +1 -0
  65. package/dist/legacy/getCacheKeyForURL.d.ts +20 -0
  66. package/dist/legacy/getCacheKeyForURL.d.ts.map +1 -0
  67. package/dist/legacy/handlePrecaching.d.ts +54 -0
  68. package/dist/legacy/handlePrecaching.d.ts.map +1 -0
  69. package/dist/legacy/installSerwist.d.ts +15 -0
  70. package/dist/legacy/installSerwist.d.ts.map +1 -0
  71. package/dist/legacy/matchPrecache.d.ts +15 -0
  72. package/dist/legacy/matchPrecache.d.ts.map +1 -0
  73. package/dist/legacy/precache.d.ts +20 -0
  74. package/dist/legacy/precache.d.ts.map +1 -0
  75. package/dist/legacy/precacheAndRoute.d.ts +15 -0
  76. package/dist/legacy/precacheAndRoute.d.ts.map +1 -0
  77. package/dist/legacy/registerRoute.d.ts +16 -0
  78. package/dist/legacy/registerRoute.d.ts.map +1 -0
  79. package/dist/legacy/registerRuntimeCaching.d.ts +11 -0
  80. package/dist/legacy/registerRuntimeCaching.d.ts.map +1 -0
  81. package/dist/legacy/setCatchHandler.d.ts +10 -0
  82. package/dist/legacy/setCatchHandler.d.ts.map +1 -0
  83. package/dist/legacy/setDefaultHandler.d.ts +13 -0
  84. package/dist/legacy/setDefaultHandler.d.ts.map +1 -0
  85. package/dist/legacy/singletonPrecacheController.d.ts +34 -0
  86. package/dist/legacy/singletonPrecacheController.d.ts.map +1 -0
  87. package/dist/legacy/singletonRouter.d.ts +41 -0
  88. package/dist/legacy/singletonRouter.d.ts.map +1 -0
  89. package/dist/legacy/unregisterRoute.d.ts +9 -0
  90. package/dist/legacy/unregisterRoute.d.ts.map +1 -0
  91. package/dist/legacy/utils/PrecacheCacheKeyPlugin.d.ts +16 -0
  92. package/dist/legacy/utils/PrecacheCacheKeyPlugin.d.ts.map +1 -0
  93. package/dist/legacy/utils/getCacheKeyForURL.d.ts +14 -0
  94. package/dist/legacy/utils/getCacheKeyForURL.d.ts.map +1 -0
  95. package/dist/models/messages/messageGenerator.d.ts +4 -0
  96. package/dist/models/messages/messageGenerator.d.ts.map +1 -0
  97. package/dist/models/messages/messages.d.ts +44 -0
  98. package/dist/models/messages/messages.d.ts.map +1 -0
  99. package/dist/models/pluginEvents.d.ts +10 -0
  100. package/dist/models/pluginEvents.d.ts.map +1 -0
  101. package/dist/models/quotaErrorCallbacks.d.ts +3 -0
  102. package/dist/models/quotaErrorCallbacks.d.ts.map +1 -0
  103. package/dist/navigationPreload.d.ts +24 -0
  104. package/dist/navigationPreload.d.ts.map +1 -0
  105. package/dist/parseRoute.d.ts +16 -0
  106. package/dist/parseRoute.d.ts.map +1 -0
  107. package/dist/plugins/backgroundSync/BackgroundSyncPlugin.d.ts +23 -0
  108. package/dist/plugins/backgroundSync/BackgroundSyncPlugin.d.ts.map +1 -0
  109. package/dist/plugins/backgroundSync/Queue.d.ts +166 -0
  110. package/dist/plugins/backgroundSync/Queue.d.ts.map +1 -0
  111. package/dist/plugins/backgroundSync/QueueDb.d.ts +90 -0
  112. package/dist/plugins/backgroundSync/QueueDb.d.ts.map +1 -0
  113. package/dist/plugins/backgroundSync/QueueStore.d.ts +75 -0
  114. package/dist/plugins/backgroundSync/QueueStore.d.ts.map +1 -0
  115. package/dist/plugins/backgroundSync/StorableRequest.d.ts +51 -0
  116. package/dist/plugins/backgroundSync/StorableRequest.d.ts.map +1 -0
  117. package/dist/plugins/broadcastUpdate/BroadcastCacheUpdate.d.ts +45 -0
  118. package/dist/plugins/broadcastUpdate/BroadcastCacheUpdate.d.ts.map +1 -0
  119. package/dist/plugins/broadcastUpdate/BroadcastUpdatePlugin.d.ts +27 -0
  120. package/dist/plugins/broadcastUpdate/BroadcastUpdatePlugin.d.ts.map +1 -0
  121. package/dist/plugins/broadcastUpdate/constants.d.ts +5 -0
  122. package/dist/plugins/broadcastUpdate/constants.d.ts.map +1 -0
  123. package/dist/plugins/broadcastUpdate/responsesAreSame.d.ts +11 -0
  124. package/dist/plugins/broadcastUpdate/responsesAreSame.d.ts.map +1 -0
  125. package/dist/plugins/broadcastUpdate/types.d.ts +34 -0
  126. package/dist/plugins/broadcastUpdate/types.d.ts.map +1 -0
  127. package/dist/plugins/cacheableResponse/CacheableResponse.d.ts +40 -0
  128. package/dist/plugins/cacheableResponse/CacheableResponse.d.ts.map +1 -0
  129. package/dist/plugins/cacheableResponse/CacheableResponsePlugin.d.ts +27 -0
  130. package/dist/plugins/cacheableResponse/CacheableResponsePlugin.d.ts.map +1 -0
  131. package/dist/plugins/expiration/CacheExpiration.d.ts +66 -0
  132. package/dist/plugins/expiration/CacheExpiration.d.ts.map +1 -0
  133. package/dist/plugins/expiration/ExpirationPlugin.d.ts +116 -0
  134. package/dist/plugins/expiration/ExpirationPlugin.d.ts.map +1 -0
  135. package/dist/plugins/expiration/models/CacheTimestampsModel.d.ts +73 -0
  136. package/dist/plugins/expiration/models/CacheTimestampsModel.d.ts.map +1 -0
  137. package/dist/plugins/googleAnalytics/constants.d.ts +10 -0
  138. package/dist/plugins/googleAnalytics/constants.d.ts.map +1 -0
  139. package/dist/plugins/googleAnalytics/initialize.d.ts +30 -0
  140. package/dist/plugins/googleAnalytics/initialize.d.ts.map +1 -0
  141. package/dist/plugins/precaching/PrecacheFallbackPlugin.d.ts +53 -0
  142. package/dist/plugins/precaching/PrecacheFallbackPlugin.d.ts.map +1 -0
  143. package/dist/plugins/rangeRequests/RangeRequestsPlugin.d.ts +19 -0
  144. package/dist/plugins/rangeRequests/RangeRequestsPlugin.d.ts.map +1 -0
  145. package/dist/plugins/rangeRequests/createPartialResponse.d.ts +18 -0
  146. package/dist/plugins/rangeRequests/createPartialResponse.d.ts.map +1 -0
  147. package/dist/plugins/rangeRequests/utils/calculateEffectiveBoundaries.d.ts +14 -0
  148. package/dist/plugins/rangeRequests/utils/calculateEffectiveBoundaries.d.ts.map +1 -0
  149. package/dist/plugins/rangeRequests/utils/parseRangeHeader.d.ts +12 -0
  150. package/dist/plugins/rangeRequests/utils/parseRangeHeader.d.ts.map +1 -0
  151. package/dist/registerQuotaErrorCallback.d.ts +8 -0
  152. package/dist/registerQuotaErrorCallback.d.ts.map +1 -0
  153. package/dist/setCacheNameDetails.d.ts +9 -0
  154. package/dist/setCacheNameDetails.d.ts.map +1 -0
  155. package/dist/strategies/CacheFirst.d.ts +23 -0
  156. package/dist/strategies/CacheFirst.d.ts.map +1 -0
  157. package/dist/strategies/CacheOnly.d.ts +20 -0
  158. package/dist/strategies/CacheOnly.d.ts.map +1 -0
  159. package/dist/strategies/NetworkFirst.d.ts +61 -0
  160. package/dist/strategies/NetworkFirst.d.ts.map +1 -0
  161. package/dist/strategies/NetworkOnly.d.ts +32 -0
  162. package/dist/strategies/NetworkOnly.d.ts.map +1 -0
  163. package/dist/strategies/StaleWhileRevalidate.d.ts +35 -0
  164. package/dist/strategies/StaleWhileRevalidate.d.ts.map +1 -0
  165. package/dist/strategies/Strategy.d.ts +83 -0
  166. package/dist/strategies/Strategy.d.ts.map +1 -0
  167. package/dist/strategies/StrategyHandler.d.ts +189 -0
  168. package/dist/strategies/StrategyHandler.d.ts.map +1 -0
  169. package/dist/strategies/plugins/cacheOkAndOpaquePlugin.d.ts +3 -0
  170. package/dist/strategies/plugins/cacheOkAndOpaquePlugin.d.ts.map +1 -0
  171. package/dist/strategies/utils/messages.d.ts +5 -0
  172. package/dist/strategies/utils/messages.d.ts.map +1 -0
  173. package/dist/types.d.ts +317 -0
  174. package/dist/types.d.ts.map +1 -0
  175. package/dist/utils/Deferred.d.ts +19 -0
  176. package/dist/utils/Deferred.d.ts.map +1 -0
  177. package/dist/utils/PrecacheCacheKeyPlugin.d.ts +16 -0
  178. package/dist/utils/PrecacheCacheKeyPlugin.d.ts.map +1 -0
  179. package/dist/utils/PrecacheInstallReportPlugin.d.ts +14 -0
  180. package/dist/utils/PrecacheInstallReportPlugin.d.ts.map +1 -0
  181. package/dist/utils/SerwistError.d.ts +24 -0
  182. package/dist/utils/SerwistError.d.ts.map +1 -0
  183. package/dist/utils/assert.d.ts +11 -0
  184. package/dist/utils/assert.d.ts.map +1 -0
  185. package/dist/utils/cacheMatchIgnoreParams.d.ts +15 -0
  186. package/dist/utils/cacheMatchIgnoreParams.d.ts.map +1 -0
  187. package/dist/utils/cacheNames.d.ts +40 -0
  188. package/dist/utils/cacheNames.d.ts.map +1 -0
  189. package/dist/utils/canConstructReadableStream.d.ts +12 -0
  190. package/dist/utils/canConstructReadableStream.d.ts.map +1 -0
  191. package/dist/utils/canConstructResponseFromBodyStream.d.ts +11 -0
  192. package/dist/utils/canConstructResponseFromBodyStream.d.ts.map +1 -0
  193. package/dist/utils/createCacheKey.d.ts +16 -0
  194. package/dist/utils/createCacheKey.d.ts.map +1 -0
  195. package/dist/utils/deleteOutdatedCaches.d.ts +18 -0
  196. package/dist/utils/deleteOutdatedCaches.d.ts.map +1 -0
  197. package/dist/utils/dontWaitFor.d.ts +7 -0
  198. package/dist/utils/dontWaitFor.d.ts.map +1 -0
  199. package/dist/utils/executeQuotaErrorCallbacks.d.ts +8 -0
  200. package/dist/utils/executeQuotaErrorCallbacks.d.ts.map +1 -0
  201. package/dist/utils/generateURLVariations.d.ts +12 -0
  202. package/dist/utils/generateURLVariations.d.ts.map +1 -0
  203. package/dist/utils/getFriendlyURL.d.ts +3 -0
  204. package/dist/utils/getFriendlyURL.d.ts.map +1 -0
  205. package/dist/utils/logger.d.ts +24 -0
  206. package/dist/utils/logger.d.ts.map +1 -0
  207. package/dist/utils/normalizeHandler.d.ts +10 -0
  208. package/dist/utils/normalizeHandler.d.ts.map +1 -0
  209. package/dist/utils/pluginUtils.d.ts +5 -0
  210. package/dist/utils/pluginUtils.d.ts.map +1 -0
  211. package/dist/utils/printCleanupDetails.d.ts +6 -0
  212. package/dist/utils/printCleanupDetails.d.ts.map +1 -0
  213. package/dist/utils/printInstallDetails.d.ts +7 -0
  214. package/dist/utils/printInstallDetails.d.ts.map +1 -0
  215. package/dist/utils/removeIgnoredSearchParams.d.ts +12 -0
  216. package/dist/utils/removeIgnoredSearchParams.d.ts.map +1 -0
  217. package/dist/utils/resultingClientExists.d.ts +12 -0
  218. package/dist/utils/resultingClientExists.d.ts.map +1 -0
  219. package/dist/utils/timeout.d.ts +10 -0
  220. package/dist/utils/timeout.d.ts.map +1 -0
  221. package/dist/utils/waitUntil.d.ts +11 -0
  222. package/dist/utils/waitUntil.d.ts.map +1 -0
  223. package/dist/utils/welcome.d.ts +2 -0
  224. package/dist/utils/welcome.d.ts.map +1 -0
  225. package/package.json +85 -0
  226. package/src/NavigationRoute.ts +119 -0
  227. package/src/PrecacheRoute.ts +46 -0
  228. package/src/PrecacheStrategy.ts +239 -0
  229. package/src/RegExpRoute.ts +74 -0
  230. package/src/Route.ts +67 -0
  231. package/src/Serwist.ts +920 -0
  232. package/src/cacheNames.ts +39 -0
  233. package/src/cleanupOutdatedCaches.ts +32 -0
  234. package/src/clientsClaim.ts +18 -0
  235. package/src/constants.ts +24 -0
  236. package/src/copyResponse.ts +60 -0
  237. package/src/disableDevLogs.ts +10 -0
  238. package/src/index.internal.ts +33 -0
  239. package/src/index.legacy.ts +66 -0
  240. package/src/index.plugins.ts +95 -0
  241. package/src/index.strategies.ts +26 -0
  242. package/src/index.ts +39 -0
  243. package/src/legacy/PrecacheController.ts +337 -0
  244. package/src/legacy/PrecacheFallbackPlugin.ts +93 -0
  245. package/src/legacy/PrecacheRoute.ts +48 -0
  246. package/src/legacy/Router.ts +484 -0
  247. package/src/legacy/addPlugins.ts +21 -0
  248. package/src/legacy/addRoute.ts +29 -0
  249. package/src/legacy/createHandlerBoundToURL.ts +30 -0
  250. package/src/legacy/fallbacks.ts +94 -0
  251. package/src/legacy/getCacheKeyForURL.ts +32 -0
  252. package/src/legacy/handlePrecaching.ts +86 -0
  253. package/src/legacy/installSerwist.ts +19 -0
  254. package/src/legacy/matchPrecache.ts +26 -0
  255. package/src/legacy/precache.ts +31 -0
  256. package/src/legacy/precacheAndRoute.ts +28 -0
  257. package/src/legacy/registerRoute.ts +27 -0
  258. package/src/legacy/registerRuntimeCaching.ts +17 -0
  259. package/src/legacy/setCatchHandler.ts +21 -0
  260. package/src/legacy/setDefaultHandler.ts +24 -0
  261. package/src/legacy/singletonPrecacheController.ts +53 -0
  262. package/src/legacy/singletonRouter.ts +70 -0
  263. package/src/legacy/unregisterRoute.ts +12 -0
  264. package/src/legacy/utils/PrecacheCacheKeyPlugin.ts +33 -0
  265. package/src/legacy/utils/getCacheKeyForURL.ts +36 -0
  266. package/src/models/messages/messageGenerator.ts +29 -0
  267. package/src/models/messages/messages.ts +233 -0
  268. package/src/models/pluginEvents.ts +17 -0
  269. package/src/models/quotaErrorCallbacks.ts +13 -0
  270. package/src/navigationPreload.ts +68 -0
  271. package/src/parseRoute.ts +78 -0
  272. package/src/plugins/backgroundSync/BackgroundSyncPlugin.ts +38 -0
  273. package/src/plugins/backgroundSync/Queue.ts +440 -0
  274. package/src/plugins/backgroundSync/QueueDb.ts +176 -0
  275. package/src/plugins/backgroundSync/QueueStore.ts +160 -0
  276. package/src/plugins/backgroundSync/StorableRequest.ts +142 -0
  277. package/src/plugins/broadcastUpdate/BroadcastCacheUpdate.ts +161 -0
  278. package/src/plugins/broadcastUpdate/BroadcastUpdatePlugin.ts +42 -0
  279. package/src/plugins/broadcastUpdate/constants.ts +12 -0
  280. package/src/plugins/broadcastUpdate/responsesAreSame.ts +49 -0
  281. package/src/plugins/broadcastUpdate/types.ts +37 -0
  282. package/src/plugins/cacheableResponse/CacheableResponse.ts +144 -0
  283. package/src/plugins/cacheableResponse/CacheableResponsePlugin.ts +45 -0
  284. package/src/plugins/expiration/CacheExpiration.ts +193 -0
  285. package/src/plugins/expiration/ExpirationPlugin.ts +300 -0
  286. package/src/plugins/expiration/models/CacheTimestampsModel.ts +184 -0
  287. package/src/plugins/googleAnalytics/constants.ts +22 -0
  288. package/src/plugins/googleAnalytics/initialize.ts +209 -0
  289. package/src/plugins/precaching/PrecacheFallbackPlugin.ts +83 -0
  290. package/src/plugins/rangeRequests/RangeRequestsPlugin.ts +38 -0
  291. package/src/plugins/rangeRequests/createPartialResponse.ts +93 -0
  292. package/src/plugins/rangeRequests/utils/calculateEffectiveBoundaries.ts +59 -0
  293. package/src/plugins/rangeRequests/utils/parseRangeHeader.ts +55 -0
  294. package/src/registerQuotaErrorCallback.ts +34 -0
  295. package/src/setCacheNameDetails.ts +53 -0
  296. package/src/strategies/CacheFirst.ts +88 -0
  297. package/src/strategies/CacheOnly.ts +59 -0
  298. package/src/strategies/NetworkFirst.ts +229 -0
  299. package/src/strategies/NetworkOnly.ts +98 -0
  300. package/src/strategies/StaleWhileRevalidate.ts +110 -0
  301. package/src/strategies/Strategy.ts +204 -0
  302. package/src/strategies/StrategyHandler.ts +554 -0
  303. package/src/strategies/plugins/cacheOkAndOpaquePlugin.ts +26 -0
  304. package/src/strategies/utils/messages.ts +21 -0
  305. package/src/types.ts +358 -0
  306. package/src/utils/Deferred.ts +33 -0
  307. package/src/utils/PrecacheCacheKeyPlugin.ts +33 -0
  308. package/src/utils/PrecacheInstallReportPlugin.ts +47 -0
  309. package/src/utils/SerwistError.ts +41 -0
  310. package/src/utils/assert.ts +89 -0
  311. package/src/utils/cacheMatchIgnoreParams.ts +54 -0
  312. package/src/utils/cacheNames.ts +87 -0
  313. package/src/utils/canConstructReadableStream.ts +34 -0
  314. package/src/utils/canConstructResponseFromBodyStream.ts +37 -0
  315. package/src/utils/createCacheKey.ts +68 -0
  316. package/src/utils/deleteOutdatedCaches.ts +40 -0
  317. package/src/utils/dontWaitFor.ts +16 -0
  318. package/src/utils/executeQuotaErrorCallbacks.ts +33 -0
  319. package/src/utils/generateURLVariations.ts +55 -0
  320. package/src/utils/getFriendlyURL.ts +16 -0
  321. package/src/utils/logger.ts +95 -0
  322. package/src/utils/normalizeHandler.ts +40 -0
  323. package/src/utils/pluginUtils.ts +15 -0
  324. package/src/utils/printCleanupDetails.ts +38 -0
  325. package/src/utils/printInstallDetails.ts +53 -0
  326. package/src/utils/removeIgnoredSearchParams.ts +29 -0
  327. package/src/utils/resultingClientExists.ts +58 -0
  328. package/src/utils/timeout.ts +19 -0
  329. package/src/utils/waitUntil.ts +21 -0
  330. package/src/utils/welcome.ts +19 -0
@@ -0,0 +1,634 @@
1
+ import { f as finalAssertExports, S as SerwistError, l as logger, g as getFriendlyURL, c as cacheNames } from './timeout.js';
2
+ import { N as NetworkOnly, a as NetworkFirst } from './NetworkOnly.js';
3
+ import { openDB } from 'idb';
4
+
5
+ const defaultMethod = "GET";
6
+ const validMethods = [
7
+ "DELETE",
8
+ "GET",
9
+ "HEAD",
10
+ "PATCH",
11
+ "POST",
12
+ "PUT"
13
+ ];
14
+
15
+ const normalizeHandler = (handler)=>{
16
+ if (handler && typeof handler === "object") {
17
+ if (process.env.NODE_ENV !== "production") {
18
+ finalAssertExports.hasMethod(handler, "handle", {
19
+ moduleName: "serwist",
20
+ className: "Route",
21
+ funcName: "constructor",
22
+ paramName: "handler"
23
+ });
24
+ }
25
+ return handler;
26
+ }
27
+ if (process.env.NODE_ENV !== "production") {
28
+ finalAssertExports.isType(handler, "function", {
29
+ moduleName: "serwist",
30
+ className: "Route",
31
+ funcName: "constructor",
32
+ paramName: "handler"
33
+ });
34
+ }
35
+ return {
36
+ handle: handler
37
+ };
38
+ };
39
+
40
+ class Route {
41
+ handler;
42
+ match;
43
+ method;
44
+ catchHandler;
45
+ constructor(match, handler, method = defaultMethod){
46
+ if (process.env.NODE_ENV !== "production") {
47
+ finalAssertExports.isType(match, "function", {
48
+ moduleName: "serwist",
49
+ className: "Route",
50
+ funcName: "constructor",
51
+ paramName: "match"
52
+ });
53
+ if (method) {
54
+ finalAssertExports.isOneOf(method, validMethods, {
55
+ paramName: "method"
56
+ });
57
+ }
58
+ }
59
+ this.handler = normalizeHandler(handler);
60
+ this.match = match;
61
+ this.method = method;
62
+ }
63
+ setCatchHandler(handler) {
64
+ this.catchHandler = normalizeHandler(handler);
65
+ }
66
+ }
67
+
68
+ const DB_VERSION = 3;
69
+ const DB_NAME = "serwist-background-sync";
70
+ const REQUEST_OBJECT_STORE_NAME = "requests";
71
+ const QUEUE_NAME_INDEX = "queueName";
72
+ class QueueDb {
73
+ _db = null;
74
+ async addEntry(entry) {
75
+ const db = await this.getDb();
76
+ const tx = db.transaction(REQUEST_OBJECT_STORE_NAME, "readwrite", {
77
+ durability: "relaxed"
78
+ });
79
+ await tx.store.add(entry);
80
+ await tx.done;
81
+ }
82
+ async getFirstEntryId() {
83
+ const db = await this.getDb();
84
+ const cursor = await db.transaction(REQUEST_OBJECT_STORE_NAME).store.openCursor();
85
+ return cursor?.value.id;
86
+ }
87
+ async getAllEntriesByQueueName(queueName) {
88
+ const db = await this.getDb();
89
+ const results = await db.getAllFromIndex(REQUEST_OBJECT_STORE_NAME, QUEUE_NAME_INDEX, IDBKeyRange.only(queueName));
90
+ return results ? results : new Array();
91
+ }
92
+ async getEntryCountByQueueName(queueName) {
93
+ const db = await this.getDb();
94
+ return db.countFromIndex(REQUEST_OBJECT_STORE_NAME, QUEUE_NAME_INDEX, IDBKeyRange.only(queueName));
95
+ }
96
+ async deleteEntry(id) {
97
+ const db = await this.getDb();
98
+ await db.delete(REQUEST_OBJECT_STORE_NAME, id);
99
+ }
100
+ async getFirstEntryByQueueName(queueName) {
101
+ return await this.getEndEntryFromIndex(IDBKeyRange.only(queueName), "next");
102
+ }
103
+ async getLastEntryByQueueName(queueName) {
104
+ return await this.getEndEntryFromIndex(IDBKeyRange.only(queueName), "prev");
105
+ }
106
+ async getEndEntryFromIndex(query, direction) {
107
+ const db = await this.getDb();
108
+ const cursor = await db.transaction(REQUEST_OBJECT_STORE_NAME).store.index(QUEUE_NAME_INDEX).openCursor(query, direction);
109
+ return cursor?.value;
110
+ }
111
+ async getDb() {
112
+ if (!this._db) {
113
+ this._db = await openDB(DB_NAME, DB_VERSION, {
114
+ upgrade: this._upgradeDb
115
+ });
116
+ }
117
+ return this._db;
118
+ }
119
+ _upgradeDb(db, oldVersion) {
120
+ if (oldVersion > 0 && oldVersion < DB_VERSION) {
121
+ if (db.objectStoreNames.contains(REQUEST_OBJECT_STORE_NAME)) {
122
+ db.deleteObjectStore(REQUEST_OBJECT_STORE_NAME);
123
+ }
124
+ }
125
+ const objStore = db.createObjectStore(REQUEST_OBJECT_STORE_NAME, {
126
+ autoIncrement: true,
127
+ keyPath: "id"
128
+ });
129
+ objStore.createIndex(QUEUE_NAME_INDEX, QUEUE_NAME_INDEX, {
130
+ unique: false
131
+ });
132
+ }
133
+ }
134
+
135
+ class QueueStore {
136
+ _queueName;
137
+ _queueDb;
138
+ constructor(queueName){
139
+ this._queueName = queueName;
140
+ this._queueDb = new QueueDb();
141
+ }
142
+ async pushEntry(entry) {
143
+ if (process.env.NODE_ENV !== "production") {
144
+ finalAssertExports.isType(entry, "object", {
145
+ moduleName: "serwist/plugins",
146
+ className: "BackgroundSyncQueueStore",
147
+ funcName: "pushEntry",
148
+ paramName: "entry"
149
+ });
150
+ finalAssertExports.isType(entry.requestData, "object", {
151
+ moduleName: "serwist/plugins",
152
+ className: "BackgroundSyncQueueStore",
153
+ funcName: "pushEntry",
154
+ paramName: "entry.requestData"
155
+ });
156
+ }
157
+ delete entry.id;
158
+ entry.queueName = this._queueName;
159
+ await this._queueDb.addEntry(entry);
160
+ }
161
+ async unshiftEntry(entry) {
162
+ if (process.env.NODE_ENV !== "production") {
163
+ finalAssertExports.isType(entry, "object", {
164
+ moduleName: "serwist/plugins",
165
+ className: "BackgroundSyncQueueStore",
166
+ funcName: "unshiftEntry",
167
+ paramName: "entry"
168
+ });
169
+ finalAssertExports.isType(entry.requestData, "object", {
170
+ moduleName: "serwist/plugins",
171
+ className: "BackgroundSyncQueueStore",
172
+ funcName: "unshiftEntry",
173
+ paramName: "entry.requestData"
174
+ });
175
+ }
176
+ const firstId = await this._queueDb.getFirstEntryId();
177
+ if (firstId) {
178
+ entry.id = firstId - 1;
179
+ } else {
180
+ delete entry.id;
181
+ }
182
+ entry.queueName = this._queueName;
183
+ await this._queueDb.addEntry(entry);
184
+ }
185
+ async popEntry() {
186
+ return this._removeEntry(await this._queueDb.getLastEntryByQueueName(this._queueName));
187
+ }
188
+ async shiftEntry() {
189
+ return this._removeEntry(await this._queueDb.getFirstEntryByQueueName(this._queueName));
190
+ }
191
+ async getAll() {
192
+ return await this._queueDb.getAllEntriesByQueueName(this._queueName);
193
+ }
194
+ async size() {
195
+ return await this._queueDb.getEntryCountByQueueName(this._queueName);
196
+ }
197
+ async deleteEntry(id) {
198
+ await this._queueDb.deleteEntry(id);
199
+ }
200
+ async _removeEntry(entry) {
201
+ if (entry) {
202
+ await this.deleteEntry(entry.id);
203
+ }
204
+ return entry;
205
+ }
206
+ }
207
+
208
+ const serializableProperties = [
209
+ "method",
210
+ "referrer",
211
+ "referrerPolicy",
212
+ "mode",
213
+ "credentials",
214
+ "cache",
215
+ "redirect",
216
+ "integrity",
217
+ "keepalive"
218
+ ];
219
+ class StorableRequest {
220
+ _requestData;
221
+ static async fromRequest(request) {
222
+ const requestData = {
223
+ url: request.url,
224
+ headers: {}
225
+ };
226
+ if (request.method !== "GET") {
227
+ requestData.body = await request.clone().arrayBuffer();
228
+ }
229
+ request.headers.forEach((value, key)=>{
230
+ requestData.headers[key] = value;
231
+ });
232
+ for (const prop of serializableProperties){
233
+ if (request[prop] !== undefined) {
234
+ requestData[prop] = request[prop];
235
+ }
236
+ }
237
+ return new StorableRequest(requestData);
238
+ }
239
+ constructor(requestData){
240
+ if (process.env.NODE_ENV !== "production") {
241
+ finalAssertExports.isType(requestData, "object", {
242
+ moduleName: "serwist/plugins",
243
+ className: "StorableRequest",
244
+ funcName: "constructor",
245
+ paramName: "requestData"
246
+ });
247
+ finalAssertExports.isType(requestData.url, "string", {
248
+ moduleName: "serwist/plugins",
249
+ className: "StorableRequest",
250
+ funcName: "constructor",
251
+ paramName: "requestData.url"
252
+ });
253
+ }
254
+ if (requestData.mode === "navigate") {
255
+ requestData.mode = "same-origin";
256
+ }
257
+ this._requestData = requestData;
258
+ }
259
+ toObject() {
260
+ const requestData = Object.assign({}, this._requestData);
261
+ requestData.headers = Object.assign({}, this._requestData.headers);
262
+ if (requestData.body) {
263
+ requestData.body = requestData.body.slice(0);
264
+ }
265
+ return requestData;
266
+ }
267
+ toRequest() {
268
+ return new Request(this._requestData.url, this._requestData);
269
+ }
270
+ clone() {
271
+ return new StorableRequest(this.toObject());
272
+ }
273
+ }
274
+
275
+ const TAG_PREFIX = "serwist-background-sync";
276
+ const MAX_RETENTION_TIME$1 = 60 * 24 * 7;
277
+ const queueNames = new Set();
278
+ const convertEntry = (queueStoreEntry)=>{
279
+ const queueEntry = {
280
+ request: new StorableRequest(queueStoreEntry.requestData).toRequest(),
281
+ timestamp: queueStoreEntry.timestamp
282
+ };
283
+ if (queueStoreEntry.metadata) {
284
+ queueEntry.metadata = queueStoreEntry.metadata;
285
+ }
286
+ return queueEntry;
287
+ };
288
+ class Queue {
289
+ _name;
290
+ _onSync;
291
+ _maxRetentionTime;
292
+ _queueStore;
293
+ _forceSyncFallback;
294
+ _syncInProgress = false;
295
+ _requestsAddedDuringSync = false;
296
+ constructor(name, { forceSyncFallback, onSync, maxRetentionTime } = {}){
297
+ if (queueNames.has(name)) {
298
+ throw new SerwistError("duplicate-queue-name", {
299
+ name
300
+ });
301
+ }
302
+ queueNames.add(name);
303
+ this._name = name;
304
+ this._onSync = onSync || this.replayRequests;
305
+ this._maxRetentionTime = maxRetentionTime || MAX_RETENTION_TIME$1;
306
+ this._forceSyncFallback = Boolean(forceSyncFallback);
307
+ this._queueStore = new QueueStore(this._name);
308
+ this._addSyncListener();
309
+ }
310
+ get name() {
311
+ return this._name;
312
+ }
313
+ async pushRequest(entry) {
314
+ if (process.env.NODE_ENV !== "production") {
315
+ finalAssertExports.isType(entry, "object", {
316
+ moduleName: "serwist/plugins",
317
+ className: "BackgroundSyncQueue",
318
+ funcName: "pushRequest",
319
+ paramName: "entry"
320
+ });
321
+ finalAssertExports.isInstance(entry.request, Request, {
322
+ moduleName: "serwist/plugins",
323
+ className: "BackgroundSyncQueue",
324
+ funcName: "pushRequest",
325
+ paramName: "entry.request"
326
+ });
327
+ }
328
+ await this._addRequest(entry, "push");
329
+ }
330
+ async unshiftRequest(entry) {
331
+ if (process.env.NODE_ENV !== "production") {
332
+ finalAssertExports.isType(entry, "object", {
333
+ moduleName: "serwist/plugins",
334
+ className: "BackgroundSyncQueue",
335
+ funcName: "unshiftRequest",
336
+ paramName: "entry"
337
+ });
338
+ finalAssertExports.isInstance(entry.request, Request, {
339
+ moduleName: "serwist/plugins",
340
+ className: "BackgroundSyncQueue",
341
+ funcName: "unshiftRequest",
342
+ paramName: "entry.request"
343
+ });
344
+ }
345
+ await this._addRequest(entry, "unshift");
346
+ }
347
+ async popRequest() {
348
+ return this._removeRequest("pop");
349
+ }
350
+ async shiftRequest() {
351
+ return this._removeRequest("shift");
352
+ }
353
+ async getAll() {
354
+ const allEntries = await this._queueStore.getAll();
355
+ const now = Date.now();
356
+ const unexpiredEntries = [];
357
+ for (const entry of allEntries){
358
+ const maxRetentionTimeInMs = this._maxRetentionTime * 60 * 1000;
359
+ if (now - entry.timestamp > maxRetentionTimeInMs) {
360
+ await this._queueStore.deleteEntry(entry.id);
361
+ } else {
362
+ unexpiredEntries.push(convertEntry(entry));
363
+ }
364
+ }
365
+ return unexpiredEntries;
366
+ }
367
+ async size() {
368
+ return await this._queueStore.size();
369
+ }
370
+ async _addRequest({ request, metadata, timestamp = Date.now() }, operation) {
371
+ const storableRequest = await StorableRequest.fromRequest(request.clone());
372
+ const entry = {
373
+ requestData: storableRequest.toObject(),
374
+ timestamp
375
+ };
376
+ if (metadata) {
377
+ entry.metadata = metadata;
378
+ }
379
+ switch(operation){
380
+ case "push":
381
+ await this._queueStore.pushEntry(entry);
382
+ break;
383
+ case "unshift":
384
+ await this._queueStore.unshiftEntry(entry);
385
+ break;
386
+ }
387
+ if (process.env.NODE_ENV !== "production") {
388
+ logger.log(`Request for '${getFriendlyURL(request.url)}' has ` + `been added to background sync queue '${this._name}'.`);
389
+ }
390
+ if (this._syncInProgress) {
391
+ this._requestsAddedDuringSync = true;
392
+ } else {
393
+ await this.registerSync();
394
+ }
395
+ }
396
+ async _removeRequest(operation) {
397
+ const now = Date.now();
398
+ let entry;
399
+ switch(operation){
400
+ case "pop":
401
+ entry = await this._queueStore.popEntry();
402
+ break;
403
+ case "shift":
404
+ entry = await this._queueStore.shiftEntry();
405
+ break;
406
+ }
407
+ if (entry) {
408
+ const maxRetentionTimeInMs = this._maxRetentionTime * 60 * 1000;
409
+ if (now - entry.timestamp > maxRetentionTimeInMs) {
410
+ return this._removeRequest(operation);
411
+ }
412
+ return convertEntry(entry);
413
+ }
414
+ return undefined;
415
+ }
416
+ async replayRequests() {
417
+ let entry = undefined;
418
+ while(entry = await this.shiftRequest()){
419
+ try {
420
+ await fetch(entry.request.clone());
421
+ if (process.env.NODE_ENV !== "production") {
422
+ logger.log(`Request for '${getFriendlyURL(entry.request.url)}' ` + `has been replayed in queue '${this._name}'`);
423
+ }
424
+ } catch (error) {
425
+ await this.unshiftRequest(entry);
426
+ if (process.env.NODE_ENV !== "production") {
427
+ logger.log(`Request for '${getFriendlyURL(entry.request.url)}' ` + `failed to replay, putting it back in queue '${this._name}'`);
428
+ }
429
+ throw new SerwistError("queue-replay-failed", {
430
+ name: this._name
431
+ });
432
+ }
433
+ }
434
+ if (process.env.NODE_ENV !== "production") {
435
+ logger.log(`All requests in queue '${this.name}' have successfully replayed; the queue is now empty!`);
436
+ }
437
+ }
438
+ async registerSync() {
439
+ if ("sync" in self.registration && !this._forceSyncFallback) {
440
+ try {
441
+ await self.registration.sync.register(`${TAG_PREFIX}:${this._name}`);
442
+ } catch (err) {
443
+ if (process.env.NODE_ENV !== "production") {
444
+ logger.warn(`Unable to register sync event for '${this._name}'.`, err);
445
+ }
446
+ }
447
+ }
448
+ }
449
+ _addSyncListener() {
450
+ if ("sync" in self.registration && !this._forceSyncFallback) {
451
+ self.addEventListener("sync", (event)=>{
452
+ if (event.tag === `${TAG_PREFIX}:${this._name}`) {
453
+ if (process.env.NODE_ENV !== "production") {
454
+ logger.log(`Background sync for tag '${event.tag}' has been received`);
455
+ }
456
+ const syncComplete = async ()=>{
457
+ this._syncInProgress = true;
458
+ let syncError = undefined;
459
+ try {
460
+ await this._onSync({
461
+ queue: this
462
+ });
463
+ } catch (error) {
464
+ if (error instanceof Error) {
465
+ syncError = error;
466
+ throw syncError;
467
+ }
468
+ } finally{
469
+ if (this._requestsAddedDuringSync && !(syncError && !event.lastChance)) {
470
+ await this.registerSync();
471
+ }
472
+ this._syncInProgress = false;
473
+ this._requestsAddedDuringSync = false;
474
+ }
475
+ };
476
+ event.waitUntil(syncComplete());
477
+ }
478
+ });
479
+ } else {
480
+ if (process.env.NODE_ENV !== "production") {
481
+ logger.log("Background sync replaying without background sync event");
482
+ }
483
+ void this._onSync({
484
+ queue: this
485
+ });
486
+ }
487
+ }
488
+ static get _queueNames() {
489
+ return queueNames;
490
+ }
491
+ }
492
+
493
+ class BackgroundSyncPlugin {
494
+ _queue;
495
+ constructor(name, options){
496
+ this._queue = new Queue(name, options);
497
+ }
498
+ async fetchDidFail({ request }) {
499
+ await this._queue.pushRequest({
500
+ request
501
+ });
502
+ }
503
+ }
504
+
505
+ const QUEUE_NAME = "serwist-google-analytics";
506
+ const MAX_RETENTION_TIME = 60 * 48;
507
+ const GOOGLE_ANALYTICS_HOST = "www.google-analytics.com";
508
+ const GTM_HOST = "www.googletagmanager.com";
509
+ const ANALYTICS_JS_PATH = "/analytics.js";
510
+ const GTAG_JS_PATH = "/gtag/js";
511
+ const GTM_JS_PATH = "/gtm.js";
512
+ const COLLECT_PATHS_REGEX = /^\/(\w+\/)?collect/;
513
+
514
+ const createOnSyncCallback = (config)=>{
515
+ return async ({ queue })=>{
516
+ let entry = undefined;
517
+ while(entry = await queue.shiftRequest()){
518
+ const { request, timestamp } = entry;
519
+ const url = new URL(request.url);
520
+ try {
521
+ const params = request.method === "POST" ? new URLSearchParams(await request.clone().text()) : url.searchParams;
522
+ const originalHitTime = timestamp - (Number(params.get("qt")) || 0);
523
+ const queueTime = Date.now() - originalHitTime;
524
+ params.set("qt", String(queueTime));
525
+ if (config.parameterOverrides) {
526
+ for (const param of Object.keys(config.parameterOverrides)){
527
+ const value = config.parameterOverrides[param];
528
+ params.set(param, value);
529
+ }
530
+ }
531
+ if (typeof config.hitFilter === "function") {
532
+ config.hitFilter.call(null, params);
533
+ }
534
+ await fetch(new Request(url.origin + url.pathname, {
535
+ body: params.toString(),
536
+ method: "POST",
537
+ mode: "cors",
538
+ credentials: "omit",
539
+ headers: {
540
+ "Content-Type": "text/plain"
541
+ }
542
+ }));
543
+ if (process.env.NODE_ENV !== "production") {
544
+ logger.log(`Request for '${getFriendlyURL(url.href)}' has been replayed`);
545
+ }
546
+ } catch (err) {
547
+ await queue.unshiftRequest(entry);
548
+ if (process.env.NODE_ENV !== "production") {
549
+ logger.log(`Request for '${getFriendlyURL(url.href)}' failed to replay, putting it back in the queue.`);
550
+ }
551
+ throw err;
552
+ }
553
+ }
554
+ if (process.env.NODE_ENV !== "production") {
555
+ logger.log("All Google Analytics request successfully replayed; " + "the queue is now empty!");
556
+ }
557
+ };
558
+ };
559
+ const createCollectRoutes = (bgSyncPlugin)=>{
560
+ const match = ({ url })=>url.hostname === GOOGLE_ANALYTICS_HOST && COLLECT_PATHS_REGEX.test(url.pathname);
561
+ const handler = new NetworkOnly({
562
+ plugins: [
563
+ bgSyncPlugin
564
+ ]
565
+ });
566
+ return [
567
+ new Route(match, handler, "GET"),
568
+ new Route(match, handler, "POST")
569
+ ];
570
+ };
571
+ const createAnalyticsJsRoute = (cacheName)=>{
572
+ const match = ({ url })=>url.hostname === GOOGLE_ANALYTICS_HOST && url.pathname === ANALYTICS_JS_PATH;
573
+ const handler = new NetworkFirst({
574
+ cacheName
575
+ });
576
+ return new Route(match, handler, "GET");
577
+ };
578
+ const createGtagJsRoute = (cacheName)=>{
579
+ const match = ({ url })=>url.hostname === GTM_HOST && url.pathname === GTAG_JS_PATH;
580
+ const handler = new NetworkFirst({
581
+ cacheName
582
+ });
583
+ return new Route(match, handler, "GET");
584
+ };
585
+ const createGtmJsRoute = (cacheName)=>{
586
+ const match = ({ url })=>url.hostname === GTM_HOST && url.pathname === GTM_JS_PATH;
587
+ const handler = new NetworkFirst({
588
+ cacheName
589
+ });
590
+ return new Route(match, handler, "GET");
591
+ };
592
+ const initialize = ({ serwist, cacheName, ...options })=>{
593
+ const resolvedCacheName = cacheNames.getGoogleAnalyticsName(cacheName);
594
+ const bgSyncPlugin = new BackgroundSyncPlugin(QUEUE_NAME, {
595
+ maxRetentionTime: MAX_RETENTION_TIME,
596
+ onSync: createOnSyncCallback(options)
597
+ });
598
+ const routes = [
599
+ createGtmJsRoute(resolvedCacheName),
600
+ createAnalyticsJsRoute(resolvedCacheName),
601
+ createGtagJsRoute(resolvedCacheName),
602
+ ...createCollectRoutes(bgSyncPlugin)
603
+ ];
604
+ for (const route of routes){
605
+ serwist.registerRoute(route);
606
+ }
607
+ };
608
+
609
+ class PrecacheFallbackPlugin {
610
+ _fallbackUrls;
611
+ _serwist;
612
+ constructor({ fallbackUrls, serwist }){
613
+ this._fallbackUrls = fallbackUrls;
614
+ this._serwist = serwist;
615
+ }
616
+ async handlerDidError(param) {
617
+ for (const fallback of this._fallbackUrls){
618
+ if (typeof fallback === "string") {
619
+ const fallbackResponse = await this._serwist.matchPrecache(fallback);
620
+ if (fallbackResponse !== undefined) {
621
+ return fallbackResponse;
622
+ }
623
+ } else if (fallback.matcher(param)) {
624
+ const fallbackResponse = await this._serwist.matchPrecache(fallback.url);
625
+ if (fallbackResponse !== undefined) {
626
+ return fallbackResponse;
627
+ }
628
+ }
629
+ }
630
+ return undefined;
631
+ }
632
+ }
633
+
634
+ export { BackgroundSyncPlugin as B, PrecacheFallbackPlugin as P, Queue as Q, Route as R, StorableRequest as S, QueueStore as a, defaultMethod as d, initialize as i, normalizeHandler as n };