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,160 @@
1
+ /*
2
+ Copyright 2018 Google LLC
3
+
4
+ Use of this source code is governed by an MIT-style
5
+ license that can be found in the LICENSE file or at
6
+ https://opensource.org/licenses/MIT.
7
+ */
8
+ import { assert } from "../../utils/assert.js";
9
+ import type { QueueStoreEntry, UnidentifiedQueueStoreEntry } from "./QueueDb.js";
10
+ import { QueueDb } from "./QueueDb.js";
11
+
12
+ /**
13
+ * A class to manage storing requests from a Queue in IndexedDB,
14
+ * indexed by their queue name for easier access.
15
+ *
16
+ * Most developers will not need to access this class directly;
17
+ * it is exposed for advanced use cases.
18
+ */
19
+ export class QueueStore {
20
+ private readonly _queueName: string;
21
+ private readonly _queueDb: QueueDb;
22
+
23
+ /**
24
+ * Associates this instance with a Queue instance, so entries added can be
25
+ * identified by their queue name.
26
+ *
27
+ * @param queueName
28
+ */
29
+ constructor(queueName: string) {
30
+ this._queueName = queueName;
31
+ this._queueDb = new QueueDb();
32
+ }
33
+
34
+ /**
35
+ * Append an entry last in the queue.
36
+ *
37
+ * @param entry
38
+ */
39
+ async pushEntry(entry: UnidentifiedQueueStoreEntry): Promise<void> {
40
+ if (process.env.NODE_ENV !== "production") {
41
+ assert!.isType(entry, "object", {
42
+ moduleName: "serwist/plugins",
43
+ className: "BackgroundSyncQueueStore",
44
+ funcName: "pushEntry",
45
+ paramName: "entry",
46
+ });
47
+ assert!.isType(entry.requestData, "object", {
48
+ moduleName: "serwist/plugins",
49
+ className: "BackgroundSyncQueueStore",
50
+ funcName: "pushEntry",
51
+ paramName: "entry.requestData",
52
+ });
53
+ }
54
+
55
+ // biome-ignore lint/performance/noDelete: Don't specify an ID since one is automatically generated.
56
+ delete entry.id;
57
+ entry.queueName = this._queueName;
58
+
59
+ await this._queueDb.addEntry(entry);
60
+ }
61
+
62
+ /**
63
+ * Prepend an entry first in the queue.
64
+ *
65
+ * @param entry
66
+ */
67
+ async unshiftEntry(entry: UnidentifiedQueueStoreEntry): Promise<void> {
68
+ if (process.env.NODE_ENV !== "production") {
69
+ assert!.isType(entry, "object", {
70
+ moduleName: "serwist/plugins",
71
+ className: "BackgroundSyncQueueStore",
72
+ funcName: "unshiftEntry",
73
+ paramName: "entry",
74
+ });
75
+ assert!.isType(entry.requestData, "object", {
76
+ moduleName: "serwist/plugins",
77
+ className: "BackgroundSyncQueueStore",
78
+ funcName: "unshiftEntry",
79
+ paramName: "entry.requestData",
80
+ });
81
+ }
82
+
83
+ const firstId = await this._queueDb.getFirstEntryId();
84
+
85
+ if (firstId) {
86
+ // Pick an ID one less than the lowest ID in the object store.
87
+ entry.id = firstId - 1;
88
+ } else {
89
+ // biome-ignore lint/performance/noDelete: Let the auto-incrementor assign the ID.
90
+ delete entry.id;
91
+ }
92
+ entry.queueName = this._queueName;
93
+
94
+ await this._queueDb.addEntry(entry);
95
+ }
96
+
97
+ /**
98
+ * Removes and returns the last entry in the queue matching the `queueName`.
99
+ *
100
+ * @returns
101
+ */
102
+ async popEntry(): Promise<QueueStoreEntry | undefined> {
103
+ return this._removeEntry(await this._queueDb.getLastEntryByQueueName(this._queueName));
104
+ }
105
+
106
+ /**
107
+ * Removes and returns the first entry in the queue matching the `queueName`.
108
+ *
109
+ * @returns
110
+ */
111
+ async shiftEntry(): Promise<QueueStoreEntry | undefined> {
112
+ return this._removeEntry(await this._queueDb.getFirstEntryByQueueName(this._queueName));
113
+ }
114
+
115
+ /**
116
+ * Returns all entries in the store matching the `queueName`.
117
+ *
118
+ * @returns
119
+ */
120
+ async getAll(): Promise<QueueStoreEntry[]> {
121
+ return await this._queueDb.getAllEntriesByQueueName(this._queueName);
122
+ }
123
+
124
+ /**
125
+ * Returns the number of entries in the store matching the `queueName`.
126
+ *
127
+ * @returns
128
+ */
129
+ async size(): Promise<number> {
130
+ return await this._queueDb.getEntryCountByQueueName(this._queueName);
131
+ }
132
+
133
+ /**
134
+ * Deletes the entry for the given ID.
135
+ *
136
+ * WARNING: this method does not ensure the deleted entry belongs to this
137
+ * queue (i.e. matches the `queueName`). But this limitation is acceptable
138
+ * as this class is not publicly exposed. An additional check would make
139
+ * this method slower than it needs to be.
140
+ *
141
+ * @param id
142
+ */
143
+ async deleteEntry(id: number): Promise<void> {
144
+ await this._queueDb.deleteEntry(id);
145
+ }
146
+
147
+ /**
148
+ * Removes and returns the first or last entry in the queue (based on the
149
+ * `direction` argument) matching the `queueName`.
150
+ *
151
+ * @returns
152
+ * @private
153
+ */
154
+ async _removeEntry(entry?: QueueStoreEntry): Promise<QueueStoreEntry | undefined> {
155
+ if (entry) {
156
+ await this.deleteEntry(entry.id);
157
+ }
158
+ return entry;
159
+ }
160
+ }
@@ -0,0 +1,142 @@
1
+ /*
2
+ Copyright 2018 Google LLC
3
+
4
+ Use of this source code is governed by an MIT-style
5
+ license that can be found in the LICENSE file or at
6
+ https://opensource.org/licenses/MIT.
7
+ */
8
+
9
+ import type { MapLikeObject } from "../../types.js";
10
+ import { assert } from "../../utils/assert.js";
11
+
12
+ type SerializableProperties = "method" | "referrer" | "referrerPolicy" | "mode" | "credentials" | "cache" | "redirect" | "integrity" | "keepalive";
13
+
14
+ const serializableProperties: SerializableProperties[] = [
15
+ "method",
16
+ "referrer",
17
+ "referrerPolicy",
18
+ "mode",
19
+ "credentials",
20
+ "cache",
21
+ "redirect",
22
+ "integrity",
23
+ "keepalive",
24
+ ];
25
+
26
+ export interface RequestData extends MapLikeObject {
27
+ url: string;
28
+ headers: MapLikeObject;
29
+ body?: ArrayBuffer;
30
+ }
31
+
32
+ /**
33
+ * A class to make it easier to serialize and de-serialize requests so they
34
+ * can be stored in IndexedDB.
35
+ *
36
+ * Most developers will not need to access this class directly;
37
+ * it is exposed for advanced use cases.
38
+ */
39
+ export class StorableRequest {
40
+ private readonly _requestData: RequestData;
41
+
42
+ /**
43
+ * Converts a Request object to a plain object that can be structured
44
+ * cloned or JSON-stringified.
45
+ *
46
+ * @param request
47
+ * @returns
48
+ */
49
+ static async fromRequest(request: Request): Promise<StorableRequest> {
50
+ const requestData: RequestData = {
51
+ url: request.url,
52
+ headers: {},
53
+ };
54
+
55
+ // Set the body if present.
56
+ if (request.method !== "GET") {
57
+ // Use ArrayBuffer to support non-text request bodies.
58
+ // NOTE: we can't use Blobs becuse Safari doesn't support storing
59
+ // Blobs in IndexedDB in some cases:
60
+ // https://github.com/dfahlander/Dexie.js/issues/618#issuecomment-398348457
61
+ requestData.body = await request.clone().arrayBuffer();
62
+ }
63
+
64
+ request.headers.forEach((value, key) => {
65
+ requestData.headers[key] = value;
66
+ });
67
+
68
+ // Add all other serializable request properties
69
+ for (const prop of serializableProperties) {
70
+ if (request[prop] !== undefined) {
71
+ requestData[prop] = request[prop];
72
+ }
73
+ }
74
+
75
+ return new StorableRequest(requestData);
76
+ }
77
+
78
+ /**
79
+ * Accepts an object of request data that can be used to construct a
80
+ * `Request` but can also be stored in IndexedDB.
81
+ *
82
+ * @param requestData An object of request data that includes the `url` plus any relevant properties of
83
+ * [requestInit](https://fetch.spec.whatwg.org/#requestinit).
84
+ */
85
+ constructor(requestData: RequestData) {
86
+ if (process.env.NODE_ENV !== "production") {
87
+ assert!.isType(requestData, "object", {
88
+ moduleName: "serwist/plugins",
89
+ className: "StorableRequest",
90
+ funcName: "constructor",
91
+ paramName: "requestData",
92
+ });
93
+ assert!.isType(requestData.url, "string", {
94
+ moduleName: "serwist/plugins",
95
+ className: "StorableRequest",
96
+ funcName: "constructor",
97
+ paramName: "requestData.url",
98
+ });
99
+ }
100
+
101
+ // If the request's mode is `navigate`, convert it to `same-origin` since
102
+ // navigation requests can't be constructed via script.
103
+ if (requestData.mode === "navigate") {
104
+ requestData.mode = "same-origin";
105
+ }
106
+
107
+ this._requestData = requestData;
108
+ }
109
+
110
+ /**
111
+ * Returns a deep clone of the instances `_requestData` object.
112
+ *
113
+ * @returns
114
+ */
115
+ toObject(): RequestData {
116
+ const requestData = Object.assign({}, this._requestData);
117
+ requestData.headers = Object.assign({}, this._requestData.headers);
118
+ if (requestData.body) {
119
+ requestData.body = requestData.body.slice(0);
120
+ }
121
+
122
+ return requestData;
123
+ }
124
+
125
+ /**
126
+ * Converts this instance to a Request.
127
+ *
128
+ * @returns
129
+ */
130
+ toRequest(): Request {
131
+ return new Request(this._requestData.url, this._requestData);
132
+ }
133
+
134
+ /**
135
+ * Creates and returns a deep clone of the instance.
136
+ *
137
+ * @returns
138
+ */
139
+ clone(): StorableRequest {
140
+ return new StorableRequest(this.toObject());
141
+ }
142
+ }
@@ -0,0 +1,161 @@
1
+ /*
2
+ Copyright 2018 Google LLC
3
+
4
+ Use of this source code is governed by an MIT-style
5
+ license that can be found in the LICENSE file or at
6
+ https://opensource.org/licenses/MIT.
7
+ */
8
+
9
+ import type { CacheDidUpdateCallbackParam } from "../../types.js";
10
+ import { assert } from "../../utils/assert.js";
11
+ import { logger } from "../../utils/logger.js";
12
+ import { resultingClientExists } from "../../utils/resultingClientExists.js";
13
+ import { timeout } from "../../utils/timeout.js";
14
+ import { CACHE_UPDATED_MESSAGE_META, CACHE_UPDATED_MESSAGE_TYPE, defaultHeadersToCheck, defaultNotifyAllClients } from "./constants.js";
15
+ import { responsesAreSame } from "./responsesAreSame.js";
16
+ import type { BroadcastCacheUpdateOptions, BroadcastMessage, BroadcastPayload, BroadcastPayloadGenerator } from "./types.js";
17
+
18
+ // UA-sniff Safari: https://stackoverflow.com/questions/7944460/detect-safari-browser
19
+ // TODO(philipwalton): remove once this Safari bug fix has been released.
20
+ // https://bugs.webkit.org/show_bug.cgi?id=201169
21
+ const isSafari = typeof navigator !== "undefined" && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
22
+
23
+ // Give TypeScript the correct global.
24
+ declare let self: ServiceWorkerGlobalScope;
25
+ /**
26
+ * Generates the default payload used in update messages. By default the
27
+ * payload includes the `cacheName` and `updatedURL` fields.
28
+ *
29
+ * @returns
30
+ * @private
31
+ */
32
+ const defaultPayloadGenerator = (data: CacheDidUpdateCallbackParam): BroadcastPayload => {
33
+ return {
34
+ cacheName: data.cacheName,
35
+ updatedURL: data.request.url,
36
+ };
37
+ };
38
+
39
+ /**
40
+ * A class that uses the `postMessage()` API to inform any open windows/tabs when
41
+ * a cached response has been updated.
42
+ *
43
+ * For efficiency's sake, the underlying response bodies are not compared;
44
+ * only specific response headers are checked.
45
+ */
46
+ export class BroadcastCacheUpdate {
47
+ private readonly _headersToCheck: string[];
48
+ private readonly _generatePayload: BroadcastPayloadGenerator;
49
+ private readonly _notifyAllClients: boolean;
50
+
51
+ /**
52
+ * Construct a BroadcastCacheUpdate instance with a specific `channelName` to
53
+ * broadcast messages on
54
+ *
55
+ * @param options
56
+ */
57
+ constructor({ generatePayload, headersToCheck, notifyAllClients }: BroadcastCacheUpdateOptions = {}) {
58
+ this._headersToCheck = headersToCheck || defaultHeadersToCheck;
59
+ this._generatePayload = generatePayload || defaultPayloadGenerator;
60
+ this._notifyAllClients = notifyAllClients ?? defaultNotifyAllClients;
61
+ }
62
+
63
+ /**
64
+ * Compares two responses and sends a message (via `postMessage()`) to all window clients if the
65
+ * responses differ. Neither of the Responses can be opaque.
66
+ *
67
+ * The message that's posted has the following format (where `payload` can
68
+ * be customized via the `generatePayload` option the instance is created
69
+ * with):
70
+ *
71
+ * ```
72
+ * {
73
+ * type: 'CACHE_UPDATED',
74
+ * meta: 'workbox-broadcast-update',
75
+ * payload: {
76
+ * cacheName: 'the-cache-name',
77
+ * updatedURL: 'https://example.com/'
78
+ * }
79
+ * }
80
+ * ```
81
+ *
82
+ * @param options
83
+ * @returns Resolves once the update is sent.
84
+ */
85
+ async notifyIfUpdated(options: CacheDidUpdateCallbackParam): Promise<void> {
86
+ if (process.env.NODE_ENV !== "production") {
87
+ assert!.isType(options.cacheName, "string", {
88
+ moduleName: "serwist/plugins",
89
+ className: "BroadcastCacheUpdate",
90
+ funcName: "notifyIfUpdated",
91
+ paramName: "cacheName",
92
+ });
93
+ assert!.isInstance(options.newResponse, Response, {
94
+ moduleName: "serwist/plugins",
95
+ className: "BroadcastCacheUpdate",
96
+ funcName: "notifyIfUpdated",
97
+ paramName: "newResponse",
98
+ });
99
+ assert!.isInstance(options.request, Request, {
100
+ moduleName: "serwist/plugins",
101
+ className: "BroadcastCacheUpdate",
102
+ funcName: "notifyIfUpdated",
103
+ paramName: "request",
104
+ });
105
+ }
106
+
107
+ // Without two responses there is nothing to compare.
108
+ if (!options.oldResponse) {
109
+ return;
110
+ }
111
+
112
+ if (!responsesAreSame(options.oldResponse, options.newResponse, this._headersToCheck)) {
113
+ if (process.env.NODE_ENV !== "production") {
114
+ logger.log("Newer response found (and cached) for:", options.request.url);
115
+ }
116
+
117
+ const messageData = {
118
+ type: CACHE_UPDATED_MESSAGE_TYPE,
119
+ meta: CACHE_UPDATED_MESSAGE_META,
120
+ payload: this._generatePayload(options),
121
+ } satisfies BroadcastMessage;
122
+
123
+ // For navigation requests, wait until the new window client exists
124
+ // before sending the message
125
+ if (options.request.mode === "navigate") {
126
+ let resultingClientId: string | undefined;
127
+ if (options.event instanceof FetchEvent) {
128
+ resultingClientId = options.event.resultingClientId;
129
+ }
130
+
131
+ const resultingWin = await resultingClientExists(resultingClientId);
132
+
133
+ // Safari does not currently implement postMessage buffering and
134
+ // there's no good way to feature detect that, so to increase the
135
+ // chances of the message being delivered in Safari, we add a timeout.
136
+ // We also do this if `resultingClientExists()` didn't return a client,
137
+ // which means it timed out, so it's worth waiting a bit longer.
138
+ if (!resultingWin || isSafari) {
139
+ // 3500 is chosen because (according to CrUX data) 80% of mobile
140
+ // websites hit the DOMContentLoaded event in less than 3.5 seconds.
141
+ // And presumably sites implementing service worker are on the
142
+ // higher end of the performance spectrum.
143
+ await timeout(3500);
144
+ }
145
+ }
146
+
147
+ if (this._notifyAllClients) {
148
+ const windows = await self.clients.matchAll({ type: "window" });
149
+ for (const win of windows) {
150
+ win.postMessage(messageData);
151
+ }
152
+ } else {
153
+ // See https://github.com/GoogleChrome/workbox/issues/2895
154
+ if (options.event instanceof FetchEvent) {
155
+ const client = await self.clients.get(options.event.clientId);
156
+ client?.postMessage(messageData);
157
+ }
158
+ }
159
+ }
160
+ }
161
+ }
@@ -0,0 +1,42 @@
1
+ /*
2
+ Copyright 2018 Google LLC
3
+
4
+ Use of this source code is governed by an MIT-style
5
+ license that can be found in the LICENSE file or at
6
+ https://opensource.org/licenses/MIT.
7
+ */
8
+
9
+ import type { CacheDidUpdateCallbackParam, SerwistPlugin } from "../../types.js";
10
+ import { BroadcastCacheUpdate } from "./BroadcastCacheUpdate.js";
11
+ import type { BroadcastCacheUpdateOptions } from "./types.js";
12
+
13
+ /**
14
+ * A class implementing the `cacheDidUpdate` lifecycle callback. It will automatically
15
+ * broadcast a message whenever a cached response is updated.
16
+ */
17
+ export class BroadcastUpdatePlugin implements SerwistPlugin {
18
+ private readonly _broadcastUpdate: BroadcastCacheUpdate;
19
+
20
+ /**
21
+ * Construct a `serwist/plugins.BroadcastCacheUpdate` instance with
22
+ * the passed options and calls its `notifyIfUpdated` method whenever the
23
+ * plugin's `cacheDidUpdate` callback is invoked.
24
+ *
25
+ * @param options
26
+ */
27
+ constructor(options?: BroadcastCacheUpdateOptions) {
28
+ this._broadcastUpdate = new BroadcastCacheUpdate(options);
29
+ }
30
+
31
+ /**
32
+ * A "lifecycle" callback that will be triggered automatically by
33
+ * `@serwist/build.RuntimeCaching` handlers when an entry is
34
+ * added to a cache.
35
+ *
36
+ * @private
37
+ * @param options The input object to this function.
38
+ */
39
+ cacheDidUpdate(options: CacheDidUpdateCallbackParam) {
40
+ void this._broadcastUpdate.notifyIfUpdated(options);
41
+ }
42
+ }
@@ -0,0 +1,12 @@
1
+ /*
2
+ Copyright 2018 Google LLC
3
+
4
+ Use of this source code is governed by an MIT-style
5
+ license that can be found in the LICENSE file or at
6
+ https://opensource.org/licenses/MIT.
7
+ */
8
+
9
+ export const CACHE_UPDATED_MESSAGE_TYPE = "CACHE_UPDATED";
10
+ export const CACHE_UPDATED_MESSAGE_META = "serwist-broadcast-update";
11
+ export const defaultNotifyAllClients = true;
12
+ export const defaultHeadersToCheck = ["content-length", "etag", "last-modified"];
@@ -0,0 +1,49 @@
1
+ /*
2
+ Copyright 2018 Google LLC
3
+
4
+ Use of this source code is governed by an MIT-style
5
+ license that can be found in the LICENSE file or at
6
+ https://opensource.org/licenses/MIT.
7
+ */
8
+
9
+ import { SerwistError } from "../../utils/SerwistError.js";
10
+ import { logger } from "../../utils/logger.js";
11
+
12
+ /**
13
+ * Given two responses, compares several header values to see if they are
14
+ * the same or not.
15
+ *
16
+ * @param firstResponse The first response.
17
+ * @param secondResponse The second response.
18
+ * @param headersToCheck A list of headers to check.
19
+ * @returns
20
+ */
21
+ export const responsesAreSame = (firstResponse: Response, secondResponse: Response, headersToCheck: string[]): boolean => {
22
+ if (process.env.NODE_ENV !== "production") {
23
+ if (!(firstResponse instanceof Response && secondResponse instanceof Response)) {
24
+ throw new SerwistError("invalid-responses-are-same-args");
25
+ }
26
+ }
27
+
28
+ const atLeastOneHeaderAvailable = headersToCheck.some((header) => {
29
+ return firstResponse.headers.has(header) && secondResponse.headers.has(header);
30
+ });
31
+
32
+ if (!atLeastOneHeaderAvailable) {
33
+ if (process.env.NODE_ENV !== "production") {
34
+ logger.warn("Unable to determine where the response has been updated because none of the headers that would be checked are present.");
35
+ logger.debug("Attempting to compare the following: ", firstResponse, secondResponse, headersToCheck);
36
+ }
37
+
38
+ // Just return true, indicating the that responses are the same, since we
39
+ // can't determine otherwise.
40
+ return true;
41
+ }
42
+
43
+ return headersToCheck.every((header) => {
44
+ const headerStateComparison = firstResponse.headers.has(header) === secondResponse.headers.has(header);
45
+ const headerValueComparison = firstResponse.headers.get(header) === secondResponse.headers.get(header);
46
+
47
+ return headerStateComparison && headerValueComparison;
48
+ });
49
+ };
@@ -0,0 +1,37 @@
1
+ import type { CacheDidUpdateCallbackParam } from "../../types.js";
2
+ import type { CACHE_UPDATED_MESSAGE_META, CACHE_UPDATED_MESSAGE_TYPE } from "./constants.js";
3
+
4
+ export interface BroadcastCacheUpdateOptions {
5
+ /**
6
+ * A list of headers that will be used to determine whether the responses
7
+ * differ.
8
+ *
9
+ * @default ['content-length', 'etag', 'last-modified']
10
+ */
11
+ headersToCheck?: string[];
12
+ /**
13
+ * A function whose return value
14
+ * will be used as the `payload` field in any cache update messages sent
15
+ * to the window clients.
16
+ * @param options
17
+ * @returns
18
+ */
19
+ generatePayload?: (options: CacheDidUpdateCallbackParam) => Record<string, any>;
20
+ /**
21
+ * If `true` (the default) then all open clients will receive a message. If `false`,
22
+ * then only the client that make the original request will be notified of the update.
23
+ *
24
+ * @default true
25
+ */
26
+ notifyAllClients?: boolean;
27
+ }
28
+
29
+ export type BroadcastPayload = Record<string, any>;
30
+
31
+ export type BroadcastPayloadGenerator = (options: CacheDidUpdateCallbackParam) => BroadcastPayload;
32
+
33
+ export interface BroadcastMessage {
34
+ type: typeof CACHE_UPDATED_MESSAGE_TYPE;
35
+ meta: typeof CACHE_UPDATED_MESSAGE_META;
36
+ payload: BroadcastPayload;
37
+ }