tiny-essentials 1.28.19 → 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/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 +30 -4
- package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.d.mts +5 -2
- package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.d.mts.map +1 -1
- package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.mjs +29 -5
- 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 +101 -0
- package/docs/v1/README.md +113 -15
- 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 +19 -7
- 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 +303 -13
- package/types/EventEmitter.d.ts +48 -0
- package/dist/v1/libs/text/TinyI18.d.mts.map +0 -1
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# 🚀 TinyThrottledApi Documentation
|
|
2
|
+
|
|
3
|
+
`TinyThrottledApi` is a professional-grade utility designed to manage asynchronous operations. It acts as a "gatekeeper" for your API calls, ensuring you do not overwhelm a server by sending too many requests at once (**Concurrency Control**) and helping you stay within rate limits (**Rate Throttling**).
|
|
4
|
+
|
|
5
|
+
## 📋 Table of Contents
|
|
6
|
+
1. [Core Concepts](#core-concepts)
|
|
7
|
+
2. [Getting Started](#getting-started)
|
|
8
|
+
3. [API Reference](#api-reference)
|
|
9
|
+
* [Constructor](#constructorconcurrencylimit-api-timeoutinstance)
|
|
10
|
+
* [Methods](#methods)
|
|
11
|
+
* [Getters](#getters)
|
|
12
|
+
* [Setters](#setters)
|
|
13
|
+
* [Events](#events)
|
|
14
|
+
4. [Practical Examples](#practical-examples)
|
|
15
|
+
5. [Monitoring & Debugging](#monitoring--debugging)
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 🧠 Core Concepts
|
|
20
|
+
|
|
21
|
+
To use this library effectively, you must understand the two problems it solves:
|
|
22
|
+
|
|
23
|
+
### 1. Concurrency Control 🚦
|
|
24
|
+
If you try to fetch 1,000 items from a database simultaneously, your application might crash or the server might block your IP.
|
|
25
|
+
**The Solution:** `TinyThrottledApi` limits the number of active requests. If the limit is 5, and you request 10, only 5 will run immediately; the other 5 will wait in a queue until a slot opens up.
|
|
26
|
+
|
|
27
|
+
### 2. Rate Throttling ⏱️
|
|
28
|
+
Even if you only run 5 requests at a time, sending them too quickly in "bursts" can trigger security filters.
|
|
29
|
+
**The Solution:** By integrating `TinyTimeout`, the API can introduce a dynamic delay between requests. This spreads the load over a longer period, making your traffic pattern look more natural and less aggressive.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 🚀 Getting Started
|
|
34
|
+
|
|
35
|
+
### Installation Context
|
|
36
|
+
This module expects the following dependencies to be present in your project structure:
|
|
37
|
+
* `tiny-essentials/libs/utils/TinyPromiseQueue` (For managing the waiting list).
|
|
38
|
+
* `tiny-essentials/basics/promiseUtils` (Specifically the `waitForTrue` function).
|
|
39
|
+
* `tiny-essentials/libs/math/TinyTimeout` (For regulating execution frequency).
|
|
40
|
+
|
|
41
|
+
### Basic Initialization
|
|
42
|
+
```javascript
|
|
43
|
+
import TinyThrottledApi from 'tiny-essentials/libs/utils/TinyThrottledApi';
|
|
44
|
+
|
|
45
|
+
// A mock API function to simulate a network request
|
|
46
|
+
const mockApi = async (id) => {
|
|
47
|
+
console.log(`🚀 Fetching data for ID: ${id}`);
|
|
48
|
+
return new Promise((resolve) => setTimeout(() => resolve(`Data ${id}`), 1000));
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// Create an instance: Max 3 concurrent requests
|
|
52
|
+
const throttledApi = new TinyThrottledApi(3, mockApi);
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 🛠️ API Reference
|
|
58
|
+
|
|
59
|
+
### `constructor(concurrencyLimit, api, timeoutInstance)`
|
|
60
|
+
Initializes the throttled controller.
|
|
61
|
+
|
|
62
|
+
| Parameter | Type | Description |
|
|
63
|
+
| :--- | :--- | :--- |
|
|
64
|
+
| `concurrencyLimit` | `number` | Must be a positive integer. Defines max simultaneous tasks. |
|
|
65
|
+
| `api` | `Function` | The target asynchronous function to execute. |
|
|
66
|
+
| `timeoutInstance` | `TinyTimeout \| null` | (Optional) An instance to control request frequency. |
|
|
67
|
+
|
|
68
|
+
**Throws:**
|
|
69
|
+
* `TypeError`: If `concurrencyLimit` is not a positive number or `api` is not a function.
|
|
70
|
+
* `TypeError`: If `timeoutInstance` is provided but is not a `TinyTimeout` instance.
|
|
71
|
+
|
|
72
|
+
### `exec(...args)`
|
|
73
|
+
The primary method to execute your API calls.
|
|
74
|
+
|
|
75
|
+
* **Returns:** `Promise<ReturnType<API>>`.
|
|
76
|
+
* **Behavior:**
|
|
77
|
+
1. Checks if a slot is available.
|
|
78
|
+
2. If yes, executes immediately.
|
|
79
|
+
3. If no, adds the task to the `TinyPromiseQueue` and waits for a slot to become free.
|
|
80
|
+
* **Task Tracking:** Each task is assigned a unique `UUID` used in emitted events for precise tracking.
|
|
81
|
+
|
|
82
|
+
### Methods
|
|
83
|
+
| Method | Description |
|
|
84
|
+
| :--- | :--- |
|
|
85
|
+
| `exec(...args)` | Executes the API function respecting concurrency and throttling. |
|
|
86
|
+
| `destroy()` | Cleans up the instance, removing all listeners and stopping pending tasks. |
|
|
87
|
+
|
|
88
|
+
### Getters
|
|
89
|
+
| Getter | Type | Description |
|
|
90
|
+
| :--- | :--- | :--- |
|
|
91
|
+
| `api` | `Function` | The original API function provided during initialization. |
|
|
92
|
+
| `queue` | `TinyPromiseQueue` | Returns the internal queue instance managing pending tasks. |
|
|
93
|
+
| `concurrencyLimit` | `number` | The current maximum number of simultaneous requests. |
|
|
94
|
+
| `timeoutInstance` | `TinyTimeout \| null` | The current `TinyTimeout` instance used for rate limiting. |
|
|
95
|
+
| `timeoutValue` | `number` | The current base delay multiplier in milliseconds. |
|
|
96
|
+
| `timeoutLimit` | `number \| null` | The current maximum delay cap. |
|
|
97
|
+
| `activeCount` | `number` | The number of requests currently running. |
|
|
98
|
+
| `queuedCount` | `number` | The number of tasks currently waiting in the queue. |
|
|
99
|
+
| `isDestroyed` | `boolean` | Indicates whether the instance has been destroyed. |
|
|
100
|
+
| `timeoutFirst` | `boolean` | Indicates if the delay is applied *before* the first request in a cycle. |
|
|
101
|
+
|
|
102
|
+
### Setters
|
|
103
|
+
| Setter | Parameter | Description |
|
|
104
|
+
| :--- | :--- | :--- |
|
|
105
|
+
| `concurrencyLimit` | `number` | Sets a new maximum number of simultaneous requests. |
|
|
106
|
+
| `timeoutValue` | `number` | Sets a new base delay multiplier in milliseconds. |
|
|
107
|
+
| `timeoutLimit` | `number` | Sets a new maximum delay cap. |
|
|
108
|
+
| `timeoutFirst` | `boolean` | If `true`, delay is applied before waiting for a slot. If `false`, delay is applied after. |
|
|
109
|
+
|
|
110
|
+
### Events
|
|
111
|
+
The `TinyThrottledApi` extends `EventEmitter` and emits the following events:
|
|
112
|
+
|
|
113
|
+
#### Task Lifecycle Events
|
|
114
|
+
| Event | Argument | Description |
|
|
115
|
+
| :--- | :--- | :--- |
|
|
116
|
+
| `ExecTask` | `id` (string) | Emitted when a task begins its execution. |
|
|
117
|
+
| `TaskEnded` | `id` (string) | Emitted when a task completes (whether it succeeded or failed). |
|
|
118
|
+
| `WaitingTask` | `id` (string) | Emitted when a task is placed into the queue because the limit was reached. |
|
|
119
|
+
| `Destroyed` | | Emitted when the instance has been destroyed and can no longer be used. |
|
|
120
|
+
|
|
121
|
+
#### Configuration Events
|
|
122
|
+
| Event | Argument | Description |
|
|
123
|
+
| :--- | :--- | :--- |
|
|
124
|
+
| `SetConcurrencyLimit` | `value` (number) | Emitted when the `concurrencyLimit` is updated. |
|
|
125
|
+
| `SetTimeoutValue` | `value` (number) | Emitted when the `timeoutValue` is updated. |
|
|
126
|
+
| `SetTimeoutLimit` | `value` (number) | Emitted when the `timeoutLimit` is updated. |
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 💡 Practical Examples
|
|
131
|
+
|
|
132
|
+
### Example 1: Simple Concurrency (The "Batch" Pattern) 🚀
|
|
133
|
+
Use this when you have a large array of IDs and want to fetch data from a real API without overwhelming the client or the server. We use `JSONPlaceholder` (a free fake API) for this example.
|
|
134
|
+
|
|
135
|
+
```javascript
|
|
136
|
+
import TinyThrottledApi from 'tiny-essentials/libs/utils/TinyThrottledApi';
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* A real-world fetch wrapper.
|
|
140
|
+
* @param {number} id
|
|
141
|
+
* @returns {Promise<Object>}
|
|
142
|
+
*/
|
|
143
|
+
const fetchData = async (id) => {
|
|
144
|
+
const response = await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`);
|
|
145
|
+
|
|
146
|
+
if (!response.ok) {
|
|
147
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return await response.json();
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
// Limit to 3 simultaneous network requests
|
|
154
|
+
const throttledApi = new TinyThrottledApi(3, fetchData);
|
|
155
|
+
|
|
156
|
+
async function runBatch() {
|
|
157
|
+
const ids = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
|
158
|
+
|
|
159
|
+
console.log("Starting batch fetch...");
|
|
160
|
+
|
|
161
|
+
// Map IDs to promises managed by the throttled API
|
|
162
|
+
const tasks = ids.map(id =>
|
|
163
|
+
throttledApi.exec(id)
|
|
164
|
+
.then(data => console.log(`✅ Success [ID ${id}]:`, data.title))
|
|
165
|
+
.catch(err => console.error(`❌ Error [ID ${id}]:`, err.message))
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
await Promise.all(tasks);
|
|
169
|
+
console.log("🏁 All batch tasks completed!");
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
runBatch();
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Example 2: Advanced Throttling (The "Polite" Pattern) ⏱️
|
|
176
|
+
Use this when the API you are calling has strict rate limits (e.g., "no more than 5 requests per second"). By using `TinyTimeout`, we ensure our requests are spaced out gracefully.
|
|
177
|
+
|
|
178
|
+
```javascript
|
|
179
|
+
import TinyThrottledApi from 'tiny-essentials/libs/utils/TinyThrottledApi';
|
|
180
|
+
import TinyTimeout from 'tiny-essentials/libs/math/TinyTimeout';
|
|
181
|
+
|
|
182
|
+
const fetchData = async (id) => {
|
|
183
|
+
const response = await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`);
|
|
184
|
+
return await response.json();
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
// 1. Initialize the timing controller
|
|
188
|
+
const timeout = new TinyTimeout();
|
|
189
|
+
|
|
190
|
+
// 2. Create the throttled API
|
|
191
|
+
// We allow 2 concurrent requests, but we want to space them out
|
|
192
|
+
const throttledApi = new TinyThrottledApi(2, fetchData, timeout);
|
|
193
|
+
|
|
194
|
+
// 3. Configure the "politeness" delay
|
|
195
|
+
// Base delay of 1000ms (1 second) between requests
|
|
196
|
+
throttledApi.timeoutValue = 1000;
|
|
197
|
+
// Maximum delay cap of 5000ms
|
|
198
|
+
throttledApi.timeoutLimit = 5000;
|
|
199
|
+
// Apply delay BEFORE the first request in the cycle
|
|
200
|
+
throttledApi.timeoutFirst = true;
|
|
201
|
+
|
|
202
|
+
async function runPoliteBatch() {
|
|
203
|
+
const ids = [1, 2, 3, 4, 5];
|
|
204
|
+
|
|
205
|
+
console.log("Starting polite batch fetch...");
|
|
206
|
+
|
|
207
|
+
const tasks = ids.map(id =>
|
|
208
|
+
throttledApi.exec(id).then(data => {
|
|
209
|
+
console.log(`📦 Received ID ${id} at ${new Date().toLocaleTimeString()}`);
|
|
210
|
+
return data;
|
|
211
|
+
})
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
await Promise.all(tasks);
|
|
215
|
+
console.log("🏁 Polite batch completed!");
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
runPoliteBatch();
|
|
219
|
+
```
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
# 🧵 TinyWebWorker
|
|
2
|
+
|
|
3
|
+
A tiny, strictly-typed wrapper around the native `Worker` API with a built-in
|
|
4
|
+
request/response (RPC) layer, lifecycle management, and a plugin system.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 📖 Table of Contents
|
|
9
|
+
|
|
10
|
+
1. [Overview](#-overview)
|
|
11
|
+
2. [Features](#-features)
|
|
12
|
+
3. [Installation](#-installation)
|
|
13
|
+
4. [Quick Start](#-quick-start)
|
|
14
|
+
5. [Core Concepts](#-core-concepts)
|
|
15
|
+
6. [API Reference](#-api-reference)
|
|
16
|
+
7. [The Worker Side](#-the-worker-side)
|
|
17
|
+
8. [Message Protocol](#-message-protocol)
|
|
18
|
+
9. [Error Handling](#-error-handling)
|
|
19
|
+
10. [Best Practices](#-best-practices)
|
|
20
|
+
11. [Troubleshooting](#-troubleshooting)
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 🔎 Overview
|
|
25
|
+
|
|
26
|
+
`TinyWebWorker` turns the low-level, string-based `postMessage` API into a
|
|
27
|
+
predictable, promise-based experience. It handles three things for you:
|
|
28
|
+
|
|
29
|
+
| Responsibility | What it means |
|
|
30
|
+
| --- | --- |
|
|
31
|
+
| 🔄 **Lifecycle** | Start, wait for readiness, terminate, and destroy safely. |
|
|
32
|
+
| 📨 **Events** | Fire-and-forget messages from the main thread to the worker. |
|
|
33
|
+
| 🔌 **RPC / API** | Request/response calls in **both directions**, with timeouts. |
|
|
34
|
+
|
|
35
|
+
It extends `TinyPluginCore`, so every instance is also a plugin host with an
|
|
36
|
+
event emitter (`on`, `emit`, `removeAllListeners`).
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## ✨ Features
|
|
41
|
+
|
|
42
|
+
- ✅ **Promise-based RPC** — call functions inside the worker and `await` the result.
|
|
43
|
+
- ✅ **Bidirectional API** — the worker can call back into the main thread too.
|
|
44
|
+
- ✅ **Timeouts** — every API call has a configurable timeout (default: `10s`).
|
|
45
|
+
- ✅ **Reserved namespace** — the `ww:` prefix protects internal events.
|
|
46
|
+
- ✅ **Zero-leak teardown** — `destroy()` removes listeners and clears references.
|
|
47
|
+
- ✅ **Pluggable logger** — bring your own `console`-compatible logger.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 🚀 Quick Start
|
|
52
|
+
|
|
53
|
+
### 1. Create the worker file
|
|
54
|
+
|
|
55
|
+
```javascript
|
|
56
|
+
// my.worker.js
|
|
57
|
+
self.postMessage({ type: 'ww:EngineReady' });
|
|
58
|
+
|
|
59
|
+
self.addEventListener('message', (event) => {
|
|
60
|
+
const { type, data } = event.data;
|
|
61
|
+
if (type === 'greet') {
|
|
62
|
+
self.postMessage({ type: 'greeted', data: `Hello, ${data.name}!` });
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 2. Use it from the main thread
|
|
68
|
+
|
|
69
|
+
```javascript
|
|
70
|
+
import TinyWebWorker from 'tiny-essentials/libs/worker/browser/TinyWebWorker';
|
|
71
|
+
|
|
72
|
+
const worker = new TinyWebWorker({
|
|
73
|
+
id: 'greeter',
|
|
74
|
+
workerUrl: new URL('./my.worker.js', import.meta.url),
|
|
75
|
+
debugMode: true,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// Wait until the worker signals readiness.
|
|
79
|
+
await worker.init();
|
|
80
|
+
|
|
81
|
+
// Listen for a standard event coming from the worker.
|
|
82
|
+
worker.on('greeted', ({ data }) => {
|
|
83
|
+
console.log(data); // "Hello, Yasmin!"
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// Send a fire-and-forget message.
|
|
87
|
+
worker.emitMessage('greet', { name: 'Yasmin' });
|
|
88
|
+
|
|
89
|
+
// Clean up when done.
|
|
90
|
+
worker.destroy();
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 🧠 Core Concepts
|
|
96
|
+
|
|
97
|
+
### 🏷️ The `ww:` Reserved Prefix
|
|
98
|
+
|
|
99
|
+
Any event type that starts with `ww:` is **reserved for internal use**.
|
|
100
|
+
Calling `emitMessage('ww:something')` throws a `TypeError`. This prevents your
|
|
101
|
+
code from accidentally colliding with lifecycle events like `ww:Started`.
|
|
102
|
+
|
|
103
|
+
### 🔁 Two Communication Styles
|
|
104
|
+
|
|
105
|
+
| Style | Method | Direction | Returns | Use when... |
|
|
106
|
+
| --- | --- | --- | --- | --- |
|
|
107
|
+
| **Event** | `emitMessage()` | Main ➡️ Worker | `void` | You don't need an answer. |
|
|
108
|
+
| **API** | `emitApi()` | Main ➡️ Worker | `Promise` | You need a response. |
|
|
109
|
+
| **API (reverse)** | `onApi()` | Worker ➡️ Main | — | The worker needs data from the main thread. |
|
|
110
|
+
|
|
111
|
+
### 🧬 Lifecycle
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
new TinyWebWorker() ──▶ init() ──▶ [ ww:EngineReady ] ──▶ ready ✅
|
|
115
|
+
│
|
|
116
|
+
└──▶ terminate() ──▶ destroy() ──▶ 💀
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 📚 API Reference
|
|
122
|
+
|
|
123
|
+
### `new TinyWebWorker(options)`
|
|
124
|
+
|
|
125
|
+
Creates a new manager instance.
|
|
126
|
+
|
|
127
|
+
| Option | Type | Default | Description |
|
|
128
|
+
| --- | --- | --- | --- |
|
|
129
|
+
| `id` | `string` | — | **Required.** Unique identifier for this instance. |
|
|
130
|
+
| `workerUrl` | `string \| URL` | — | **Required.** Path to the worker file. |
|
|
131
|
+
| `workerOptions` | `WorkerOptions` | `{}` | Native worker options (`type`, `name`, etc.). |
|
|
132
|
+
| `debugMode` | `boolean` | `false` | Enables verbose internal logging. |
|
|
133
|
+
| `useLogColors` | `boolean` | `false` | Enables ANSI colors in logs. |
|
|
134
|
+
| `logger` | `Partial<Console>` | `console` | A custom logger. |
|
|
135
|
+
|
|
136
|
+
**Throws:** `TypeError` if `id` is not a non-empty string, or if `workerUrl`
|
|
137
|
+
is neither a `string` nor a `URL`.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
### ⚙️ Methods
|
|
142
|
+
|
|
143
|
+
#### `init(): Promise<void>`
|
|
144
|
+
|
|
145
|
+
Instantiates the worker and wires up the message bridge. Resolves when the
|
|
146
|
+
worker posts the `ww:EngineReady` signal.
|
|
147
|
+
|
|
148
|
+
```javascript
|
|
149
|
+
await worker.init();
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**Throws:** `Error` if the worker is already initialized or the instance was destroyed.
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
#### `emitMessage(type, data?): void`
|
|
157
|
+
|
|
158
|
+
Sends a fire-and-forget event to the worker. This is the **strict** sender.
|
|
159
|
+
|
|
160
|
+
```javascript
|
|
161
|
+
worker.emitMessage('resize', { width: 800, height: 600 });
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**Throws:**
|
|
165
|
+
- `TypeError` — if `type` is not a string.
|
|
166
|
+
- `TypeError` — if `data` is not a non-null object (arrays are rejected).
|
|
167
|
+
- `TypeError` — if `type` starts with the reserved `ww:` prefix.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
#### `emitApi(type, data?, timeout?): Promise<any>`
|
|
172
|
+
|
|
173
|
+
Sends a request and resolves with the worker's response.
|
|
174
|
+
|
|
175
|
+
| Parameter | Type | Default | Description |
|
|
176
|
+
| --- | --- | --- | --- |
|
|
177
|
+
| `type` | `string` | — | The API call identifier. |
|
|
178
|
+
| `data` | `object` | `undefined` | The request payload. |
|
|
179
|
+
| `timeout` | `number` | `10000` | Max wait time in milliseconds. |
|
|
180
|
+
|
|
181
|
+
```javascript
|
|
182
|
+
const result = await worker.emitApi('math:sum', { a: 2, b: 3 });
|
|
183
|
+
console.log(result); // 5
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**Rejects:** with an `Error` if the worker returns an error or the timeout elapses.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
#### `onApi(type, callback): void`
|
|
191
|
+
|
|
192
|
+
Registers a handler for API calls **coming from the worker**.
|
|
193
|
+
|
|
194
|
+
```javascript
|
|
195
|
+
worker.onApi('user:getTheme', () => {
|
|
196
|
+
return { theme: 'dark' };
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**Throws:** `TypeError` if `callback` is not a function.
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
#### `offApi(type): boolean`
|
|
205
|
+
|
|
206
|
+
Removes a previously registered handler. Returns `true` if a handler was removed.
|
|
207
|
+
|
|
208
|
+
```javascript
|
|
209
|
+
worker.offApi('user:getTheme');
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
#### `terminate(): void`
|
|
215
|
+
|
|
216
|
+
Immediately terminates the worker and removes all listeners. The instance can
|
|
217
|
+
technically be re-initialized afterwards, but a new worker will be created.
|
|
218
|
+
|
|
219
|
+
```javascript
|
|
220
|
+
worker.terminate();
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
#### `destroy(): void`
|
|
226
|
+
|
|
227
|
+
The nuclear option. Calls `terminate()`, removes all event listeners, destroys
|
|
228
|
+
plugins, and marks the instance as destroyed. **After this, the instance is unusable.**
|
|
229
|
+
|
|
230
|
+
```javascript
|
|
231
|
+
worker.destroy();
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
### 🎛️ Getters
|
|
237
|
+
|
|
238
|
+
| Getter | Type | Description |
|
|
239
|
+
| --- | --- | --- |
|
|
240
|
+
| `isReady` | `boolean` | `true` once the worker signals readiness. |
|
|
241
|
+
| `isDestroyed` | `boolean` | `true` after `destroy()` is called. |
|
|
242
|
+
| `worker` | `Worker \| null` | The native worker. **Throws if destroyed.** |
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
### 📡 Events
|
|
247
|
+
|
|
248
|
+
Subscribe with `worker.on(eventName, handler)`.
|
|
249
|
+
|
|
250
|
+
| Event | Payload | Fired when... |
|
|
251
|
+
| --- | --- | --- |
|
|
252
|
+
| `ww:Started` | — | The worker is ready. |
|
|
253
|
+
| `ww:Error` | `{ error: ErrorEvent }` | The worker throws an uncaught error. |
|
|
254
|
+
| `ww:Terminated` | — | `terminate()` completes. |
|
|
255
|
+
| *custom* | `{ data, event }` | Any event sent by the worker. |
|
|
256
|
+
|
|
257
|
+
```javascript
|
|
258
|
+
worker.on('ww:Error', ({ error }) => {
|
|
259
|
+
console.error('Worker crashed:', error.message);
|
|
260
|
+
});
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## 📨 Message Protocol
|
|
266
|
+
|
|
267
|
+
Every message is a plain object. These are the exact shapes the main thread
|
|
268
|
+
reads and writes.
|
|
269
|
+
|
|
270
|
+
### Main ➡️ Worker
|
|
271
|
+
|
|
272
|
+
```javascript
|
|
273
|
+
// Fire-and-forget event
|
|
274
|
+
{ type: 'my:event', data: { /* ... */ } }
|
|
275
|
+
|
|
276
|
+
// API request
|
|
277
|
+
{ type: 'my:api', data: { /* ... */ }, correlationId: 'uuid', isApi: true }
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Worker ➡️ Main
|
|
281
|
+
|
|
282
|
+
```javascript
|
|
283
|
+
// Readiness signal (required once)
|
|
284
|
+
{ type: 'ww:EngineReady' }
|
|
285
|
+
|
|
286
|
+
// API response (success)
|
|
287
|
+
{ type: 'ww:ApiResponse', correlationId: 'uuid', data: { /* ... */ } }
|
|
288
|
+
|
|
289
|
+
// API response (error)
|
|
290
|
+
{ type: 'ww:ApiResponse', correlationId: 'uuid', error: 'Something failed' }
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## 🚨 Error Handling
|
|
296
|
+
|
|
297
|
+
`TinyWebWorker` fails loudly and early:
|
|
298
|
+
|
|
299
|
+
- **Construction** validates `id` and `workerUrl` immediately.
|
|
300
|
+
- **`emitMessage`** rejects arrays and primitives as `data`.
|
|
301
|
+
- **`emitApi`** rejects its promise on timeout or worker-side errors.
|
|
302
|
+
- **`ww:Error`** is emitted for uncaught worker errors.
|
|
303
|
+
|
|
304
|
+
```javascript
|
|
305
|
+
try {
|
|
306
|
+
const result = await worker.emitApi('risky:operation', { id: 42 }, 5000);
|
|
307
|
+
} catch (error) {
|
|
308
|
+
console.error('The call failed:', error.message);
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
## ✅ Best Practices
|
|
315
|
+
|
|
316
|
+
1. **Always `await worker.init()`** before sending messages.
|
|
317
|
+
2. **Always call `destroy()`** in your framework's cleanup (e.g., `useEffect`, `onUnmounted`).
|
|
318
|
+
3. **Prefer `emitApi` over `emitMessage`** when you need confirmation.
|
|
319
|
+
4. **Never use the `ww:` prefix** in your own event names.
|
|
320
|
+
5. **Set realistic timeouts** for long-running tasks instead of relying on the default `10s`.
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## 🩺 Troubleshooting
|
|
325
|
+
|
|
326
|
+
| Symptom | Likely cause | Fix |
|
|
327
|
+
| --- | --- | --- |
|
|
328
|
+
| `init()` never resolves | Worker never posts `ww:EngineReady`. | Add the ready signal at the end of your worker. |
|
|
329
|
+
| `API request timeout` | The worker never responded. | Check the `correlationId` handling in the worker. |
|
|
330
|
+
| `The event type "..." is reserved` | You used the `ww:` prefix. | Rename your event. |
|
|
331
|
+
| `Worker is not initialized` | You called a method before `init()`. | `await worker.init()` first. |
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# 🚀 TinyWebWorkerEngine Documentation
|
|
2
|
+
|
|
3
|
+
Welcome to the official documentation for the **TinyWebWorkerEngine**. This engine is a robust, lightweight solution designed to manage complex communication patterns between a **Main Thread** and a **Web Worker**. It provides structured messaging, a request-response API pattern, and a plugin-ready architecture.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 📖 Overview
|
|
8
|
+
|
|
9
|
+
In a standard Web Worker environment, `postMessage` is "fire and forget." This makes it difficult to know when a specific request has been processed or to handle errors returned from the other side.
|
|
10
|
+
|
|
11
|
+
**TinyWebWorkerEngine** solves this by implementing:
|
|
12
|
+
1. **Unidirectional Messaging:** Simple "fire and forget" signals. 📢
|
|
13
|
+
2. **Bidirectional API Calls:** A request-response pattern using `correlationId` to track specific requests. 🔄
|
|
14
|
+
3. **Strict Validation:** Ensures data integrity by validating types and structures before processing. 🛡️
|
|
15
|
+
4. **Namespace Protection:** Uses a `ww:` prefix to prevent user messages from interfering with internal engine signals. 🔒
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 🛠 Core Concepts
|
|
20
|
+
|
|
21
|
+
To use this engine effectively, you must understand the two primary communication patterns it supports.
|
|
22
|
+
|
|
23
|
+
### 1. Unidirectional Messages (Fire and Forget) 📢
|
|
24
|
+
This is used when you want to send information without expecting a reply.
|
|
25
|
+
* **From Worker to Main:** Use `engine.emit('type', data)`.
|
|
26
|
+
* **From Main to Worker:** Use `engine.addMessageListener('type', callback)`.
|
|
27
|
+
|
|
28
|
+
### 2. The API Pattern (Request-Response) 🔄
|
|
29
|
+
This is used when the Worker needs to ask the Main Thread for something (like a database value or a UI state) and **must wait** for the answer.
|
|
30
|
+
* **The Mechanism:** The engine generates a unique `correlationId` (using `crypto.randomUUID()`). This ID travels with the request and returns with the response, allowing the engine to resolve the correct `Promise`.
|
|
31
|
+
* **Timeout Protection:** Every API request has a default timeout (10,000ms) to prevent the Worker from waiting indefinitely if the Main Thread fails to respond.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 🚀 API Reference
|
|
36
|
+
|
|
37
|
+
### 🛠 Class: `TinyWebWorkerEngine`
|
|
38
|
+
|
|
39
|
+
#### `constructor(lgConfig)`
|
|
40
|
+
Initializes the engine instance.
|
|
41
|
+
* **Parameters:**
|
|
42
|
+
* `lgConfig` `{Object}`: Configuration object.
|
|
43
|
+
* `lgConfig.debugMode` `{boolean}`: Enables detailed internal logging.
|
|
44
|
+
* `lgConfig.logger` `{Console}`: Custom logger (defaults to `console`).
|
|
45
|
+
|
|
46
|
+
#### `init()`
|
|
47
|
+
Starts the engine and begins listening for messages.
|
|
48
|
+
* **Note:** This must be called **once**. Calling it twice will throw an `Error`.
|
|
49
|
+
* **Internal Signal:** Once initialized, the engine automatically sends a `ww:EngineReady` signal to the main thread.
|
|
50
|
+
|
|
51
|
+
#### `onApi(type, callback)`
|
|
52
|
+
Registers a handler for requests coming **from the Main Thread**.
|
|
53
|
+
* **Parameters:**
|
|
54
|
+
* `type` `{string}`: The unique identifier for the API call.
|
|
55
|
+
* `callback` `{ApiHandlerCallback}`: The function to execute. It can be synchronous or return a `Promise`.
|
|
56
|
+
* **Throws:** `TypeError` if the callback is not a function.
|
|
57
|
+
|
|
58
|
+
#### `addMessageListener(type, callback)`
|
|
59
|
+
Registers a listener for simple, unidirectional messages.
|
|
60
|
+
* **Parameters:**
|
|
61
|
+
* `type` `{string}`: The message type.
|
|
62
|
+
* `callback` `{MessageCallback}`: The function to execute when the message arrives.
|
|
63
|
+
|
|
64
|
+
#### `emit(type, data)`
|
|
65
|
+
Sends a unidirectional message to the Main Thread.
|
|
66
|
+
* **Parameters:**
|
|
67
|
+
* `type` `{string}`: The identifier. **Cannot start with `ww:`**.
|
|
68
|
+
* `data` `{Object|undefined}`: The payload. Must be a non-null object.
|
|
69
|
+
* **Throws:** `TypeError` if the type is reserved or data is invalid.
|
|
70
|
+
|
|
71
|
+
#### `emitApi(type, data, timeout)`
|
|
72
|
+
Sends a request to the Main Thread and returns a `Promise` that resolves when the reply arrives.
|
|
73
|
+
* **Parameters:**
|
|
74
|
+
* `type` `{string}`: The identifier for the request.
|
|
75
|
+
* `data` `{Object|undefined}`: The request payload.
|
|
76
|
+
* `timeout` `{number}`: Max wait time in ms (default `10000`).
|
|
77
|
+
* **Returns:** `Promise<any>`
|
|
78
|
+
* **Throws:** `Error` if the timeout is reached.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 📝 Practical Examples
|
|
83
|
+
|
|
84
|
+
### 🏗 Example 1: Setting up the Worker
|
|
85
|
+
This is how you would implement the engine inside your `worker.js` file.
|
|
86
|
+
|
|
87
|
+
```javascript
|
|
88
|
+
import TinyWebWorkerEngine from 'tiny-essentials/libs/worker/engine/TinyWebWorkerEngine';
|
|
89
|
+
|
|
90
|
+
const engine = new TinyWebWorkerEngine({ debugMode: true });
|
|
91
|
+
|
|
92
|
+
// 1. Handle simple messages from the main thread
|
|
93
|
+
engine.addMessageListener('GREETING', (msg) => {
|
|
94
|
+
console.log('Received greeting:', msg.data.text);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// 2. Handle API requests (Request-Response)
|
|
98
|
+
engine.onApi('GET_USER_DATA', async ({ data, correlationId }) => {
|
|
99
|
+
// Simulate an async database fetch
|
|
100
|
+
const user = await fetchUserData(data.userId);
|
|
101
|
+
|
|
102
|
+
// Return the result to the main thread
|
|
103
|
+
return user;
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// 3. Start the engine
|
|
107
|
+
engine.init();
|
|
108
|
+
|
|
109
|
+
// 4. Emit a simple notification to the main thread
|
|
110
|
+
engine.emit('STATUS_UPDATE', { status: 'Worker is running smoothly' });
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### 📡 Example 2: Using the Engine in the Main Thread
|
|
114
|
+
(Conceptual logic for the Main Thread side)
|
|
115
|
+
|
|
116
|
+
```javascript
|
|
117
|
+
// When the worker sends a simple message
|
|
118
|
+
worker.addEventListener('message', (event) => {
|
|
119
|
+
if (event.data.type === 'STATUS_UPDATE') {
|
|
120
|
+
console.log('Worker status:', event.data.data.status);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// When the worker makes an API call to the main thread
|
|
125
|
+
engine.onApi('GET_USER_DATA', async ({ data }) => {
|
|
126
|
+
return { id: data.userId, name: 'Yasmin', role: 'Developer' };
|
|
127
|
+
});
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## ⚠️ Safety & Best Practices
|
|
133
|
+
|
|
134
|
+
1. **Avoid Namespace Collisions:** Never use the `ww:` prefix for your own custom message types. The engine uses this for internal lifecycle management (like `ww:ApiResponse`).
|
|
135
|
+
2. **Error Handling in API:** When writing an `onApi` handler, always wrap your logic in `try/catch` or return a rejected `Promise`. The engine will automatically catch these and send the error back to the main thread.
|
|
136
|
+
3. **Data Integrity:** Always pass objects as `data`. Avoid passing primitives (like just a string) if you plan to expand the data structure later.
|
|
137
|
+
4. **Timeout Management:** When calling `emitApi`, always be prepared to handle a potential timeout error in your `.catch()` block.
|