tiny-essentials 1.28.18 â 1.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/changelog/1/28/19.md +24 -0
- package/changelog/1/29/0.md +58 -0
- package/dist/v1/ColorSafeStringify.min.js +1 -1
- package/dist/v1/TinyAdvancedRaffle.min.js +1 -1
- package/dist/v1/TinyAfterScrollWatcher.min.js +1 -1
- package/dist/v1/TinyAnalogClock.min.js +1 -1
- package/dist/v1/TinyArrayComparator.min.js +1 -1
- package/dist/v1/TinyArrayPaginator.min.js +1 -1
- package/dist/v1/TinyBasicsEs.min.js +1 -1
- package/dist/v1/TinyBrowserMonitor.min.js +1 -0
- package/dist/v1/TinyClassManager.min.js +1 -1
- package/dist/v1/TinyClipboard.min.js +1 -1
- package/dist/v1/TinyCloner.min.js +1 -0
- package/dist/v1/TinyColorConverter.min.js +1 -1
- package/dist/v1/TinyColorValidator.min.js +1 -1
- package/dist/v1/TinyCookieConsent.min.js +1 -1
- package/dist/v1/TinyDayNightCycle.min.js +1 -1
- package/dist/v1/TinyDebugger.min.js +1 -1
- package/dist/v1/TinyDomReadyManager.min.js +1 -1
- package/dist/v1/TinyDragDropDetector.min.js +1 -1
- package/dist/v1/TinyDragger.min.js +1 -1
- package/dist/v1/TinyElementObserver.min.js +1 -1
- package/dist/v1/TinyEssentials.min.js +1 -1
- package/dist/v1/TinyGamepad.min.js +1 -1
- package/dist/v1/TinyHtml.min.js +1 -1
- package/dist/v1/TinyHtmlTagRegexBuilder.min.js +1 -0
- package/dist/v1/TinyHttpResponseRegistry.min.js +1 -0
- package/dist/v1/TinyI18.min.js +1 -1
- package/dist/v1/TinyIframeEvents.min.js +1 -1
- package/dist/v1/TinyInventory.min.js +1 -1
- package/dist/v1/TinyInventoryTrader.min.js +1 -1
- package/dist/v1/TinyLevelUp.min.js +1 -1
- package/dist/v1/TinyLoadingScreen.min.js +1 -1
- package/dist/v1/TinyLocalStorage.min.js +1 -1
- package/dist/v1/TinyMaInSys.min.js +1 -1
- package/dist/v1/TinyMapCache.min.js +1 -0
- package/dist/v1/TinyMediaPlayer.min.js +1 -1
- package/dist/v1/TinyNeedBar.min.js +1 -1
- package/dist/v1/TinyNewWinEvents.min.js +1 -1
- package/dist/v1/TinyNotificationAdapter.min.js +1 -0
- package/dist/v1/TinyNotifications.min.js +1 -1
- package/dist/v1/TinyNotifyCenter.min.js +1 -1
- package/dist/v1/TinyOPFSFileSystem.min.js +1 -0
- package/dist/v1/TinyPasswordValidator.min.js +1 -0
- package/dist/v1/TinyPluginPackage.min.js +1 -0
- package/dist/v1/TinyPromiseQueue.min.js +1 -1
- package/dist/v1/TinyPushManager.min.js +1 -0
- package/dist/v1/TinyPushPayload.min.js +1 -0
- package/dist/v1/TinyPushRouter.min.js +1 -0
- package/dist/v1/TinyRadioFm.min.js +1 -1
- package/dist/v1/TinyRateLimiter.min.js +1 -1
- package/dist/v1/TinyRegexEs.min.js +1 -0
- package/dist/v1/TinyRouter.min.js +1 -0
- package/dist/v1/TinyServiceWorker.min.js +1 -0
- package/dist/v1/TinyServiceWorkerEngine.min.js +1 -0
- package/dist/v1/TinySetMapPackage.min.js +1 -0
- package/dist/v1/TinySimpleDice.min.js +1 -1
- package/dist/v1/TinySmartScroller.min.js +1 -1
- package/dist/v1/TinyStorageBucketFileSystem.min.js +1 -0
- package/dist/v1/TinyTextDiffer.min.js +1 -1
- package/dist/v1/TinyTextRangeEditor.min.js +1 -1
- package/dist/v1/TinyTextarea.min.js +1 -1
- package/dist/v1/TinyThrottledApi.min.js +1 -0
- package/dist/v1/TinyTimeout.min.js +1 -1
- package/dist/v1/TinyToastNotify.min.js +1 -1
- package/dist/v1/TinyUploadClicker.min.js +1 -1
- package/dist/v1/TinyUriParser.min.js +1 -0
- package/dist/v1/TinyVersion.min.js +1 -0
- package/dist/v1/TinyWebWorker.min.js +1 -0
- package/dist/v1/TinyWebWorkerEngine.min.js +1 -0
- package/dist/v1/UltraRandomMsgGen.min.js +1 -1
- package/dist/v1/basics/array.cjs +2 -2
- package/dist/v1/basics/array.d.mts +2 -0
- package/dist/v1/basics/array.d.mts.map +1 -1
- package/dist/v1/basics/array.mjs +2 -1
- package/dist/v1/basics/browserDetector.cjs +37 -12
- package/dist/v1/basics/browserDetector.d.mts +8 -0
- package/dist/v1/basics/browserDetector.d.mts.map +1 -1
- package/dist/v1/basics/browserDetector.mjs +32 -13
- package/dist/v1/basics/crypto.cjs +23 -0
- package/dist/v1/basics/crypto.d.mts +10 -0
- package/dist/v1/basics/crypto.d.mts.map +1 -0
- package/dist/v1/basics/crypto.mjs +18 -0
- package/dist/v1/basics/html.cjs +0 -3
- package/dist/v1/basics/html.d.mts.map +1 -1
- package/dist/v1/basics/html.mjs +0 -2
- package/dist/v1/basics/index.cjs +8 -1
- package/dist/v1/basics/index.d.mts +6 -5
- package/dist/v1/basics/index.d.mts.map +1 -1
- package/dist/v1/basics/index.mjs +6 -5
- package/dist/v1/basics/objChecker.cjs +88 -0
- package/dist/v1/basics/objChecker.d.mts +26 -0
- package/dist/v1/basics/objChecker.d.mts.map +1 -1
- package/dist/v1/basics/objChecker.mjs +74 -0
- package/dist/v1/basics/objFilter.cjs +234 -93
- package/dist/v1/basics/objFilter.d.mts +96 -22
- package/dist/v1/basics/objFilter.d.mts.map +1 -1
- package/dist/v1/basics/objFilter.mjs +216 -92
- package/dist/v1/basics/promiseUtils.cjs +48 -12
- package/dist/v1/basics/promiseUtils.d.mts +45 -12
- package/dist/v1/basics/promiseUtils.d.mts.map +1 -1
- package/dist/v1/basics/promiseUtils.mjs +47 -12
- package/dist/v1/basics/text.cjs +0 -12
- package/dist/v1/basics/text.d.mts +0 -10
- package/dist/v1/basics/text.d.mts.map +1 -1
- package/dist/v1/basics/text.mjs +0 -10
- package/dist/v1/css/TinyCookieConsent.min.css +1 -0
- package/dist/v1/css/TinyCookieConsent.min.css.map +1 -0
- package/dist/v1/css/TinyDraggerExample.min.css +1 -0
- package/dist/v1/css/TinyDraggerExample.min.css.map +1 -0
- package/dist/v1/css/TinyLoadingScreen.min.css +1 -0
- package/dist/v1/css/TinyLoadingScreen.min.css.map +1 -0
- package/dist/v1/css/TinyNotify.min.css +1 -0
- package/dist/v1/css/TinyNotify.min.css.map +1 -0
- package/dist/v1/css/aiMarker.min.css +1 -0
- package/dist/v1/css/aiMarker.min.css.map +1 -0
- package/dist/v1/index.cjs +88 -3
- package/dist/v1/index.d.mts +31 -6
- package/dist/v1/index.d.mts.map +1 -1
- package/dist/v1/index.mjs +32 -7
- package/dist/v1/jsdoc/EventEmitter.cjs +4 -0
- package/dist/v1/jsdoc/EventEmitter.d.mts +33 -0
- package/dist/v1/jsdoc/EventEmitter.d.mts.map +1 -0
- package/dist/v1/jsdoc/EventEmitter.mjs +18 -0
- package/dist/v1/libs/array/TinyArrayComparator.cjs +240 -25
- package/dist/v1/libs/array/TinyArrayComparator.d.mts +130 -22
- package/dist/v1/libs/array/TinyArrayComparator.d.mts.map +1 -1
- package/dist/v1/libs/array/TinyArrayComparator.mjs +210 -24
- package/dist/v1/libs/fs/constants.cjs +74 -0
- package/dist/v1/libs/fs/constants.d.mts +22 -0
- package/dist/v1/libs/fs/constants.d.mts.map +1 -0
- package/dist/v1/libs/fs/constants.mjs +53 -0
- package/dist/v1/libs/fs/encoding.cjs +118 -0
- package/dist/v1/libs/fs/encoding.d.mts +50 -0
- package/dist/v1/libs/fs/encoding.d.mts.map +1 -0
- package/dist/v1/libs/fs/encoding.mjs +102 -0
- package/dist/v1/libs/fs/error.cjs +188 -0
- package/dist/v1/libs/fs/error.d.mts +105 -0
- package/dist/v1/libs/fs/error.d.mts.map +1 -0
- package/dist/v1/libs/fs/error.mjs +158 -0
- package/dist/v1/libs/fs/handle.cjs +121 -0
- package/dist/v1/libs/fs/handle.d.mts +56 -0
- package/dist/v1/libs/fs/handle.d.mts.map +1 -0
- package/dist/v1/libs/fs/handle.mjs +100 -0
- package/dist/v1/libs/fs/index.cjs +700 -0
- package/dist/v1/libs/fs/index.d.mts +377 -0
- package/dist/v1/libs/fs/index.d.mts.map +1 -0
- package/dist/v1/libs/fs/index.mjs +630 -0
- package/dist/v1/libs/fs/path.cjs +234 -0
- package/dist/v1/libs/fs/path.d.mts +176 -0
- package/dist/v1/libs/fs/path.d.mts.map +1 -0
- package/dist/v1/libs/fs/path.mjs +197 -0
- package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.cjs +202 -0
- package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.d.mts +121 -0
- package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.d.mts.map +1 -0
- package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.mjs +172 -0
- package/dist/v1/libs/fs/plugins/OPFS/index.cjs +334 -0
- package/dist/v1/libs/fs/plugins/OPFS/index.d.mts +98 -0
- package/dist/v1/libs/fs/plugins/OPFS/index.d.mts.map +1 -0
- package/dist/v1/libs/fs/plugins/OPFS/index.mjs +300 -0
- package/dist/v1/libs/fs/stats.cjs +245 -0
- package/dist/v1/libs/fs/stats.d.mts +226 -0
- package/dist/v1/libs/fs/stats.d.mts.map +1 -0
- package/dist/v1/libs/fs/stats.mjs +197 -0
- package/dist/v1/libs/html/events/TinyIframeEvents.cjs +10 -1
- package/dist/v1/libs/html/events/TinyIframeEvents.d.mts +9 -2
- package/dist/v1/libs/html/events/TinyIframeEvents.d.mts.map +1 -1
- package/dist/v1/libs/html/events/TinyIframeEvents.mjs +8 -1
- package/dist/v1/libs/html/events/TinyNewWinEvents.cjs +14 -3
- package/dist/v1/libs/html/events/TinyNewWinEvents.d.mts +21 -5
- package/dist/v1/libs/html/events/TinyNewWinEvents.d.mts.map +1 -1
- package/dist/v1/libs/html/events/TinyNewWinEvents.mjs +12 -3
- package/dist/v1/libs/html/scroll/TinySmartScroller.cjs +13 -1
- package/dist/v1/libs/html/scroll/TinySmartScroller.d.mts +29 -2
- package/dist/v1/libs/html/scroll/TinySmartScroller.d.mts.map +1 -1
- package/dist/v1/libs/html/scroll/TinySmartScroller.mjs +11 -1
- package/dist/v1/libs/math/TinyAdvancedRaffle.cjs +13 -1
- package/dist/v1/libs/math/TinyAdvancedRaffle.d.mts +32 -2
- package/dist/v1/libs/math/TinyAdvancedRaffle.d.mts.map +1 -1
- package/dist/v1/libs/math/TinyAdvancedRaffle.mjs +11 -1
- package/dist/v1/libs/math/TinyTimeout.cjs +0 -14
- package/dist/v1/libs/math/TinyTimeout.d.mts +0 -11
- package/dist/v1/libs/math/TinyTimeout.d.mts.map +1 -1
- package/dist/v1/libs/math/TinyTimeout.mjs +0 -13
- package/dist/v1/libs/media/TinyMediaPlayer/index.cjs +25 -1
- package/dist/v1/libs/media/TinyMediaPlayer/index.d.mts +35 -2
- package/dist/v1/libs/media/TinyMediaPlayer/index.d.mts.map +1 -1
- package/dist/v1/libs/media/TinyMediaPlayer/index.mjs +23 -1
- package/dist/v1/libs/media/TinyMediaPlayer.cjs +2 -2
- package/dist/v1/libs/media/TinyMediaPlayer.d.mts +2 -2
- package/dist/v1/libs/media/TinyMediaPlayer.d.mts.map +1 -1
- package/dist/v1/libs/media/TinyMediaPlayer.mjs +2 -2
- package/dist/v1/libs/media/TinyRadioFm.cjs +19 -1
- package/dist/v1/libs/media/TinyRadioFm.d.mts +78 -2
- package/dist/v1/libs/media/TinyRadioFm.d.mts.map +1 -1
- package/dist/v1/libs/media/TinyRadioFm.mjs +17 -1
- package/dist/v1/libs/plugin/TinyPlugin.cjs +1630 -0
- package/dist/v1/libs/plugin/TinyPlugin.d.mts +753 -0
- package/dist/v1/libs/plugin/TinyPlugin.d.mts.map +1 -0
- package/dist/v1/libs/plugin/TinyPlugin.mjs +1376 -0
- package/dist/v1/libs/plugin/TinyVersion.cjs +204 -0
- package/dist/v1/libs/plugin/TinyVersion.d.mts +70 -0
- package/dist/v1/libs/plugin/TinyVersion.d.mts.map +1 -0
- package/dist/v1/libs/plugin/TinyVersion.mjs +179 -0
- package/dist/v1/libs/router/TinyRouter.cjs +661 -0
- package/dist/v1/libs/router/TinyRouter.d.mts +320 -0
- package/dist/v1/libs/router/TinyRouter.d.mts.map +1 -0
- package/dist/v1/libs/router/TinyRouter.mjs +572 -0
- package/dist/v1/libs/storage/TinyLocalStorage.cjs +20 -1
- package/dist/v1/libs/storage/TinyLocalStorage.d.mts +64 -2
- package/dist/v1/libs/storage/TinyLocalStorage.d.mts.map +1 -1
- package/dist/v1/libs/storage/TinyLocalStorage.mjs +18 -1
- package/dist/v1/libs/storage/TinyMapCache.cjs +373 -0
- package/dist/v1/libs/storage/TinyMapCache.d.mts +274 -0
- package/dist/v1/libs/storage/TinyMapCache.d.mts.map +1 -0
- package/dist/v1/libs/storage/TinyMapCache.mjs +333 -0
- package/dist/v1/libs/storage/TinySetMapDatabase.cjs +1167 -0
- package/dist/v1/libs/storage/TinySetMapDatabase.d.mts +603 -0
- package/dist/v1/libs/storage/TinySetMapDatabase.d.mts.map +1 -0
- package/dist/v1/libs/storage/TinySetMapDatabase.mjs +1059 -0
- package/dist/v1/libs/sw/browser/TinyNotificationAdapter.cjs +126 -0
- package/dist/v1/libs/sw/browser/TinyNotificationAdapter.d.mts +132 -0
- package/dist/v1/libs/sw/browser/TinyNotificationAdapter.d.mts.map +1 -0
- package/dist/v1/libs/sw/browser/TinyNotificationAdapter.mjs +109 -0
- package/dist/v1/libs/sw/browser/TinyPushManager.cjs +310 -0
- package/dist/v1/libs/sw/browser/TinyPushManager.d.mts +168 -0
- package/dist/v1/libs/sw/browser/TinyPushManager.d.mts.map +1 -0
- package/dist/v1/libs/sw/browser/TinyPushManager.mjs +264 -0
- package/dist/v1/libs/sw/browser/TinyServiceWorker.cjs +1060 -0
- package/dist/v1/libs/sw/browser/TinyServiceWorker.d.mts +348 -0
- package/dist/v1/libs/sw/browser/TinyServiceWorker.d.mts.map +1 -0
- package/dist/v1/libs/sw/browser/TinyServiceWorker.mjs +933 -0
- package/dist/v1/libs/sw/browser/plugins/TabManager.cjs +315 -0
- package/dist/v1/libs/sw/browser/plugins/TabManager.d.mts +178 -0
- package/dist/v1/libs/sw/browser/plugins/TabManager.d.mts.map +1 -0
- package/dist/v1/libs/sw/browser/plugins/TabManager.mjs +274 -0
- package/dist/v1/libs/sw/browser/utils.cjs +28 -0
- package/dist/v1/libs/sw/browser/utils.d.mts +8 -0
- package/dist/v1/libs/sw/browser/utils.d.mts.map +1 -0
- package/dist/v1/libs/sw/browser/utils.mjs +21 -0
- package/dist/v1/libs/sw/service/TinyPushRouter.cjs +222 -0
- package/dist/v1/libs/sw/service/TinyPushRouter.d.mts +138 -0
- package/dist/v1/libs/sw/service/TinyPushRouter.d.mts.map +1 -0
- package/dist/v1/libs/sw/service/TinyPushRouter.mjs +201 -0
- package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.cjs +3016 -0
- package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.d.mts +993 -0
- package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.d.mts.map +1 -0
- package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.mjs +2558 -0
- package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.cjs +88 -0
- package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.d.mts +32 -0
- package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.d.mts.map +1 -0
- package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.mjs +69 -0
- package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.cjs +112 -0
- package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.d.mts +31 -0
- package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.d.mts.map +1 -0
- package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.mjs +91 -0
- package/dist/v1/libs/sw/service/plugins/Ping.cjs +32 -0
- package/dist/v1/libs/sw/service/plugins/Ping.d.mts +9 -0
- package/dist/v1/libs/sw/service/plugins/Ping.d.mts.map +1 -0
- package/dist/v1/libs/sw/service/plugins/Ping.mjs +25 -0
- package/dist/v1/libs/sw/service/plugins/TabManager.cjs +457 -0
- package/dist/v1/libs/sw/service/plugins/TabManager.d.mts +91 -0
- package/dist/v1/libs/sw/service/plugins/TabManager.d.mts.map +1 -0
- package/dist/v1/libs/sw/service/plugins/TabManager.mjs +372 -0
- package/dist/v1/libs/sw/service/plugins/ViteFileDetector.cjs +180 -0
- package/dist/v1/libs/sw/service/plugins/ViteFileDetector.d.mts +28 -0
- package/dist/v1/libs/sw/service/plugins/ViteFileDetector.d.mts.map +1 -0
- package/dist/v1/libs/sw/service/plugins/ViteFileDetector.mjs +148 -0
- package/dist/v1/libs/sw/service/shared/TinyPushPayload.cjs +199 -0
- package/dist/v1/libs/sw/service/shared/TinyPushPayload.d.mts +80 -0
- package/dist/v1/libs/sw/service/shared/TinyPushPayload.d.mts.map +1 -0
- package/dist/v1/libs/sw/service/shared/TinyPushPayload.mjs +174 -0
- package/dist/v1/libs/sw/utils.cjs +57 -0
- package/dist/v1/libs/sw/utils.d.mts +173 -0
- package/dist/v1/libs/sw/utils.d.mts.map +1 -0
- package/dist/v1/libs/sw/utils.mjs +50 -0
- package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.cjs +57 -0
- package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.d.mts +39 -0
- package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.d.mts.map +1 -0
- package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.mjs +48 -0
- package/dist/v1/libs/text/TinyI18/Browser.cjs +64 -0
- package/dist/v1/libs/text/TinyI18/Browser.d.mts +47 -0
- package/dist/v1/libs/text/TinyI18/Browser.d.mts.map +1 -0
- package/dist/v1/libs/text/TinyI18/Browser.mjs +57 -0
- package/dist/v1/libs/text/TinyI18/Node.cjs +49 -0
- package/dist/v1/libs/text/TinyI18/Node.d.mts +38 -0
- package/dist/v1/libs/text/TinyI18/Node.d.mts.map +1 -0
- package/dist/v1/libs/text/TinyI18/Node.mjs +43 -0
- package/dist/v1/libs/text/TinyI18/browser-utils.cjs +17 -0
- package/dist/v1/libs/text/TinyI18/browser-utils.d.mts +8 -0
- package/dist/v1/libs/text/TinyI18/browser-utils.d.mts.map +1 -0
- package/dist/v1/libs/text/TinyI18/browser-utils.mjs +13 -0
- package/dist/v1/libs/text/{TinyI18.cjs â TinyI18/index.cjs} +205 -104
- package/dist/v1/libs/text/{TinyI18.d.mts â TinyI18/index.d.mts} +141 -92
- package/dist/v1/libs/text/TinyI18/index.d.mts.map +1 -0
- package/dist/v1/libs/text/{TinyI18.mjs â TinyI18/index.mjs} +195 -101
- package/dist/v1/libs/tools/TinyBrowserMonitor.cjs +1088 -0
- package/dist/v1/libs/tools/TinyBrowserMonitor.d.mts +621 -0
- package/dist/v1/libs/tools/TinyBrowserMonitor.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyBrowserMonitor.mjs +940 -0
- package/dist/v1/libs/tools/TinyDebugger.cjs +180 -19
- package/dist/v1/libs/tools/TinyDebugger.d.mts +220 -24
- package/dist/v1/libs/tools/TinyDebugger.d.mts.map +1 -1
- package/dist/v1/libs/tools/TinyDebugger.mjs +161 -19
- package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.cjs +256 -0
- package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.d.mts +125 -0
- package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.mjs +223 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.cjs +23 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.d.mts +17 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.mjs +19 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.cjs +23 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.d.mts +17 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.mjs +19 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.cjs +390 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.d.mts +9 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.mjs +387 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.cjs +2 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.d.mts +27 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.mjs +12 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/LICENSE +53 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.cjs +405 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.d.mts +34 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.mjs +342 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.cjs +23 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.d.mts +17 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.mjs +19 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.cjs +327 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.d.mts +9 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.mjs +324 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.cjs +268 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.d.mts +107 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.mjs +238 -0
- package/dist/v1/libs/tools/TinyPasswordValidator.cjs +491 -0
- package/dist/v1/libs/tools/TinyPasswordValidator.d.mts +246 -0
- package/dist/v1/libs/tools/TinyPasswordValidator.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyPasswordValidator.mjs +434 -0
- package/dist/v1/libs/tools/TinyPkgExportValidator.cjs +48 -0
- package/dist/v1/libs/tools/TinyPkgExportValidator.d.mts +14 -0
- package/dist/v1/libs/tools/TinyPkgExportValidator.d.mts.map +1 -1
- package/dist/v1/libs/tools/TinyPkgExportValidator.mjs +44 -0
- package/dist/v1/libs/tools/TinySiteMap.cjs +1029 -0
- package/dist/v1/libs/tools/TinySiteMap.d.mts +429 -0
- package/dist/v1/libs/tools/TinySiteMap.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinySiteMap.mjs +910 -0
- package/dist/v1/libs/tools/TinySiteMapStream.cjs +121 -0
- package/dist/v1/libs/tools/TinySiteMapStream.d.mts +51 -0
- package/dist/v1/libs/tools/TinySiteMapStream.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinySiteMapStream.mjs +85 -0
- package/dist/v1/libs/tools/TinyURLSecurityVerifier.cjs +444 -0
- package/dist/v1/libs/tools/TinyURLSecurityVerifier.d.mts +217 -0
- package/dist/v1/libs/tools/TinyURLSecurityVerifier.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyURLSecurityVerifier.mjs +394 -0
- package/dist/v1/libs/tools/TinyUriParser/BlueSky.cjs +613 -0
- package/dist/v1/libs/tools/TinyUriParser/BlueSky.d.mts +152 -0
- package/dist/v1/libs/tools/TinyUriParser/BlueSky.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyUriParser/BlueSky.mjs +527 -0
- package/dist/v1/libs/tools/TinyUriParser/Discord.cjs +1119 -0
- package/dist/v1/libs/tools/TinyUriParser/Discord.d.mts +306 -0
- package/dist/v1/libs/tools/TinyUriParser/Discord.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyUriParser/Discord.mjs +968 -0
- package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.cjs +469 -0
- package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.d.mts +80 -0
- package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.mjs +379 -0
- package/dist/v1/libs/tools/TinyUriParser.cjs +217 -0
- package/dist/v1/libs/tools/TinyUriParser.d.mts +109 -0
- package/dist/v1/libs/tools/TinyUriParser.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyUriParser.mjs +183 -0
- package/dist/v1/libs/utils/TinyCloner.cjs +466 -0
- package/dist/v1/libs/utils/TinyCloner.d.mts +221 -0
- package/dist/v1/libs/utils/TinyCloner.d.mts.map +1 -0
- package/dist/v1/libs/utils/TinyCloner.mjs +416 -0
- package/dist/v1/libs/utils/TinyPromiseQueue.cjs +1 -1
- package/dist/v1/libs/utils/TinyPromiseQueue.d.mts +2 -2
- package/dist/v1/libs/utils/TinyPromiseQueue.d.mts.map +1 -1
- package/dist/v1/libs/utils/TinyPromiseQueue.mjs +1 -1
- package/dist/v1/libs/utils/TinyThrottledApi.cjs +333 -0
- package/dist/v1/libs/utils/TinyThrottledApi.d.mts +163 -0
- package/dist/v1/libs/utils/TinyThrottledApi.d.mts.map +1 -0
- package/dist/v1/libs/utils/TinyThrottledApi.mjs +294 -0
- package/dist/v1/libs/worker/browser/TinyWebWorker.cjs +342 -0
- package/dist/v1/libs/worker/browser/TinyWebWorker.d.mts +97 -0
- package/dist/v1/libs/worker/browser/TinyWebWorker.d.mts.map +1 -0
- package/dist/v1/libs/worker/browser/TinyWebWorker.mjs +305 -0
- package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.cjs +346 -0
- package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.d.mts +127 -0
- package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.d.mts.map +1 -0
- package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.mjs +304 -0
- package/dist/v1/regexp/Email.cjs +185 -0
- package/dist/v1/regexp/Email.d.mts +73 -0
- package/dist/v1/regexp/Email.d.mts.map +1 -0
- package/dist/v1/regexp/Email.mjs +153 -0
- package/dist/v1/regexp/Glob.cjs +293 -0
- package/dist/v1/regexp/Glob.d.mts +45 -0
- package/dist/v1/regexp/Glob.d.mts.map +1 -0
- package/dist/v1/regexp/Glob.mjs +260 -0
- package/dist/v1/regexp/Ipv4.cjs +57 -0
- package/dist/v1/regexp/Ipv4.d.mts +29 -0
- package/dist/v1/regexp/Ipv4.d.mts.map +1 -0
- package/dist/v1/regexp/Ipv4.mjs +45 -0
- package/dist/v1/regexp/Ipv6.cjs +67 -0
- package/dist/v1/regexp/Ipv6.d.mts +29 -0
- package/dist/v1/regexp/Ipv6.d.mts.map +1 -0
- package/dist/v1/regexp/Ipv6.mjs +54 -0
- package/dist/v1/regexp/SegmentExtractor.cjs +145 -0
- package/dist/v1/regexp/SegmentExtractor.d.mts +91 -0
- package/dist/v1/regexp/SegmentExtractor.d.mts.map +1 -0
- package/dist/v1/regexp/SegmentExtractor.mjs +116 -0
- package/dist/v1/regexp/UrlDetector.cjs +125 -0
- package/dist/v1/regexp/UrlDetector.d.mts +67 -0
- package/dist/v1/regexp/UrlDetector.d.mts.map +1 -0
- package/dist/v1/regexp/UrlDetector.mjs +102 -0
- package/dist/v1/regexp/Username/index.cjs +233 -0
- package/dist/v1/regexp/Username/index.d.mts +77 -0
- package/dist/v1/regexp/Username/index.d.mts.map +1 -0
- package/dist/v1/regexp/Username/index.mjs +199 -0
- package/dist/v1/regexp/Username/jsDoc.cjs +2 -0
- package/dist/v1/regexp/Username/jsDoc.d.mts +57 -0
- package/dist/v1/regexp/Username/jsDoc.d.mts.map +1 -0
- package/dist/v1/regexp/Username/jsDoc.mjs +18 -0
- package/dist/v1/regexp/Username/templates/BlueSky.cjs +56 -0
- package/dist/v1/regexp/Username/templates/BlueSky.d.mts +35 -0
- package/dist/v1/regexp/Username/templates/BlueSky.d.mts.map +1 -0
- package/dist/v1/regexp/Username/templates/BlueSky.mjs +52 -0
- package/dist/v1/regexp/Username/templates/Discord.cjs +505 -0
- package/dist/v1/regexp/Username/templates/Discord.d.mts +209 -0
- package/dist/v1/regexp/Username/templates/Discord.d.mts.map +1 -0
- package/dist/v1/regexp/Username/templates/Discord.mjs +458 -0
- package/dist/v1/regexp/Username/templates/MatrixProtocol.cjs +143 -0
- package/dist/v1/regexp/Username/templates/MatrixProtocol.d.mts +70 -0
- package/dist/v1/regexp/Username/templates/MatrixProtocol.d.mts.map +1 -0
- package/dist/v1/regexp/Username/templates/MatrixProtocol.mjs +128 -0
- package/dist/v1/regexp/Username/templates/deprecated/Discord.cjs +24 -0
- package/dist/v1/regexp/Username/templates/deprecated/Discord.d.mts +17 -0
- package/dist/v1/regexp/Username/templates/deprecated/Discord.d.mts.map +1 -0
- package/dist/v1/regexp/Username/templates/deprecated/Discord.mjs +20 -0
- package/dist/v1/regexp/Username/templates/index.cjs +11 -0
- package/dist/v1/regexp/Username/templates/index.d.mts +5 -0
- package/dist/v1/regexp/Username/templates/index.d.mts.map +1 -0
- package/dist/v1/regexp/Username/templates/index.mjs +4 -0
- package/dist/v1/regexp/index.cjs +41 -0
- package/dist/v1/regexp/index.d.mts +9 -0
- package/dist/v1/regexp/index.d.mts.map +1 -0
- package/dist/v1/regexp/index.mjs +8 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.cjs +64 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.d.mts +11 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.d.mts.map +1 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.mjs +51 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.cjs +66 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.d.mts +11 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.d.mts.map +1 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.mjs +51 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.cjs +39 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.d.mts +11 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.d.mts.map +1 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.mjs +28 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.cjs +494 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.d.mts +142 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.d.mts.map +1 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.mjs +445 -0
- package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.cjs +725 -0
- package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.d.mts +293 -0
- package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.d.mts.map +1 -0
- package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.mjs +614 -0
- package/dist/v1/webTemplates/bootstrap/5.3/scss/input/Placeholder-Colors-Fix.scss +64 -0
- package/dist/v1/webTemplates/bootstrap/5.3/scss/spacing/Spacing-Plus.scss +31 -0
- package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.cjs +135 -0
- package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.d.mts +83 -0
- package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.d.mts.map +1 -0
- package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.mjs +120 -0
- package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.cjs +127 -0
- package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.d.mts +95 -0
- package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.d.mts.map +1 -0
- package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.mjs +109 -0
- package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.cjs +83 -0
- package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.d.mts +46 -0
- package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.d.mts.map +1 -0
- package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.mjs +71 -0
- package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.cjs +493 -0
- package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.d.mts +67 -0
- package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.d.mts.map +1 -0
- package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.mjs +399 -0
- package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.cjs +35 -0
- package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.d.mts +6 -0
- package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.d.mts.map +1 -0
- package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.mjs +29 -0
- package/docs/info/RegExp.md +74 -0
- package/docs/v1/Exports.md +111 -0
- package/docs/v1/README.md +117 -13
- package/docs/v1/basics/asyncReplace.md +2 -0
- package/docs/v1/basics/browserDetector.md +28 -11
- package/docs/v1/basics/crypto.md +85 -0
- package/docs/v1/basics/deprecated/html.md +2 -0
- package/docs/v1/basics/deprecated/objFilter.md +2 -0
- package/docs/v1/basics/html.md +2 -0
- package/docs/v1/basics/objChecker.md +55 -0
- package/docs/v1/basics/objFilter.md +57 -86
- package/docs/v1/basics/promiseUtils.md +12 -3
- package/docs/v1/basics/text.md +0 -1
- package/docs/v1/libs/array/TinyArrayComparator.md +50 -39
- package/docs/v1/libs/fs/TinyFS.md +752 -0
- package/docs/v1/libs/fs/TinyOPFSFileSystem.md +495 -0
- package/docs/v1/libs/fs/TinyStorageBucketFileSystem.md +407 -0
- package/docs/v1/libs/plugin/TinyPlugin.md +441 -0
- package/docs/v1/libs/plugin/TinyVersion.md +145 -0
- package/docs/v1/libs/router/TinyRouter.md +216 -0
- package/docs/v1/libs/storage/TinyMapCache.md +219 -0
- package/docs/v1/libs/storage/TinySetMapDatabase.md +478 -0
- package/docs/v1/libs/sw/browser/TinyNotificationAdapter.md +280 -0
- package/docs/v1/libs/sw/browser/TinyPushManager.md +782 -0
- package/docs/v1/libs/sw/browser/TinyServiceWorker.md +365 -0
- package/docs/v1/libs/sw/browser/plugins/TabManager.md +133 -0
- package/docs/v1/libs/sw/service/TinyPushRouter.md +314 -0
- package/docs/v1/libs/sw/service/TinyServiceWorkerEngine.md +748 -0
- package/docs/v1/libs/sw/service/plugins/GlobBypassPlugin.md +229 -0
- package/docs/v1/libs/sw/service/plugins/GlobCachePlugin.md +91 -0
- package/docs/v1/libs/sw/service/plugins/Ping.md +36 -0
- package/docs/v1/libs/sw/service/plugins/TabManager.md +64 -0
- package/docs/v1/libs/sw/service/plugins/ViteFileDetector.md +92 -0
- package/docs/v1/libs/sw/service/shared/TinyPushPayload.md +316 -0
- package/docs/v1/libs/text/TinyI18.md +80 -56
- package/docs/v1/libs/tools/TinyBrowserMonitor.md +170 -0
- package/docs/v1/libs/tools/TinyDebugger.md +117 -1
- package/docs/v1/libs/tools/TinyHtmlTagRegexBuilder.md +141 -0
- package/docs/v1/libs/tools/TinyHttpResponseRegistry.md +129 -0
- package/docs/v1/libs/tools/TinyPasswordValidator.md +153 -0
- package/docs/v1/libs/tools/TinyPkgExportValidator.md +45 -1
- package/docs/v1/libs/tools/TinySiteMap.md +134 -0
- package/docs/v1/libs/tools/TinySiteMapStream.md +97 -0
- package/docs/v1/libs/tools/TinyURLSecurityVerifier.md +146 -0
- package/docs/v1/libs/tools/TinyUriParser/Discord.md +374 -0
- package/docs/v1/libs/tools/TinyUriParser/MatrixProtocol.md +54 -0
- package/docs/v1/libs/tools/TinyUriParser.md +128 -0
- package/docs/v1/libs/utils/TinyCloner.md +126 -0
- package/docs/v1/libs/utils/TinyPromiseQueue.md +1 -1
- package/docs/v1/libs/utils/TinyThrottledApi.md +219 -0
- package/docs/v1/libs/worker/browser/TinyWebWorker.md +331 -0
- package/docs/v1/libs/worker/engine/TinyWebWorkerEngine.md +137 -0
- package/docs/v1/regexp/Email.md +127 -0
- package/docs/v1/regexp/Glob.md +155 -0
- package/docs/v1/regexp/IPv4.md +103 -0
- package/docs/v1/regexp/IPv6.md +122 -0
- package/docs/v1/regexp/SegmentExtractor.md +120 -0
- package/docs/v1/regexp/UrlDetector.md +117 -0
- package/docs/v1/regexp/Username/Base.md +131 -0
- package/docs/v1/regexp/Username/Discord.md +267 -0
- package/docs/v1/regexp/Username/MatrixProtocol.md +131 -0
- package/docs/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters.md +569 -0
- package/docs/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.md +174 -0
- package/docs/v1/webTemplates/media/MediaValidator/v1/Browser.md +123 -0
- package/docs/v1/webTemplates/media/MediaValidator/v1/Node.md +136 -0
- package/docs/v1/webTemplates/multiformats/14.0/IPFSHasher.md +310 -0
- package/docs/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.md +131 -0
- package/docs/v1/webTemplates/vite/7.3/plugins/githubUtils.md +50 -0
- package/package.json +313 -18
- package/types/EventEmitter.d.ts +48 -0
- package/dist/v1/libs/text/TinyI18.d.mts.map +0 -1
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
# đ TinyServiceWorker Documentation
|
|
2
|
+
|
|
3
|
+
Welcome to the official documentation for `TinyServiceWorker`. This module is a professional-grade utility designed to simplify the complexities of **Service Worker registration**, **PWA (Progressive Web App) lifecycle management**, and **bidirectional messaging**.
|
|
4
|
+
|
|
5
|
+
Instead of dealing with the verbose and often confusing native Service Worker API, `TinyServiceWorker` provides a clean, event-driven interface that handles versioning and memory management automatically.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## đ Table of Contents
|
|
10
|
+
1. [Overview](#overview)
|
|
11
|
+
2. [Getting Started](#getting-started)
|
|
12
|
+
3. [Core Features](#core-features)
|
|
13
|
+
- [Registration & Automatic Versioning](#registration--automatic-versioning)
|
|
14
|
+
- [Bidirectional Messaging](#bidirectional-messaging)
|
|
15
|
+
- [PWA Lifecycle & Installation](#pwa-lifecycle--installation)
|
|
16
|
+
4. [Event Reference](#event-reference)
|
|
17
|
+
- [Internal Lifecycle Events](#internal-lifecycle-events)
|
|
18
|
+
- [Custom Worker Messages](#custom-worker-messages)
|
|
19
|
+
5. [Memory Management](#memory-management)
|
|
20
|
+
6. [API Reference](#api-reference)
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## đ Overview
|
|
25
|
+
|
|
26
|
+
`TinyServiceWorker` acts as a bridge between your main application thread and the Service Worker. It is built upon `TinyDebugger` to provide excellent debugging capabilities and ensures that your application stays up-to-date without requiring manual user intervention for every small change.
|
|
27
|
+
|
|
28
|
+
**Key Benefits:**
|
|
29
|
+
* â
**Version Control:** Automatically detects when a new version of your app is available.
|
|
30
|
+
* â
**PWA Ready:** Built-in support for installation prompts and display mode detection.
|
|
31
|
+
* â
**Memory Safe:** Strict cleanup protocols to prevent memory leaks in long-running applications.
|
|
32
|
+
* â
**Type Safe:** Implements rigorous runtime validation to catch errors early.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## đ Getting Started
|
|
37
|
+
|
|
38
|
+
### 1. Installation & Import
|
|
39
|
+
Ensure that `TinyDebugger` and your utility functions are correctly mapped in your project structure.
|
|
40
|
+
|
|
41
|
+
```javascript
|
|
42
|
+
import TinyServiceWorker from 'tiny-essentials/libs/sw/browser/TinyServiceWorker';
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 2. Initialization
|
|
46
|
+
To use the service, create a new instance by providing a unique ID, the path to your worker file, and the current application version.
|
|
47
|
+
|
|
48
|
+
```javascript
|
|
49
|
+
const swManager = new TinyServiceWorker({
|
|
50
|
+
id: 'app_main_worker',
|
|
51
|
+
swUrl: '/sw.js',
|
|
52
|
+
version: '1.0.2', // Increment this when you deploy updates
|
|
53
|
+
debugMode: true,
|
|
54
|
+
useLogColors: true
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 3. Activation
|
|
59
|
+
The service worker will not start until you explicitly call the `.register()` method.
|
|
60
|
+
|
|
61
|
+
```javascript
|
|
62
|
+
await swManager.register();
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## ⨠Core Features
|
|
68
|
+
|
|
69
|
+
### đ Registration & Automatic Versioning
|
|
70
|
+
One of the most powerful features is the **Version Mismatch Detection**.
|
|
71
|
+
|
|
72
|
+
**How it works:**
|
|
73
|
+
1. The manager compares the `version` provided in the constructor with the version stored in `localStorage`.
|
|
74
|
+
2. If they differ, it emits the `sw:VersionUpdateAvailable` event.
|
|
75
|
+
3. It signals the current Service Worker to begin preparing for an update via `sw:PrepareUpdate`.
|
|
76
|
+
4. It registers the new worker with a cache-busting timestamp if `debugMode` is enabled.
|
|
77
|
+
|
|
78
|
+
### đŠ Bidirectional Messaging
|
|
79
|
+
Communicating with a Service Worker can be tricky. `TinyServiceWorker` makes it feel like standard event emitting.
|
|
80
|
+
|
|
81
|
+
#### **A. Sending messages (Main Thread âĄī¸ Service Worker)**
|
|
82
|
+
You can send data using a `type` and a `data` object.
|
|
83
|
+
|
|
84
|
+
```javascript
|
|
85
|
+
// Using postMessage (Full payload)
|
|
86
|
+
swManager.postMessage({
|
|
87
|
+
type: 'SYNC_DATA',
|
|
88
|
+
data: { userId: 123, status: 'active' }
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// Using "emitMessage" (Simplified)
|
|
92
|
+
swManager.emitMessage('LOG_EVENT', { message: 'User clicked button' });
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
#### **B. Receiving messages (Service Worker âĄī¸ Main Thread)**
|
|
96
|
+
Listen for messages sent from the worker using the `addEventListener` method.
|
|
97
|
+
|
|
98
|
+
```javascript
|
|
99
|
+
// Using addEventListener (Full payload)
|
|
100
|
+
swManager.addEventListener((event) => {
|
|
101
|
+
console.log('Message received from SW:', event.data.type, event.data.data);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
// Using "on" (Simplified)
|
|
105
|
+
swManager.on('PONG', ({ data, event }) => console.log(data));
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
#### **C. Receiving API Requests (Service Worker âĄī¸ Main Thread)**
|
|
109
|
+
Unlike standard events, an API request is a command that expects a response. The Service Worker sends a request, and `TinyServiceWorker` processes it in the Main Thread and automatically sends the result back.
|
|
110
|
+
|
|
111
|
+
**Implementation:**
|
|
112
|
+
Use `onApi` to register a handler. The callback must return the data you wish to send back to the Service Worker.
|
|
113
|
+
|
|
114
|
+
```javascript
|
|
115
|
+
// 1. Register a handler for a specific request type
|
|
116
|
+
swManager.onApi('FETCH_USER_SETTINGS', async ({ data, correlationId }) => {
|
|
117
|
+
// 'data' contains the payload sent by the Service Worker
|
|
118
|
+
// 'correlationId' is the unique identifier for this request
|
|
119
|
+
|
|
120
|
+
console.log(`Received request for: ${data.userId}`);
|
|
121
|
+
|
|
122
|
+
// You can return a plain object or a Promise
|
|
123
|
+
const settings = await database.getSettings(data.userId);
|
|
124
|
+
return settings;
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// 2. Remove the handler when it is no longer needed
|
|
128
|
+
swManager.offApi('FETCH_USER_SETTINGS');
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### đą PWA Lifecycle & Installation
|
|
132
|
+
The manager handles the "tricky" parts of being a Progressive Web App.
|
|
133
|
+
|
|
134
|
+
* **Installation Prompt:** You can trigger the native browser installation UI by calling `promptInstallation()`. *Note: This must be triggered by a user gesture (like a button click) and only works if the `beforeinstallprompt` event has fired.*
|
|
135
|
+
* **Display Mode:** Automatically detects if your app is running in `standalone` (installed), `twa` (Android Trusted Web Activity), or a standard `browser` tab.
|
|
136
|
+
|
|
137
|
+
#### **Background Sync**
|
|
138
|
+
Schedule tasks to run once the user has a stable internet connection.
|
|
139
|
+
|
|
140
|
+
```javascript
|
|
141
|
+
// Register a sync tag to trigger the 'sync' event in the Service Worker
|
|
142
|
+
await swManager.registerSync('sync-data-update');
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
#### **Notification Permission**
|
|
146
|
+
Request the browser's notification permission. The method is idempotent: it returns the cached status without prompting again if the user has already decided.
|
|
147
|
+
|
|
148
|
+
```javascript
|
|
149
|
+
const permission = await swManager.requestNotificationPermission();
|
|
150
|
+
|
|
151
|
+
if (permission === 'granted') {
|
|
152
|
+
console.log('Notifications are enabled.');
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## đĄ Event Reference
|
|
159
|
+
|
|
160
|
+
The `TinyServiceWorker` instance uses a unified `addEventListener` method. This method captures both **Internal Lifecycle Events** (emitted by the class itself) and **Custom Messages** forwarded from the Service Worker.
|
|
161
|
+
|
|
162
|
+
### đ Internal Lifecycle Events
|
|
163
|
+
These events are emitted by the `TinyServiceWorker` class to inform your application about its internal state changes.
|
|
164
|
+
|
|
165
|
+
| Event Name | Payload | Description |
|
|
166
|
+
| :--- | :--- | :--- |
|
|
167
|
+
| `sw:DisplayModeChanged` | `{ displayMode: string }` | Fired when the app switches between `browser`, `standalone`, or `twa`. |
|
|
168
|
+
| `sw:BeforeInstallPrompt` | `{ event: BeforeInstallPromptEvent }` | Fired when the browser is ready to show the installation prompt. |
|
|
169
|
+
| `sw:AppInstalled` | `void` | Fired when the PWA is successfully installed on the device. |
|
|
170
|
+
| `sw:VersionUpdateAvailable` | `void` | Fired when a version mismatch is detected in `localStorage`. |
|
|
171
|
+
| `sw:PrepareUpdate` | `void` | Fired to signal the Service Worker to begin downloading new assets. |
|
|
172
|
+
| `sw:NewVersionReady` | `{ event: Event }` | Fired when the new Service Worker successfully takes control of the page. |
|
|
173
|
+
| `sw:NoSwControllerWarn` | `void` | Fired when a message is attempted but no active Service Worker controller exists. |
|
|
174
|
+
| `sw:NotificationPermissionChanged` | `{ permission: NotificationPermission }` | Fired after `requestNotificationPermission()` resolves with the user's decision. |
|
|
175
|
+
| `sw:RegistrationFailed` | `Error` | Fired when registration fails while a `waitForReady()` call is pending. |
|
|
176
|
+
| `sw:PushReceived` | `{ data: any, event: MessageEvent }` | Fired when a push event is received. If in 'browser' mode and `autoNotifyPush` is enabled, a native browser notification is automatically displayed. |
|
|
177
|
+
| `sw:PushReceived` | `{ data: any, event: MessageEvent }` | Internal message type intercepted by the manager. **Not** re-emitted through `addEventListener`; it is dispatched through the `pushEvents` emitter instead. See [Push Events](#-push-events-topic-based). |
|
|
178
|
+
| `{CUSTOM EVENT}` | `{ event: Event, data: Record<string, any> }` | Fired when a message from `sw.js` is sent. |
|
|
179
|
+
|
|
180
|
+
### đ¨ Custom Worker Messages
|
|
181
|
+
When your Service Worker sends a message using `postMessage`, the class intercepts it and re-emits it as a standard event.
|
|
182
|
+
|
|
183
|
+
**Service Worker side:**
|
|
184
|
+
```javascript
|
|
185
|
+
// Inside sw.js
|
|
186
|
+
self.postMessage({ type: 'DATA_UPDATED', data: { items: [1, 2, 3] } });
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Main Thread side:**
|
|
190
|
+
```javascript
|
|
191
|
+
swManager.addEventListener((event) => {
|
|
192
|
+
const type = event.data.type;
|
|
193
|
+
const data = event.data.data;
|
|
194
|
+
if (type === 'DATA_UPDATED') {
|
|
195
|
+
console.log('New items:', data.items);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### đ˛ Push Events (Topic-Based)
|
|
201
|
+
|
|
202
|
+
Push messages are **not** delivered through `addEventListener`. They are dispatched by a dedicated emitter exposed through the `pushEvents` getter, which is keyed by the push **topic**. This isolates push handling from the regular message channel and lets you subscribe only to the topics you care about.
|
|
203
|
+
|
|
204
|
+
**Main Thread side:**
|
|
205
|
+
```javascript
|
|
206
|
+
// Subscribe to a specific topic
|
|
207
|
+
swManager.pushEvents.on('chat', ({ data }) => {
|
|
208
|
+
console.log(data.title, data.body);
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
// Subscribe to the default topic (used when the SW omits "topic")
|
|
212
|
+
swManager.pushEvents.on('push', ({ data }) => {
|
|
213
|
+
console.log('Generic push received:', data);
|
|
214
|
+
});
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Each listener receives a `PushEventData` object:
|
|
218
|
+
|
|
219
|
+
| Property | Type | Description |
|
|
220
|
+
| :--- | :--- | :--- |
|
|
221
|
+
| `data` | `TinyPushMessage & { notificationShown: boolean }` | The push payload merged with the notification state. |
|
|
222
|
+
| `event` | `MessageEvent` | The original message event. |
|
|
223
|
+
| `notificationShown` | `boolean` | `true` if the Service Worker already displayed a notification. |
|
|
224
|
+
| `showNotification` | `(overrides?) => Notification \| null` | Helper that renders a fallback notification in the page. |
|
|
225
|
+
|
|
226
|
+
> **Note:** When `displayMode === 'browser'` **and** `autoNotifyPush` is `true` **and** the Service Worker did **not** show a notification, the manager automatically calls `showNotification()` for you.
|
|
227
|
+
|
|
228
|
+
### đĢ Event Blacklist (Third-Party Isolation)
|
|
229
|
+
|
|
230
|
+
The Service Worker `message` channel is **global to the scope**: any Service Worker registered for the same origin can post a message that reaches your handler. When a third-party worker shares the scope, its events can collide with yours.
|
|
231
|
+
|
|
232
|
+
The blacklist drops those events **before** they are dispatched, without requiring any change on the sender side.
|
|
233
|
+
|
|
234
|
+
```javascript
|
|
235
|
+
// Ignore every event emitted by a third-party worker.
|
|
236
|
+
swManager.addToEventBlacklist('THIRD_PARTY_PING');
|
|
237
|
+
swManager.addToEventBlacklist('analytics:pudding');
|
|
238
|
+
|
|
239
|
+
// Check and remove.
|
|
240
|
+
swManager.hasInEventBlacklist('THIRD_PARTY_PING'); // true
|
|
241
|
+
swManager.removeFromEventBlacklist('THIRD_PARTY_PING'); // true
|
|
242
|
+
|
|
243
|
+
// Inspect or reset the whole list.
|
|
244
|
+
console.log(swManager.eventBlacklist); // ['analytics:pudding']
|
|
245
|
+
swManager.clearEventBlacklist();
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
> **Note:** The filter is applied to **incoming** messages only. It never blocks an event that your own code sends with `emitMessage()` or `postMessage()`.
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## đ§š Memory Management
|
|
253
|
+
|
|
254
|
+
To prevent memory leaksâespecially in Single Page Applications (SPAs)âalways clean up your instance when it is no longer needed (e.g., when the user logs out or the app component unmounts).
|
|
255
|
+
|
|
256
|
+
```javascript
|
|
257
|
+
// This will:
|
|
258
|
+
// 1. Unregister the Service Worker.
|
|
259
|
+
// 2. Remove all Window and Service Worker event listeners.
|
|
260
|
+
// 3. Clear all internal references.
|
|
261
|
+
await swManager.unregister();
|
|
262
|
+
// OR simply:
|
|
263
|
+
swManager.destroy();
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## đ API Reference
|
|
269
|
+
|
|
270
|
+
### `constructor(options)`
|
|
271
|
+
| Property | Type | Description | Required |
|
|
272
|
+
| :--- | :--- | :--- | :--- |
|
|
273
|
+
| `id` | `string` | Unique identifier for the instance. | Yes |
|
|
274
|
+
| `swUrl` | `string \| URL` | Path to the `.js` service worker file. | Yes |
|
|
275
|
+
| `version` | `string` | Current application version string. | Yes |
|
|
276
|
+
| `logger` | `Console` | Custom logger (defaults to `console`). | No |
|
|
277
|
+
| `debugMode` | `boolean` | Enables extra logging and cache busting. | No |
|
|
278
|
+
| `useLogColors` | `boolean` | Enables color support in the console logs. | No |
|
|
279
|
+
|
|
280
|
+
### Methods
|
|
281
|
+
|
|
282
|
+
| Method | Return | Description |
|
|
283
|
+
| :--- | :--- | :--- |
|
|
284
|
+
| `register(options)` | `Promise<void>` | Attempts to register the Service Worker. |
|
|
285
|
+
| `unregister()` | `Promise<boolean>` | Unregisters the worker and destroys the instance. |
|
|
286
|
+
| `waitForReady()` | `Promise<void>` | Resolves when the Service Worker is registered, active, and controlling the page. |
|
|
287
|
+
| `promptInstallation()` | `Promise<void>` | Triggers the native browser installation prompt. |
|
|
288
|
+
| `requestNotificationPermission()` | `Promise<'granted' \| 'denied' \| 'default'>` | Requests notification permission from the user. |
|
|
289
|
+
| `postMessage(payload)` | `void` | Sends a structured payload to the worker. |
|
|
290
|
+
| `emitMessage(type, data)` | `boolean` | Sends a simplified message to the worker. |
|
|
291
|
+
| `emitApi(type, data, timeout)` | `Promise<any>` | Sends a message and returns a Promise that resolves with the response from the Service Worker. |
|
|
292
|
+
| `onApi(type, callback)` | `void` | Registers a handler to respond to specific API requests sent from the Service Worker. |
|
|
293
|
+
| `offApi(type)` | `boolean` | Removes a previously registered API handler. |
|
|
294
|
+
| `addEventListener(cb)` | `void` | Listens for messages coming **from** the worker. |
|
|
295
|
+
| `removeEventListener(cb)` | `boolean` | Removes a previously added listener. |
|
|
296
|
+
| `addToEventBlacklist(type)` | `void` | Ignores every incoming event with the given name. |
|
|
297
|
+
| `removeFromEventBlacklist(type)` | `boolean` | Removes an event name from the blacklist. |
|
|
298
|
+
| `hasInEventBlacklist(type)` | `boolean` | Checks whether an event name is blacklisted. |
|
|
299
|
+
| `clearEventBlacklist()` | `void` | Removes every event name from the blacklist. |
|
|
300
|
+
| `registerSync(tag)` | `Promise<void>` | Registers a sync tag to trigger the 'sync' event in the Service Worker. |
|
|
301
|
+
| `destroy()` | `void` | Performs full cleanup of all resources. |
|
|
302
|
+
|
|
303
|
+
### Static Methods
|
|
304
|
+
|
|
305
|
+
| Method | Return | Description |
|
|
306
|
+
| :--- | :--- | :--- |
|
|
307
|
+
| `TinyServiceWorker.waitForReady()` | `Promise<ServiceWorkerRegistration>` | Resolves with the active registration once the Service Worker is ready. |
|
|
308
|
+
| `TinyServiceWorker.postMessage(message, transfer?)` | `void` | Sends a raw message to the active Service Worker controller. |
|
|
309
|
+
|
|
310
|
+
```javascript
|
|
311
|
+
// Wait for the worker before sending a message
|
|
312
|
+
await TinyServiceWorker.waitForReady();
|
|
313
|
+
|
|
314
|
+
// Send a raw message with an optional transferable list
|
|
315
|
+
TinyServiceWorker.postMessage({ type: 'PING' }, []);
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### Properties (Getters)
|
|
319
|
+
* `isReady`: `boolean` - Returns `true` if registration was successful.
|
|
320
|
+
* `isFailed`: `boolean` - Returns `true` if registration encountered an error.
|
|
321
|
+
* `isDestroyed`: `boolean` - Returns `true` if the instance has been destroyed.
|
|
322
|
+
* `isSwAvailable`: `boolean` - Returns `true` if the Service Worker API is supported **and** an active controller exists.
|
|
323
|
+
* `displayMode`: `'twa' | 'standalone' | 'browser'` - The current UI mode.
|
|
324
|
+
* `id`: `string` - The instance ID.
|
|
325
|
+
* `swUrl`: `string \| URL` - The URL of the service worker file.
|
|
326
|
+
* `version`: `string` - The current application version.
|
|
327
|
+
* `registration`: `ServiceWorkerRegistration` - The current registration object.
|
|
328
|
+
* `eventListeners`: `EventListener[]` - An array of all registered event listeners.
|
|
329
|
+
* `autoNotifyPush`: `boolean` - Indicates if the browser should automatically show a notification when a push is received in browser mode.
|
|
330
|
+
* `eventBlacklist`: `string[]` - A copy of every blacklisted event name.
|
|
331
|
+
* `pushEvents`: `EventEmitter` - Emitter that dispatches push events, keyed by topic. See [Push Events](#-push-events-topic-based).
|
|
332
|
+
|
|
333
|
+
### Static Methods
|
|
334
|
+
|
|
335
|
+
| Method | Return | Description |
|
|
336
|
+
| :--- | :--- | :--- |
|
|
337
|
+
| `TinyServiceWorker.waitForReady()` | `Promise<ServiceWorkerRegistration>` | Resolves with the active registration once the Service Worker is ready. |
|
|
338
|
+
| `TinyServiceWorker.postMessage(message, transfer?)` | `void` | Sends a raw message to the active Service Worker controller. |
|
|
339
|
+
| `TinyServiceWorker.PUSH_TYPE` | `Object` | Read-only map of push type constants, re-exported for convenience. |
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## đ§Š Architecture Note: The Dual-Module System
|
|
344
|
+
|
|
345
|
+
The `TinyServiceWorker` module is only one half of a complete Progressive Web App (PWA) solution. To function correctly, it must be paired with the **`TinyServiceWorkerEngine`**.
|
|
346
|
+
|
|
347
|
+
### đī¸ How it works
|
|
348
|
+
The system is architected using a **Client-Server model** within the browser:
|
|
349
|
+
|
|
350
|
+
1. **`TinyServiceWorker` (This Module):** Runs in the **Main Thread** (your web page). It acts as the interface, allowing your application code to send messages and listen for events.
|
|
351
|
+
2. **`TinyServiceWorkerEngine` (The Core):** Runs in the **Service Worker context** (the background). It performs the heavy lifting: intercepting network requests, managing the HTTP router, and processing background logic.
|
|
352
|
+
|
|
353
|
+
### đ Complete your implementation
|
|
354
|
+
To set up the background engine and enable full feature sets like **Fetch Interception** and **Automatic Error Routing**, you must implement the engine in your Service Worker file.
|
|
355
|
+
|
|
356
|
+
**Learn how to configure the engine here:**
|
|
357
|
+
đ [TinyServiceWorkerEngine](../service/TinyServiceWorkerEngine.md)
|
|
358
|
+
|
|
359
|
+
> **Pro Tip:** The true power of this system is realized when both modules are active, enabling real-time, bidirectional communication between your UI and the background process via the **Messaging System**.
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
## đ§Š TinyPlugin Ecosystem Integration
|
|
364
|
+
|
|
365
|
+
`TinyServiceWorker` is not a standalone utility; it is a first-class citizen of the **[TinyPlugin](../../plugin/TinyPlugin.md)** architecture.
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# đ TinyTabManager: Tab Orchestration
|
|
2
|
+
|
|
3
|
+
Welcome to the **TinyTabManager** documentation! đ This system provides a robust, persistent, and synchronized way to track, manage, and communicate with multiple browser tabs through a Service Worker.
|
|
4
|
+
|
|
5
|
+
Whether you are building a complex PWA (Progressive Web App) or a multi-window dashboard, `TinyTabManager` ensures your Service Worker always knows exactly which tabs are open, what they are doing, and allows you to control them remotely.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## đī¸ Architecture Overview
|
|
10
|
+
|
|
11
|
+
The system is split into two distinct parts that communicate via the `TinyServiceWorker` bridge:
|
|
12
|
+
|
|
13
|
+
1. **The Client Layer (`TinySwTabsLayer`)**: đĨī¸ Runs in the **Main Thread** (your web page). It monitors the tab's focus, URL, and title, and reports this data to the Service Worker.
|
|
14
|
+
2. **The SW Plugin (`TinyTabManagerPlugin`)**: đ§ Runs in the **Service Worker**. It acts as the "Source of Truth," storing all tab data in **IndexedDB** for persistence and managing the registry of active clients.
|
|
15
|
+
|
|
16
|
+
### đ The Workflow
|
|
17
|
+
`Tab Opens` âĄī¸ `Client Layer detects tab` âĄī¸ `Registers with SW` âĄī¸ `SW saves to IndexedDB` âĄī¸ `SW broadcasts update to all other tabs`.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## đ ī¸ Installation & Setup
|
|
22
|
+
|
|
23
|
+
You must register the plugin within your `TinyServiceWorkerEngine` instance.
|
|
24
|
+
|
|
25
|
+
```javascript
|
|
26
|
+
import TinyTabManagerPlugin from 'tiny-essentials/libs/sw/browser/plugins/TabManager';
|
|
27
|
+
|
|
28
|
+
// Inside your Service Worker initialization
|
|
29
|
+
swManager.installPlugin(TinyTabManagerPlugin);
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## đ API Reference
|
|
35
|
+
|
|
36
|
+
Use these layer methods within your web application to interact with the Service Worker.
|
|
37
|
+
|
|
38
|
+
### đ Monitoring Tabs
|
|
39
|
+
| Method | Description | Returns |
|
|
40
|
+
| :--- | :--- | :--- |
|
|
41
|
+
| `getTabList()` | Gets a list of all currently registered tabs. | `Promise<TabList>` |
|
|
42
|
+
| `getTab(id)` | Gets detailed info for a specific tab by ID. | `Promise<TabInfo \| null>` |
|
|
43
|
+
| `onUpdate(cb)` | Subscribes to changes in the tab list. | `void` |
|
|
44
|
+
| `offUpdate(cb)` | Unsubscribes from tab list changes. | `void` |
|
|
45
|
+
|
|
46
|
+
### đšī¸ Controlling Tabs
|
|
47
|
+
| Method | Description | Returns |
|
|
48
|
+
| :--- | :--- | :--- |
|
|
49
|
+
| `closeTab(id)` | Requests to close a specific tab. | `Promise<{ closed: boolean }>` |
|
|
50
|
+
| `closeTabs(ids)` | Requests to close multiple tabs. | `Promise<{ closed: Array<number> }>` |
|
|
51
|
+
| `closeAllTabs()` | Requests to close every registered tab. | `Promise<void>` |
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## đ§ Advanced Features
|
|
56
|
+
|
|
57
|
+
### đž Data Persistence (IndexedDB)
|
|
58
|
+
Unlike standard in-memory tracking, `TinyTabManager` uses **IndexedDB** (`TinySwTabsDB`).
|
|
59
|
+
- **Why?** If the Service Worker restarts or the user closes the browser and reopens it, the registry remains intact.
|
|
60
|
+
- **Reconciliation:** The plugin automatically performs a "reconciliation" check. If a tab was closed abruptly (e.g., a crash), the SW compares the IndexedDB registry with the actual active browser clients and removes "ghost" entries automatically. đģ
|
|
61
|
+
|
|
62
|
+
### đĻ Custom Data Synchronization
|
|
63
|
+
You can attach custom objects to a tab. This is extremely useful for keeping the Service Worker in sync with the application state without needing a backend database for every small change.
|
|
64
|
+
|
|
65
|
+
```javascript
|
|
66
|
+
const config = {
|
|
67
|
+
getExtraData: () => {
|
|
68
|
+
return {
|
|
69
|
+
currentProject: 'Project_Alpha',
|
|
70
|
+
isEditing: true
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### đ Security & Permissions
|
|
77
|
+
The system implements a "Permission-First" approach for closing tabs:
|
|
78
|
+
1. **Client-Side Control:** When initializing, you can set `allowTabClosing: false`. If set to false, the Service Worker will receive a "Permission Denied" response if it tries to close that tab.
|
|
79
|
+
2. **Runtime Updates:** You can change these permissions on the fly using `setPermissions()`.
|
|
80
|
+
|
|
81
|
+
The plugin respects privacy and user intent through two main permission flags:
|
|
82
|
+
|
|
83
|
+
3. **`trackFocus`**: If `false`, the tab will not report whether it is currently the active window.
|
|
84
|
+
4. **`allowTabClosing`**: If `false`, the Service Worker is forbidden from requesting that this tab be closed.
|
|
85
|
+
|
|
86
|
+
**Updating permissions at runtime:**
|
|
87
|
+
```javascript
|
|
88
|
+
await tabLayer.setPermissions({
|
|
89
|
+
allowTabClosing: false // This tab becomes "protected"
|
|
90
|
+
});
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## đ Practical Example: The "Dashboard Controller"
|
|
96
|
+
|
|
97
|
+
Imagine you have a dashboard with 5 open tabs, and you want a "Global Reset" button that closes all tabs except the main one.
|
|
98
|
+
|
|
99
|
+
```javascript
|
|
100
|
+
// In your Main Dashboard Tab
|
|
101
|
+
async function globalCleanup() {
|
|
102
|
+
const list = await tabLayer.getTabList();
|
|
103
|
+
|
|
104
|
+
// Filter out all tabs except the current one
|
|
105
|
+
const otherTabIds = list.tabs
|
|
106
|
+
.filter(tab => tab.id !== currentTabId)
|
|
107
|
+
.map(tab => tab.id);
|
|
108
|
+
|
|
109
|
+
if (otherTabIds.length > 0) {
|
|
110
|
+
await tabLayer.closeTabs(otherTabIds);
|
|
111
|
+
console.log("⨠Cleaned up extra tabs!");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## â ī¸ Summary Cheat Sheet
|
|
119
|
+
|
|
120
|
+
| If you want to... | Use this method | Where? |
|
|
121
|
+
| :--- | :--- | :--- |
|
|
122
|
+
| **See all open tabs** | `getTabList()` | Main Thread |
|
|
123
|
+
| **Close a specific tab** | `closeTab(id)` | Main Thread |
|
|
124
|
+
| **Sync custom state** | `getExtraData` (option) | Main Thread |
|
|
125
|
+
| **Handle tab changes** | `onUpdate(callback)` | Main Thread |
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## đĄ Pro-Tips for Daily Use
|
|
130
|
+
|
|
131
|
+
* **đ Use `onUpdate` for UI sync:** Instead of polling `getTabList()` every few seconds, always use `onUpdate`. It is much more efficient and provides a seamless user experience.
|
|
132
|
+
* **đž Syncing State:** Use the `getExtraData` option to save the "state" of your application. This allows a user to open a new tab and immediately see exactly where they left off in the previous one.
|
|
133
|
+
* **đĢ Protecting Critical Tabs:** If you have a "Checkout" or "Payment" tab, always set `allowTabClosing: false` to prevent accidental closure via the Service Worker.
|