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,274 @@
|
|
|
1
|
+
import TinyServiceWorker from '../TinyServiceWorker.mjs';
|
|
2
|
+
/** @typedef {import('../../../tools/TinyDebugger.mjs').DebuggerConstructor} DebuggerConstructor - The constructor function for a debugger instance. */
|
|
3
|
+
/**
|
|
4
|
+
* @typedef {(() => any)} ExtraDataFn - A function that returns custom data.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Options of the new instance.
|
|
8
|
+
* @typedef {Object} ConstructorOptions - Configuration options.
|
|
9
|
+
* @property {boolean} [trackFocus=true] - Whether to track tab focus status.
|
|
10
|
+
* @property {boolean} [allowTabClosing=true] - Whether the tab allows the SW to request tab closure.
|
|
11
|
+
* @property {ExtraDataFn} [getExtraData] - Optional function that returns custom data to be cached in the SW.
|
|
12
|
+
* @property {Partial<DebuggerConstructor>} [lgConfig] - Debugger configuration.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* @typedef {Object} TabFocusPayload
|
|
16
|
+
* @property {boolean} isFocused - Whether the tab is currently active and focused.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* @typedef {Object} TabInfo
|
|
20
|
+
* @property {string} id - The unique Client ID.
|
|
21
|
+
* @property {string} url - The current URL.
|
|
22
|
+
* @property {string} title - The document title.
|
|
23
|
+
* @property {boolean} isFocused - Whether the tab currently has window focus.
|
|
24
|
+
* @property {any} [data] - Custom data provided by the client.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* @typedef {Object} TabList
|
|
28
|
+
* @property {number} count - Total number of open tabs.
|
|
29
|
+
* @property {TabInfo[]} tabs - Array of tab information.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Controller to be used in the main thread to communicate with the TabManagerPlugin.
|
|
33
|
+
*/
|
|
34
|
+
class TinySwTabsLayer extends TinyServiceWorker.TinyPluginLayer {
|
|
35
|
+
/** @type {TinyServiceWorker<any, any>} - The TinyServiceWorker instance used for communication. */
|
|
36
|
+
#sw;
|
|
37
|
+
/** @type {boolean} - Indicates whether tab focus tracking is enabled. */
|
|
38
|
+
#trackFocus;
|
|
39
|
+
/** @type {boolean} - Indicates whether the tab allows closure requests from the SW. */
|
|
40
|
+
#allowTabClosing;
|
|
41
|
+
/** @type {ExtraDataFn|null} - The function used to retrieve custom data for the tab. */
|
|
42
|
+
#extraDataFn;
|
|
43
|
+
/**
|
|
44
|
+
* Gets the current status of the focus tracking configuration.
|
|
45
|
+
* @returns {boolean} - Whether the tab focus tracking is enabled.
|
|
46
|
+
*/
|
|
47
|
+
get trackFocus() {
|
|
48
|
+
return this.#trackFocus;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Gets whether the tab allows closure requests from the Service Worker.
|
|
52
|
+
* @returns {boolean} - Whether the tab allows closure requests.
|
|
53
|
+
*/
|
|
54
|
+
get allowTabClosing() {
|
|
55
|
+
return this.#allowTabClosing;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Determines if the tab is truly active (visible and focused).
|
|
59
|
+
* @returns {boolean} - True if the tab is visible and has focus.
|
|
60
|
+
*/
|
|
61
|
+
#getIsTabActive() {
|
|
62
|
+
const isHidden = 'hidden' in document
|
|
63
|
+
? document.hidden
|
|
64
|
+
: 'mozHidden' in document
|
|
65
|
+
? // @ts-ignore
|
|
66
|
+
document.mozHidden
|
|
67
|
+
: 'webkitHidden' in document
|
|
68
|
+
? // @ts-ignore
|
|
69
|
+
document.webkitHidden
|
|
70
|
+
: false;
|
|
71
|
+
return !isHidden && document.hasFocus();
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Initializes event listeners to detect navigation, visibility, and focus changes.
|
|
75
|
+
*/
|
|
76
|
+
#initListeners() {
|
|
77
|
+
// Detect URL/Title changes (Navigation)
|
|
78
|
+
window.addEventListener('popstate', () => this.#reportStatus());
|
|
79
|
+
// Detect Tab Closing (Most reliable event for closing/navigating away)
|
|
80
|
+
window.addEventListener('pagehide', () => this.#reportStatus(true));
|
|
81
|
+
// Focus and Visibility Tracking
|
|
82
|
+
if (this.#trackFocus) {
|
|
83
|
+
const visibilityEvents = ['visibilitychange', 'focus', 'blur', 'pageshow', 'pagehide'];
|
|
84
|
+
visibilityEvents.forEach((event) => {
|
|
85
|
+
window.addEventListener(event, () => this.#reportStatus(false));
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Reports the current status and permissions of this tab to the Service Worker.
|
|
91
|
+
* @param {boolean} isUnregistering - If true, tells the SW this tab is closing.
|
|
92
|
+
* @returns {Promise<void>} - A promise that resolves when the status report is complete.
|
|
93
|
+
*/
|
|
94
|
+
async #reportStatus(isUnregistering = false) {
|
|
95
|
+
await this.#sw.waitForReady();
|
|
96
|
+
if (isUnregistering) {
|
|
97
|
+
return this.#sw.emitApi('tab:unregister');
|
|
98
|
+
}
|
|
99
|
+
return this.#sw.emitApi('tab:register', {
|
|
100
|
+
url: window.location.href,
|
|
101
|
+
title: document.title,
|
|
102
|
+
isFocused: this.#trackFocus ? this.#getIsTabActive() : false,
|
|
103
|
+
data: typeof this.#extraDataFn === 'function' ? await this.#extraDataFn() : undefined,
|
|
104
|
+
permissions: {
|
|
105
|
+
allowFocusTracking: this.#trackFocus,
|
|
106
|
+
allowTabClosing: this.#allowTabClosing,
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Updates the tab's permissions and synchronizes with the Service Worker.
|
|
112
|
+
* @param {Object} options - The new permission configuration.
|
|
113
|
+
* @param {boolean} [options.trackFocus] - New focus tracking permission.
|
|
114
|
+
* @param {boolean} [options.allowTabClosing] - New tab closing permission.
|
|
115
|
+
* @returns {Promise<void>} - A promise that resolves when the status report is complete.
|
|
116
|
+
* @throws {TypeError} If options is not an object or properties are not booleans.
|
|
117
|
+
*/
|
|
118
|
+
async setPermissions(options = {}) {
|
|
119
|
+
if (typeof options !== 'object' || options === null || Array.isArray(options)) {
|
|
120
|
+
throw new TypeError('[TinySwTabsLayer] setPermissions: options must be an object.');
|
|
121
|
+
}
|
|
122
|
+
if (options.trackFocus !== undefined && typeof options.trackFocus !== 'boolean') {
|
|
123
|
+
throw new TypeError('[TinySwTabsLayer] setPermissions: trackFocus must be a boolean.');
|
|
124
|
+
}
|
|
125
|
+
if (options.allowTabClosing !== undefined && typeof options.allowTabClosing !== 'boolean') {
|
|
126
|
+
throw new TypeError('[TinySwTabsLayer] setPermissions: allowTabClosing must be a boolean.');
|
|
127
|
+
}
|
|
128
|
+
if (options.trackFocus !== undefined)
|
|
129
|
+
this.#trackFocus = options.trackFocus;
|
|
130
|
+
if (options.allowTabClosing !== undefined)
|
|
131
|
+
this.#allowTabClosing = options.allowTabClosing;
|
|
132
|
+
return this.#reportStatus();
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Initializes a new instance of the TinySwTabsLayer.
|
|
136
|
+
* @param {TinyServiceWorker<any, any>} sw - The TinyServiceWorker instance used for communication.
|
|
137
|
+
* @param {ConstructorOptions} [options] - Configuration options.
|
|
138
|
+
* @throws {TypeError} If sw is not an instance of TinyServiceWorker or options are invalid.
|
|
139
|
+
*/
|
|
140
|
+
constructor(sw, options = {}) {
|
|
141
|
+
super({
|
|
142
|
+
logCfg: {
|
|
143
|
+
id: '[_main_class_TinySW-Tabs_reset_]',
|
|
144
|
+
logger: options.lgConfig?.logger ?? console,
|
|
145
|
+
debugMode: options.lgConfig?.debugMode ?? false,
|
|
146
|
+
useLogColors: options.lgConfig?.useLogColors ?? false,
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
if (!(sw instanceof TinyServiceWorker)) {
|
|
150
|
+
throw new TypeError('[TinySwTabsLayer] Constructor: sw must be an instance of TinyServiceWorker.');
|
|
151
|
+
}
|
|
152
|
+
// Deep validation of ConstructorOptions
|
|
153
|
+
if (typeof options !== 'object' || options === null || Array.isArray(options)) {
|
|
154
|
+
throw new TypeError('[TinySwTabsLayer] Constructor: options must be an object.');
|
|
155
|
+
}
|
|
156
|
+
if (options.trackFocus !== undefined && typeof options.trackFocus !== 'boolean') {
|
|
157
|
+
throw new TypeError('[TinySwTabsLayer] Constructor: trackFocus must be a boolean.');
|
|
158
|
+
}
|
|
159
|
+
if (options.allowTabClosing !== undefined && typeof options.allowTabClosing !== 'boolean') {
|
|
160
|
+
throw new TypeError('[TinySwTabsLayer] Constructor: allowTabClosing must be a boolean.');
|
|
161
|
+
}
|
|
162
|
+
if (options.getExtraData !== undefined && typeof options.getExtraData !== 'function') {
|
|
163
|
+
throw new TypeError('[TinySwTabsLayer] Constructor: getExtraData must be a function.');
|
|
164
|
+
}
|
|
165
|
+
this.#sw = sw;
|
|
166
|
+
this.#trackFocus = options.trackFocus ?? true;
|
|
167
|
+
this.#allowTabClosing = options.allowTabClosing ?? true;
|
|
168
|
+
this.#extraDataFn = options.getExtraData ?? null;
|
|
169
|
+
sw.onApi('tab:close', async () => {
|
|
170
|
+
if (!this.#allowTabClosing) {
|
|
171
|
+
return { authorized: false };
|
|
172
|
+
}
|
|
173
|
+
window.close();
|
|
174
|
+
return { authorized: true };
|
|
175
|
+
});
|
|
176
|
+
this.#initListeners();
|
|
177
|
+
this.#sw.waitForReady().then(() => this.register());
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Registers this tab in the manager.
|
|
181
|
+
* @returns {Promise<void>} - A promise that resolves when the registration is complete.
|
|
182
|
+
*/
|
|
183
|
+
async register() {
|
|
184
|
+
this.#reportStatus();
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Explicitly requests the current list of all open tabs.
|
|
188
|
+
* @returns {Promise<TabList>} - A promise that resolves with the current list of tabs.
|
|
189
|
+
*/
|
|
190
|
+
async getTabList() {
|
|
191
|
+
return this.#sw.emitApi('tab:get_list');
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Retrieves the information for a specific tab by its unique ID.
|
|
195
|
+
* @param {string} id - The unique identifier of the tab.
|
|
196
|
+
* @returns {Promise<TabInfo|null>} - The tab information if found, or null if the tab does not exist.
|
|
197
|
+
* @throws {TypeError} If the provided id is not a string.
|
|
198
|
+
*/
|
|
199
|
+
async getTab(id) {
|
|
200
|
+
if (typeof id !== 'string')
|
|
201
|
+
throw new TypeError('[TinySwTabsLayer] getTab: id must be a string.');
|
|
202
|
+
return (await this.#sw.emitApi('tab:get_tab', { id })) ?? null;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Closes a specific tab by its ID.
|
|
206
|
+
* @param {string} id - The ID of the tab to close.
|
|
207
|
+
* @returns {Promise<{ closed: boolean }>} - A promise that resolves with the result of the close request.
|
|
208
|
+
*/
|
|
209
|
+
closeTab(id) {
|
|
210
|
+
if (typeof id !== 'string')
|
|
211
|
+
throw new TypeError('[TinySwTabsLayer] closeTab: id must be a string.');
|
|
212
|
+
return this.#sw.emitApi('tab:close_single', { id });
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Closes multiple tabs by their IDs.
|
|
216
|
+
* @param {string[]} ids - Array of tab IDs.
|
|
217
|
+
* @returns {Promise<{ closed: (-1|0|1)[] }>} (-1: no permission | 0: no closed | 1: closed)
|
|
218
|
+
*/
|
|
219
|
+
closeTabs(ids) {
|
|
220
|
+
if (!Array.isArray(ids))
|
|
221
|
+
throw new TypeError('[TinySwTabsLayer] closeTabs: ids must be an array.');
|
|
222
|
+
return this.#sw.emitApi('tab:close_multiple', { ids });
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Closes all registered tabs.
|
|
226
|
+
* @returns {Promise<void>} - A promise that resolves when all tabs have been requested to close.
|
|
227
|
+
*/
|
|
228
|
+
closeAllTabs() {
|
|
229
|
+
return this.#sw.emitApi('tab:close_all');
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Sets a callback to be executed whenever the tab list changes.
|
|
233
|
+
* @param {(list: TabList) => void} callback - The function to execute when the tab list changes.
|
|
234
|
+
*/
|
|
235
|
+
onUpdate(callback) {
|
|
236
|
+
this.#sw.on('tab:list_updated', callback);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Removes a callback from tab list change events.
|
|
240
|
+
* @param {(list: TabList) => void} callback - The callback function to remove.
|
|
241
|
+
*/
|
|
242
|
+
offUpdate(callback) {
|
|
243
|
+
this.#sw.off('tab:list_updated', callback);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* A plugin for TinyServiceWorker that manages a centralized registry of all open website tabs.
|
|
248
|
+
* @type {import('../TinyServiceWorker.mjs').SwPluginInstaller<TinySwTabsLayer, 'TabManager', '1.0.0', [ConstructorOptions]|[]>}
|
|
249
|
+
*/
|
|
250
|
+
const TinyTabManagerPlugin = (instance, lgConfig = {}) => {
|
|
251
|
+
const engine = instance.engine;
|
|
252
|
+
instance.id = 'TabManager';
|
|
253
|
+
instance.version = '1.0.0';
|
|
254
|
+
instance.description = 'Advanced tab manager.';
|
|
255
|
+
instance.authors = ['JasminDreasond'];
|
|
256
|
+
instance.contributors = ['JasminDreasond'];
|
|
257
|
+
instance.categories = ['tab-manager'];
|
|
258
|
+
instance.tags = ['management'];
|
|
259
|
+
instance.allowedGets = [
|
|
260
|
+
'onUpdate',
|
|
261
|
+
'offUpdate',
|
|
262
|
+
'getTabList',
|
|
263
|
+
'getTab',
|
|
264
|
+
'register',
|
|
265
|
+
'closeTab',
|
|
266
|
+
'closeTabs',
|
|
267
|
+
'closeAllTabs',
|
|
268
|
+
'trackFocus',
|
|
269
|
+
];
|
|
270
|
+
if (!(engine instanceof TinyServiceWorker))
|
|
271
|
+
throw new TypeError('Plugin requires a TinyServiceWorker instance to function.');
|
|
272
|
+
return new TinySwTabsLayer(engine, lgConfig);
|
|
273
|
+
};
|
|
274
|
+
export default TinyTabManagerPlugin;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Requests permission from the user to display notifications.
|
|
5
|
+
*
|
|
6
|
+
* @returns {Promise<'granted' | 'denied' | 'default'>} The resulting permission status.
|
|
7
|
+
* @throws {Error} If the Notification API is not supported by the browser.
|
|
8
|
+
*/
|
|
9
|
+
const requestNotificationPermission = async () => {
|
|
10
|
+
if (!('Notification' in window)) {
|
|
11
|
+
throw new Error('Notification API is not supported in this browser.');
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// If permission is already 'granted', return immediately.
|
|
15
|
+
if (Notification.permission === 'granted') {
|
|
16
|
+
return 'granted';
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// If 'denied', the user has blocked it and we cannot prompt again via code.
|
|
20
|
+
if (Notification.permission === 'denied') {
|
|
21
|
+
return 'denied';
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const permission = await Notification.requestPermission();
|
|
25
|
+
return permission;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
exports.requestNotificationPermission = requestNotificationPermission;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Requests permission from the user to display notifications.
|
|
3
|
+
*
|
|
4
|
+
* @returns {Promise<'granted' | 'denied' | 'default'>} The resulting permission status.
|
|
5
|
+
* @throws {Error} If the Notification API is not supported by the browser.
|
|
6
|
+
*/
|
|
7
|
+
export declare const requestNotificationPermission: () => Promise<'granted' | 'denied' | 'default'>;
|
|
8
|
+
//# sourceMappingURL=utils.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.mts","sourceRoot":"","sources":["../../../../../src/v1/libs/sw/browser/utils.mjs"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,QAH7B,OAAO,CAAC,SAAS,GAAG,QAAQ,GAAG,SAAS,CAoBpD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Requests permission from the user to display notifications.
|
|
3
|
+
*
|
|
4
|
+
* @returns {Promise<'granted' | 'denied' | 'default'>} The resulting permission status.
|
|
5
|
+
* @throws {Error} If the Notification API is not supported by the browser.
|
|
6
|
+
*/
|
|
7
|
+
export const requestNotificationPermission = async () => {
|
|
8
|
+
if (!('Notification' in window)) {
|
|
9
|
+
throw new Error('Notification API is not supported in this browser.');
|
|
10
|
+
}
|
|
11
|
+
// If permission is already 'granted', return immediately.
|
|
12
|
+
if (Notification.permission === 'granted') {
|
|
13
|
+
return 'granted';
|
|
14
|
+
}
|
|
15
|
+
// If 'denied', the user has blocked it and we cannot prompt again via code.
|
|
16
|
+
if (Notification.permission === 'denied') {
|
|
17
|
+
return 'denied';
|
|
18
|
+
}
|
|
19
|
+
const permission = await Notification.requestPermission();
|
|
20
|
+
return permission;
|
|
21
|
+
};
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utils = require('../utils.cjs');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file Routes a normalized push message to a handler, based on `message.type`.
|
|
7
|
+
*
|
|
8
|
+
* The router is transport agnostic: it never touches the Notification API. That
|
|
9
|
+
* responsibility belongs to the handler, which keeps the class testable in Node.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Describes the mutable state shared between the router and the active handler
|
|
14
|
+
* during a single dispatch cycle.
|
|
15
|
+
*
|
|
16
|
+
* @typedef {Object} TinyPushContext
|
|
17
|
+
* @property {PushEvent} event - The native push event.
|
|
18
|
+
* @property {import('./shared/TinyPushPayload.mjs').TinyPushMessage} message - The normalized message.
|
|
19
|
+
* @property {import('./TinyServiceWorkerEngine.mjs').default} engine - The engine that received the push.
|
|
20
|
+
* @property {boolean} handled - Set to `true` to stop the chain.
|
|
21
|
+
* @property {boolean} notificationShown - Set to `true` when a notification was displayed.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Handles a normalized push message that matched a route.
|
|
26
|
+
*
|
|
27
|
+
* @callback TinyPushHandler
|
|
28
|
+
* @param {import('./shared/TinyPushPayload.mjs').TinyPushMessage} message - The normalized message.
|
|
29
|
+
* @param {TinyPushContext} context - The dispatch context.
|
|
30
|
+
* @returns {Promise<boolean|void>|boolean|void} Return `false` to fall through to the next handler.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Decides whether a normalized push message is allowed to reach a handler.
|
|
35
|
+
*
|
|
36
|
+
* @callback TinyPushGuard
|
|
37
|
+
* @param {import('./shared/TinyPushPayload.mjs').TinyPushMessage} message - The normalized message.
|
|
38
|
+
* @param {TinyPushContext} context - The dispatch context.
|
|
39
|
+
* @returns {Promise<boolean>|boolean} Return `false` to drop the message.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Routes normalized push messages to registered handlers based on `message.type`.
|
|
44
|
+
*
|
|
45
|
+
* @beta
|
|
46
|
+
*/
|
|
47
|
+
class TinyPushRouter {
|
|
48
|
+
static #PUSH_TYPE = utils.PUSH_TYPE;
|
|
49
|
+
static get PUSH_TYPE() {
|
|
50
|
+
return TinyPushRouter.#PUSH_TYPE;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** @type {Map<string, TinyPushHandler>} */
|
|
54
|
+
#exact = new Map();
|
|
55
|
+
|
|
56
|
+
/** @type {Array<{ source: string, regex: RegExp, handler: TinyPushHandler }>} */
|
|
57
|
+
#patterns = [];
|
|
58
|
+
|
|
59
|
+
/** @type {TinyPushGuard[]} */
|
|
60
|
+
#guards = [];
|
|
61
|
+
|
|
62
|
+
/** @type {TinyPushHandler|null} */
|
|
63
|
+
#fallback = null;
|
|
64
|
+
|
|
65
|
+
/** @type {((error: unknown, message: unknown) => void)|null} */
|
|
66
|
+
#onError = null;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Registers a guard. Every guard runs before the handler.
|
|
70
|
+
*
|
|
71
|
+
* A guard that returns `false` drops the message: no handler runs and the
|
|
72
|
+
* `push` promise resolves with `true`, so the browser does not show a
|
|
73
|
+
* generic "This site has been updated in the background" notification.
|
|
74
|
+
*
|
|
75
|
+
* @param {TinyPushGuard} guard - The guard to register.
|
|
76
|
+
* @returns {this} The router, for chaining.
|
|
77
|
+
* @throws {TypeError} If `guard` is not a function.
|
|
78
|
+
*/
|
|
79
|
+
use(guard) {
|
|
80
|
+
if (typeof guard !== 'function') {
|
|
81
|
+
throw new TypeError('[TinyPushRouter] use: guard must be a function.');
|
|
82
|
+
}
|
|
83
|
+
this.#guards.push(guard);
|
|
84
|
+
return this;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Registers a handler for an exact `message.type`.
|
|
89
|
+
*
|
|
90
|
+
* @param {string} type - The type to match.
|
|
91
|
+
* @param {TinyPushHandler} handler - The handler.
|
|
92
|
+
* @returns {this} The router, for chaining.
|
|
93
|
+
* @throws {TypeError} If `type` is not a non-empty string or `handler` is not a function.
|
|
94
|
+
*/
|
|
95
|
+
on(type, handler) {
|
|
96
|
+
if (typeof type !== 'string' || type.trim() === '') {
|
|
97
|
+
throw new TypeError('[TinyPushRouter] on: type must be a non-empty string.');
|
|
98
|
+
}
|
|
99
|
+
if (typeof handler !== 'function') {
|
|
100
|
+
throw new TypeError('[TinyPushRouter] on: handler must be a function.');
|
|
101
|
+
}
|
|
102
|
+
this.#exact.set(type, handler);
|
|
103
|
+
return this;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Registers a handler for every `message.type` that matches a regular expression.
|
|
108
|
+
*
|
|
109
|
+
* @param {RegExp} pattern - The pattern applied to `message.type`.
|
|
110
|
+
* @param {TinyPushHandler} handler - The handler.
|
|
111
|
+
* @returns {this} The router, for chaining.
|
|
112
|
+
* @throws {TypeError} If `pattern` is not a RegExp or `handler` is not a function.
|
|
113
|
+
*/
|
|
114
|
+
onMatch(pattern, handler) {
|
|
115
|
+
if (!(pattern instanceof RegExp)) {
|
|
116
|
+
throw new TypeError('[TinyPushRouter] onMatch: pattern must be a RegExp.');
|
|
117
|
+
}
|
|
118
|
+
if (typeof handler !== 'function') {
|
|
119
|
+
throw new TypeError('[TinyPushRouter] onMatch: handler must be a function.');
|
|
120
|
+
}
|
|
121
|
+
this.#patterns.push({ source: pattern.source, regex: pattern, handler });
|
|
122
|
+
return this;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Registers the handler used when no other handler matches.
|
|
127
|
+
*
|
|
128
|
+
* @param {TinyPushHandler} handler - The fallback handler.
|
|
129
|
+
* @returns {this} The router, for chaining.
|
|
130
|
+
* @throws {TypeError} If `handler` is not a function.
|
|
131
|
+
*/
|
|
132
|
+
otherwise(handler) {
|
|
133
|
+
if (typeof handler !== 'function') {
|
|
134
|
+
throw new TypeError('[TinyPushRouter] otherwise: handler must be a function.');
|
|
135
|
+
}
|
|
136
|
+
this.#fallback = handler;
|
|
137
|
+
return this;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Registers an error handler.
|
|
142
|
+
*
|
|
143
|
+
* @param {(error: unknown, message: unknown) => void} handler - The error handler.
|
|
144
|
+
* @returns {this} The router, for chaining.
|
|
145
|
+
* @throws {TypeError} If `handler` is not a function.
|
|
146
|
+
*/
|
|
147
|
+
catch(handler) {
|
|
148
|
+
if (typeof handler !== 'function') {
|
|
149
|
+
throw new TypeError('[TinyPushRouter] catch: handler must be a function.');
|
|
150
|
+
}
|
|
151
|
+
this.#onError = handler;
|
|
152
|
+
return this;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Reports whether a handler is registered for the given type.
|
|
157
|
+
*
|
|
158
|
+
* @param {string} type - The type to look up.
|
|
159
|
+
* @returns {boolean} `true` when a handler is registered.
|
|
160
|
+
*/
|
|
161
|
+
has(type) {
|
|
162
|
+
if (this.#exact.has(type)) return true;
|
|
163
|
+
return this.#patterns.some(({ regex }) => regex.test(type));
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** @returns {number} The number of registered handlers. */
|
|
167
|
+
get size() {
|
|
168
|
+
return this.#exact.size + this.#patterns.length;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Dispatches a message to the first matching handler.
|
|
173
|
+
*
|
|
174
|
+
* @param {import('./shared/TinyPushPayload.mjs').TinyPushMessage} message - The normalized message.
|
|
175
|
+
* @param {TinyPushContext} context - The dispatch context.
|
|
176
|
+
* @returns {Promise<boolean>} `true` when a handler claimed the message.
|
|
177
|
+
* @throws {TypeError} If `message` or `context` are invalid.
|
|
178
|
+
*/
|
|
179
|
+
async dispatch(message, context) {
|
|
180
|
+
if (typeof message !== 'object' || message === null) {
|
|
181
|
+
throw new TypeError('[TinyPushRouter] dispatch: message must be a non-null object.');
|
|
182
|
+
}
|
|
183
|
+
if (typeof context !== 'object' || context === null) {
|
|
184
|
+
throw new TypeError('[TinyPushRouter] dispatch: context must be a non-null object.');
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
try {
|
|
188
|
+
for (const guard of this.#guards) {
|
|
189
|
+
const allowed = await guard(message, context);
|
|
190
|
+
if (allowed === false) return true;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const handler = this.#exact.get(message.type);
|
|
194
|
+
|
|
195
|
+
if (handler) {
|
|
196
|
+
const result = await handler(message, context);
|
|
197
|
+
if (result !== false) return true;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
for (const { regex, handler: patternHandler } of this.#patterns) {
|
|
201
|
+
if (!regex.test(message.type)) continue;
|
|
202
|
+
const result = await patternHandler(message, context);
|
|
203
|
+
if (result !== false) return true;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (this.#fallback) {
|
|
207
|
+
await this.#fallback(message, context);
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return false;
|
|
212
|
+
} catch (error) {
|
|
213
|
+
if (this.#onError) {
|
|
214
|
+
this.#onError(error, message);
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
throw error;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
module.exports = TinyPushRouter;
|