@timber-js/app 0.2.0-alpha.1 → 0.2.0-alpha.100
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/LICENSE +8 -0
- package/dist/_chunks/actions-CQ8Z8VGL.js +1061 -0
- package/dist/_chunks/actions-CQ8Z8VGL.js.map +1 -0
- package/dist/_chunks/build-output-helper-DXnW0qjz.js +61 -0
- package/dist/_chunks/build-output-helper-DXnW0qjz.js.map +1 -0
- package/dist/_chunks/chunk-BYIpzuS7.js +39 -0
- package/dist/_chunks/define-B-Q_UMOD.js +195 -0
- package/dist/_chunks/define-B-Q_UMOD.js.map +1 -0
- package/dist/_chunks/define-CfBPoJb0.js +123 -0
- package/dist/_chunks/define-CfBPoJb0.js.map +1 -0
- package/dist/_chunks/define-cookie-BjpIt4UC.js +194 -0
- package/dist/_chunks/define-cookie-BjpIt4UC.js.map +1 -0
- package/dist/_chunks/format-Bcn-Iv1x.js +14 -0
- package/dist/_chunks/format-Bcn-Iv1x.js.map +1 -0
- package/dist/_chunks/handler-store-B-lqaGyh.js +54 -0
- package/dist/_chunks/handler-store-B-lqaGyh.js.map +1 -0
- package/dist/_chunks/logger-0m8MsKdc.js +291 -0
- package/dist/_chunks/logger-0m8MsKdc.js.map +1 -0
- package/dist/_chunks/merge-search-params-BphMdht_.js +122 -0
- package/dist/_chunks/merge-search-params-BphMdht_.js.map +1 -0
- package/dist/_chunks/{metadata-routes-CQCnF4VK.js → metadata-routes-BU684ls2.js} +1 -1
- package/dist/_chunks/{metadata-routes-CQCnF4VK.js.map → metadata-routes-BU684ls2.js.map} +1 -1
- package/dist/_chunks/navigation-root-BCYczjml.js +96 -0
- package/dist/_chunks/navigation-root-BCYczjml.js.map +1 -0
- package/dist/_chunks/registry-I2ss-lvy.js +20 -0
- package/dist/_chunks/registry-I2ss-lvy.js.map +1 -0
- package/dist/_chunks/router-ref-h3-UaCQv.js +28 -0
- package/dist/_chunks/router-ref-h3-UaCQv.js.map +1 -0
- package/dist/_chunks/schema-bridge-Cxu4l-7p.js +86 -0
- package/dist/_chunks/schema-bridge-Cxu4l-7p.js.map +1 -0
- package/dist/_chunks/segment-classify-BjfuctV2.js +137 -0
- package/dist/_chunks/segment-classify-BjfuctV2.js.map +1 -0
- package/dist/_chunks/segment-context-Dx_OizxD.js +34 -0
- package/dist/_chunks/segment-context-Dx_OizxD.js.map +1 -0
- package/dist/_chunks/{ssr-data-DLnbYpj1.js → ssr-data-B4CdH7rE.js} +1 -1
- package/dist/_chunks/ssr-data-B4CdH7rE.js.map +1 -0
- package/dist/_chunks/stale-reload-Bab885FO.js +64 -0
- package/dist/_chunks/stale-reload-Bab885FO.js.map +1 -0
- package/dist/_chunks/tracing-C8V-YGsP.js +329 -0
- package/dist/_chunks/tracing-C8V-YGsP.js.map +1 -0
- package/dist/_chunks/{use-query-states-DAhgj8Gx.js → use-query-states-B2XTqxDR.js} +7 -20
- package/dist/_chunks/use-query-states-B2XTqxDR.js.map +1 -0
- package/dist/_chunks/use-segment-params-BkpKAQ7D.js +185 -0
- package/dist/_chunks/use-segment-params-BkpKAQ7D.js.map +1 -0
- package/dist/_chunks/walkers-Tg0Alwcg.js +850 -0
- package/dist/_chunks/walkers-Tg0Alwcg.js.map +1 -0
- package/dist/_chunks/{format-DNt20Kt8.js → warnings-Cg47l5sk.js} +7 -45
- package/dist/_chunks/warnings-Cg47l5sk.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +28 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +73 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +95 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +148 -12
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +142 -38
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +17 -1
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +143 -45
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +16 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +24 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/fast-hash.d.ts +22 -0
- package/dist/cache/fast-hash.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +31 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +23 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +195 -84
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/singleflight.d.ts +18 -1
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cli.d.ts +6 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +8 -3
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +34 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +46 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +23 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +19 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +12 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +26 -5
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +54 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +19 -4
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +9 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +312 -1109
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +964 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link-pending-store.d.ts +63 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +73 -63
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/nav-link-store.d.ts +36 -0
- package/dist/client/nav-link-store.d.ts.map +1 -0
- package/dist/client/navigation-api-types.d.ts +90 -0
- package/dist/client/navigation-api-types.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +115 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +22 -5
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router.d.ts +70 -4
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +38 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +1 -1
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-context.d.ts +1 -1
- package/dist/client/segment-context.d.ts.map +1 -1
- package/dist/client/segment-merger.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +63 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +13 -4
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-reload.d.ts +15 -0
- package/dist/client/stale-reload.d.ts.map +1 -1
- package/dist/client/state.d.ts +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +8 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +1 -1
- package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +7 -5
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +33 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +2 -0
- package/dist/config-types.d.ts +294 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- package/dist/cookies/define-cookie.d.ts +98 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +2 -1
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +36 -72
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +46 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +46 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +84 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +58 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +54 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
- package/dist/dev-tools/warnings.d.ts.map +1 -0
- package/dist/fonts/bundle.d.ts +48 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/css.d.ts +1 -0
- package/dist/fonts/css.d.ts.map +1 -1
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/local.d.ts +4 -2
- package/dist/fonts/local.d.ts.map +1 -1
- package/dist/fonts/pipeline.d.ts +167 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +64 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +45 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +103 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -152
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14702 -12350
- package/dist/index.js.map +1 -1
- package/dist/plugin-context.d.ts +107 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +1 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +2 -2
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +16 -4
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/chunks.d.ts +9 -1
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +32 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +1 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +8 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +17 -65
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +7 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +6 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +4 -4
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +55 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +52 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +2 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/index.d.ts +5 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +3 -2
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +1 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/segment-classify.d.ts +75 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/status-file-lint.d.ts +2 -1
- package/dist/routing/status-file-lint.d.ts.map +1 -1
- package/dist/routing/types.d.ts +77 -25
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +51 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +76 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +157 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +34 -441
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +95 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +8 -3
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +41 -6
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +35 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +3 -6
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +33 -5
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +1 -15
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +2 -2
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +51 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/debug.d.ts +82 -0
- package/dist/server/debug.d.ts.map +1 -0
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +90 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -5
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -1
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +42 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/flush.d.ts.map +1 -1
- package/dist/server/form-data.d.ts +29 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +212 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +81 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +9 -46
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +158 -2899
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +48 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +2900 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +36 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +110 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +26 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +95 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +52 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +93 -23
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +117 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +69 -18
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +41 -109
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +27 -1
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +21 -34
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +2 -2
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +49 -6
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +20 -3
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +50 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +20 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/rsc-prop-warnings.d.ts.map +1 -1
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +129 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +1 -1
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-entry.d.ts +23 -0
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +39 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +50 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +16 -11
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +36 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +15 -5
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +62 -30
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/types.d.ts +49 -4
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/server/waituntil-bridge.d.ts.map +1 -1
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +2 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +3 -1
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +11 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/directive-parser.d.ts +1 -43
- package/dist/utils/directive-parser.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/package.json +56 -22
- package/src/adapters/build-output-helper.ts +77 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +142 -0
- package/src/adapters/cloudflare.ts +350 -76
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +148 -60
- package/src/adapters/shared.ts +40 -0
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +38 -0
- package/src/cache/fast-hash.ts +34 -0
- package/src/cache/handler-store.ts +68 -0
- package/src/cache/index.ts +81 -18
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/sizeof.ts +31 -0
- package/src/cache/timber-cache.ts +41 -29
- package/src/cli.ts +16 -6
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +116 -0
- package/src/client/browser-entry/hmr.ts +81 -0
- package/src/client/browser-entry/hydrate.ts +145 -0
- package/src/client/browser-entry/index.ts +143 -0
- package/src/client/browser-entry/post-hydration.ts +119 -0
- package/src/client/browser-entry/router-init.ts +193 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +27 -0
- package/src/client/error-boundary.tsx +97 -20
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +77 -43
- package/src/client/internal.ts +58 -0
- package/src/client/link-pending-store.ts +111 -0
- package/src/client/link.tsx +432 -140
- package/src/client/nav-link-store.ts +47 -0
- package/src/client/navigation-api-types.ts +112 -0
- package/src/client/navigation-api.ts +332 -0
- package/src/client/navigation-context.ts +83 -18
- package/src/client/navigation-root.tsx +342 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +303 -78
- package/src/client/rsc-fetch.ts +112 -8
- package/src/client/segment-cache.ts +1 -1
- package/src/client/segment-context.ts +6 -1
- package/src/client/segment-merger.ts +2 -8
- package/src/client/segment-outlet.tsx +86 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/stale-reload.ts +74 -7
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +41 -25
- package/src/client/use-cookie.ts +29 -0
- package/src/client/use-link-status.ts +7 -7
- package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
- package/src/client/use-query-states.ts +9 -3
- package/src/client/use-router.ts +1 -1
- package/src/client/{use-params.ts → use-segment-params.ts} +7 -5
- package/src/codec.ts +45 -0
- package/src/config-types.ts +292 -0
- package/src/config-validation.ts +303 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +301 -55
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +134 -0
- package/src/dev-tools/404-page.ts +387 -0
- package/src/dev-tools/browser-logs.ts +288 -0
- package/src/dev-tools/error-page.ts +509 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/index.ts +90 -0
- package/src/dev-tools/instrumentation.ts +176 -0
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +3 -3
- package/src/dev-tools/overlay.ts +456 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +183 -0
- package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +6 -50
- package/src/fonts/bundle.ts +142 -0
- package/src/fonts/css.ts +2 -1
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/local.ts +7 -3
- package/src/fonts/pipeline.ts +314 -0
- package/src/fonts/transform.ts +406 -0
- package/src/fonts/types.ts +50 -1
- package/src/fonts/virtual-modules.ts +227 -0
- package/src/index.ts +376 -315
- package/src/plugin-context.ts +240 -0
- package/src/plugins/adapter-build.ts +12 -4
- package/src/plugins/build-manifest.ts +13 -2
- package/src/plugins/build-report.ts +32 -21
- package/src/plugins/chunks.ts +9 -1
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +154 -21
- package/src/plugins/entries.ts +119 -12
- package/src/plugins/fonts.ts +177 -524
- package/src/plugins/mdx.ts +52 -15
- package/src/plugins/routing.ts +225 -41
- package/src/plugins/server-action-exports.ts +1 -1
- package/src/plugins/server-bundle.ts +36 -1
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +17 -11
- package/src/routing/codegen-shared.ts +98 -0
- package/src/routing/codegen-types.ts +53 -0
- package/src/routing/codegen.ts +143 -176
- package/src/routing/convention-lint.ts +357 -0
- package/src/routing/index.ts +5 -1
- package/src/routing/interception.ts +1 -1
- package/src/routing/link-codegen.ts +294 -0
- package/src/routing/scanner.ts +107 -110
- package/src/routing/segment-classify.ts +188 -0
- package/src/routing/status-file-lint.ts +10 -7
- package/src/routing/types.ts +78 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +2 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
- package/src/search-params/define.ts +538 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +92 -0
- package/src/segment-params/define.ts +332 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +79 -36
- package/src/server/action-client.ts +103 -20
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +112 -14
- package/src/server/actions.ts +10 -9
- package/src/server/als-registry.ts +35 -7
- package/src/server/asset-headers.ts +8 -34
- package/src/server/build-manifest.ts +10 -4
- package/src/server/compress.ts +25 -7
- package/src/server/cookie-context.ts +468 -0
- package/src/server/cookie-parsing.ts +135 -0
- package/src/server/debug.ts +137 -0
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +218 -0
- package/src/server/deny-renderer.ts +33 -51
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +36 -15
- package/src/server/error-boundary-wrapper.ts +74 -22
- package/src/server/fallback-error.ts +74 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/flush.ts +2 -1
- package/src/server/form-data.ts +76 -0
- package/src/server/html-injector-core.ts +403 -0
- package/src/server/html-injectors.ts +244 -223
- package/src/server/index.ts +31 -184
- package/src/server/internal.ts +176 -0
- package/src/server/logger.ts +67 -35
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +369 -0
- package/src/server/param-coercion.ts +76 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +17 -16
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline-outcome.ts +167 -0
- package/src/server/pipeline-phases.ts +409 -0
- package/src/server/pipeline.ts +128 -387
- package/src/server/port-resolution.ts +215 -0
- package/src/server/primitives.ts +113 -29
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +94 -337
- package/src/server/route-element-builder.ts +289 -198
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +44 -65
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +16 -17
- package/src/server/rsc-entry/error-renderer.ts +305 -89
- package/src/server/rsc-entry/helpers.ts +136 -12
- package/src/server/rsc-entry/index.ts +330 -312
- package/src/server/rsc-entry/render-route.ts +304 -0
- package/src/server/rsc-entry/rsc-payload.ts +100 -18
- package/src/server/rsc-entry/rsc-stream.ts +90 -17
- package/src/server/rsc-entry/ssr-bridge.ts +14 -5
- package/src/server/rsc-entry/ssr-renderer.ts +177 -37
- package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
- package/src/server/rsc-prop-warnings.ts +3 -1
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/sitemap-generator.ts +338 -0
- package/src/server/sitemap-handler.ts +126 -0
- package/src/server/slot-resolver.ts +245 -230
- package/src/server/ssr-entry.ts +215 -32
- package/src/server/ssr-render.ts +289 -67
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/state-tree-diff.ts +4 -1
- package/src/server/status-code-resolver.ts +112 -128
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +44 -10
- package/src/server/tree-builder.ts +202 -90
- package/src/server/types.ts +55 -6
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/version-skew.ts +104 -0
- package/src/server/waituntil-bridge.ts +4 -1
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +5 -1
- package/src/shims/navigation-client.ts +4 -3
- package/src/shims/navigation.ts +14 -7
- package/src/utils/directive-parser.ts +1 -390
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-k-AtAQ9R.js +0 -41
- package/dist/_chunks/als-registry-k-AtAQ9R.js.map +0 -1
- package/dist/_chunks/format-DNt20Kt8.js.map +0 -1
- package/dist/_chunks/interception-DGDIjDbR.js +0 -676
- package/dist/_chunks/interception-DGDIjDbR.js.map +0 -1
- package/dist/_chunks/request-context-CRj2Zh1E.js +0 -329
- package/dist/_chunks/request-context-CRj2Zh1E.js.map +0 -1
- package/dist/_chunks/ssr-data-DLnbYpj1.js.map +0 -1
- package/dist/_chunks/tracing-DF0G3FB7.js +0 -173
- package/dist/_chunks/tracing-DF0G3FB7.js.map +0 -1
- package/dist/_chunks/use-cookie-dDbpCTx-.js +0 -91
- package/dist/_chunks/use-cookie-dDbpCTx-.js.map +0 -1
- package/dist/_chunks/use-query-states-DAhgj8Gx.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -22
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/browser-links.d.ts +0 -32
- package/dist/client/browser-links.d.ts.map +0 -1
- package/dist/client/link-navigate-interceptor.d.ts +0 -28
- package/dist/client/link-navigate-interceptor.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -99
- package/src/client/browser-entry.ts +0 -686
- package/src/client/browser-links.ts +0 -90
- package/src/client/link-navigate-interceptor.tsx +0 -62
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/transition-root.tsx +0 -160
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/create.ts +0 -321
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Cache-Control value for hashed (immutable) assets. */
|
|
2
|
+
export declare const IMMUTABLE_CACHE = "public, max-age=31536000, immutable";
|
|
3
|
+
/** Cache-Control value for unhashed static assets. */
|
|
4
|
+
export declare const STATIC_CACHE = "public, max-age=3600, must-revalidate";
|
|
5
|
+
/**
|
|
6
|
+
* Generate a `_headers` file for static asset cache control.
|
|
7
|
+
*
|
|
8
|
+
* The `_headers` file is a platform convention supported by Cloudflare Workers
|
|
9
|
+
* Static Assets, Cloudflare Pages, and Netlify. It maps URL patterns to
|
|
10
|
+
* HTTP response headers.
|
|
11
|
+
*
|
|
12
|
+
* Vite places all hashed chunks under `/assets/` — these get immutable caching.
|
|
13
|
+
* Everything else (favicon.ico, robots.txt, etc.) gets a shorter cache.
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateHeadersFile(): string;
|
|
16
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/adapters/shared.ts"],"names":[],"mappings":"AAaA,yDAAyD;AACzD,eAAO,MAAM,eAAe,wCAAwC,CAAC;AAErE,sDAAsD;AACtD,eAAO,MAAM,YAAY,0CAA0C,CAAC;AAEpE;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAU5C"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CacheOptions } from './index';
|
|
2
|
+
/**
|
|
3
|
+
* Public caching API: `cache(fn, opts)`.
|
|
4
|
+
*
|
|
5
|
+
* Wraps an async function with cross-request caching. Uses the configured
|
|
6
|
+
* cache handler (defaults to MemoryCacheHandler, overridable via timber.config.ts).
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { cache } from '@timber-js/app/cache';
|
|
10
|
+
*
|
|
11
|
+
* const getUser = cache(
|
|
12
|
+
* async (id: string) => db.users.findUnique({ where: { id } }),
|
|
13
|
+
* { ttl: 60, tags: (id) => [`user:${id}`] }
|
|
14
|
+
* );
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function cache<Fn extends (...args: any[]) => Promise<any>>(fn: Fn, opts: CacheOptions<Fn>): Fn;
|
|
18
|
+
export declare namespace cache {
|
|
19
|
+
var invalidate: (opts: {
|
|
20
|
+
key?: string;
|
|
21
|
+
tag?: string;
|
|
22
|
+
}) => Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=cache-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-api.d.ts","sourceRoot":"","sources":["../../src/cache/cache-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C;;;;;;;;;;;;;;GAcG;AAEH,wBAAgB,KAAK,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EAC/D,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC,GACrB,EAAE,CAEJ;yBALe,KAAK;2BAe8B;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,KAAG,OAAO,CAAC,IAAI,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fast non-cryptographic hash for cache keys.
|
|
3
|
+
*
|
|
4
|
+
* FNV-1a 64-bit produces a well-distributed hash with a collision
|
|
5
|
+
* probability of ~1 in 5 billion at 77k keys (birthday paradox).
|
|
6
|
+
* Not suitable for security, but ideal for cache key generation
|
|
7
|
+
* where we need speed over crypto strength.
|
|
8
|
+
*
|
|
9
|
+
* Uses BigInt for 64-bit arithmetic — supported in all modern runtimes
|
|
10
|
+
* including Cloudflare Workers. No node:crypto dependency.
|
|
11
|
+
*
|
|
12
|
+
* See TIM-370.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Compute a 64-bit FNV-1a hash of a string, returned as a 16-char hex string.
|
|
16
|
+
*
|
|
17
|
+
* 64 bits gives ~5 billion keys before a 50% collision probability
|
|
18
|
+
* (birthday paradox), making accidental collisions effectively impossible
|
|
19
|
+
* for cache key use cases.
|
|
20
|
+
*/
|
|
21
|
+
export declare function fnv1aHash(input: string): string;
|
|
22
|
+
//# sourceMappingURL=fast-hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fast-hash.d.ts","sourceRoot":"","sources":["../../src/cache/fast-hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO/C"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module-level cache handler singleton.
|
|
3
|
+
*
|
|
4
|
+
* Lazily initialized to MemoryCacheHandler on first access. The framework
|
|
5
|
+
* replaces this at boot from timber.config.ts via setCacheHandler().
|
|
6
|
+
*
|
|
7
|
+
* This module avoids importing from ./index to prevent circular dependencies.
|
|
8
|
+
*/
|
|
9
|
+
interface CacheHandlerLike {
|
|
10
|
+
get(key: string): Promise<{
|
|
11
|
+
value: unknown;
|
|
12
|
+
stale: boolean;
|
|
13
|
+
} | null>;
|
|
14
|
+
set(key: string, value: unknown, opts: {
|
|
15
|
+
ttl: number;
|
|
16
|
+
tags: string[];
|
|
17
|
+
}): Promise<void>;
|
|
18
|
+
invalidate(opts: {
|
|
19
|
+
key?: string;
|
|
20
|
+
tag?: string;
|
|
21
|
+
}): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
/** Replace the active cache handler. Called by the framework at boot. */
|
|
24
|
+
export declare function setCacheHandler(h: CacheHandlerLike): void;
|
|
25
|
+
/**
|
|
26
|
+
* Get the active cache handler. Creates a default MemoryCacheHandler on
|
|
27
|
+
* first access if none has been set via setCacheHandler().
|
|
28
|
+
*/
|
|
29
|
+
export declare function getCacheHandler(): CacheHandlerLike;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=handler-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-store.d.ts","sourceRoot":"","sources":["../../src/cache/handler-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,UAAU,gBAAgB;IACxB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACrE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF,UAAU,CAAC,IAAI,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAID,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAEzD;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,gBAAgB,CAOlD"}
|
package/dist/cache/index.d.ts
CHANGED
|
@@ -17,14 +17,29 @@ export interface CacheOptions<Fn extends (...args: any[]) => any> {
|
|
|
17
17
|
key?: (...args: Parameters<Fn>) => string;
|
|
18
18
|
staleWhileRevalidate?: boolean;
|
|
19
19
|
tags?: string[] | ((...args: Parameters<Fn>) => string[]);
|
|
20
|
+
/** Timeout (ms) for singleflight-coalesced calls. Prevents hung fn() from
|
|
21
|
+
* permanently blocking all future callers for the same cache key. See TIM-518. */
|
|
22
|
+
timeoutMs?: number;
|
|
20
23
|
}
|
|
21
24
|
export interface MemoryCacheHandlerOptions {
|
|
22
25
|
/** Maximum number of entries. Oldest accessed entries are evicted first. Default: 1000. */
|
|
26
|
+
maxEntries?: number;
|
|
27
|
+
/**
|
|
28
|
+
* @deprecated Use `maxEntries` instead. Will be removed in a future release.
|
|
29
|
+
* Alias for `maxEntries` — maximum number of entries (not bytes).
|
|
30
|
+
*/
|
|
23
31
|
maxSize?: number;
|
|
32
|
+
/** Maximum total byte budget for all cached values. Oldest entries are evicted when exceeded. Default: no limit. */
|
|
33
|
+
maxBytes?: number;
|
|
34
|
+
/** Maximum byte size for a single cache entry. Entries exceeding this are silently dropped. Default: no limit. */
|
|
35
|
+
maxEntryBytes?: number;
|
|
24
36
|
}
|
|
25
37
|
export declare class MemoryCacheHandler implements CacheHandler {
|
|
26
38
|
private store;
|
|
27
|
-
private
|
|
39
|
+
private maxEntries;
|
|
40
|
+
private maxBytes;
|
|
41
|
+
private maxEntryBytes;
|
|
42
|
+
private currentBytes;
|
|
28
43
|
constructor(opts?: MemoryCacheHandlerOptions);
|
|
29
44
|
get(key: string): Promise<{
|
|
30
45
|
value: unknown;
|
|
@@ -40,13 +55,14 @@ export declare class MemoryCacheHandler implements CacheHandler {
|
|
|
40
55
|
}): Promise<void>;
|
|
41
56
|
/** Number of entries currently in the cache. */
|
|
42
57
|
get size(): number;
|
|
58
|
+
/** Estimated total byte size of all cached values. */
|
|
59
|
+
get bytes(): number;
|
|
60
|
+
/** Evict the oldest entry (front of Map). */
|
|
61
|
+
private evictOldest;
|
|
43
62
|
}
|
|
44
63
|
export { RedisCacheHandler } from './redis-handler';
|
|
45
64
|
export type { RedisClient } from './redis-handler';
|
|
46
|
-
export {
|
|
47
|
-
export {
|
|
48
|
-
export
|
|
49
|
-
export { stableStringify } from './stable-stringify';
|
|
50
|
-
export { createSingleflight } from './singleflight';
|
|
51
|
-
export type { Singleflight } from './singleflight';
|
|
65
|
+
export { cache } from './cache-api';
|
|
66
|
+
export { setCacheHandler, getCacheHandler } from './handler-store';
|
|
67
|
+
export { estimateByteSize } from './sizeof';
|
|
52
68
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACrE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF,UAAU,CAAC,IAAI,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAGD,MAAM,WAAW,YAAY,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC;IAC1C,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;IAC1D;uFACmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oHAAoH;IACpH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kHAAkH;IAClH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,kBAAmB,YAAW,YAAY;IACrD,OAAO,CAAC,KAAK,CAGT;IACJ,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,YAAY,CAAK;gBAEb,IAAI,CAAC,EAAE,yBAAyB;IAOtC,GAAG,CAAC,GAAG,EAAE,MAAM;;;;IAYf,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAwCtE,UAAU,CAAC,IAAI,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE;IAkBrD,gDAAgD;IAChD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,sDAAsD;IACtD,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,6CAA6C;IAC7C,OAAO,CAAC,WAAW;CAQpB;AAED,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/cache/index.js
CHANGED
|
@@ -1,6 +1,37 @@
|
|
|
1
|
-
import "../_chunks/
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { n as addSpanEventSync } from "../_chunks/tracing-C8V-YGsP.js";
|
|
2
|
+
import { d as logSwrRefetchFailed } from "../_chunks/logger-0m8MsKdc.js";
|
|
3
|
+
import { n as setCacheHandler, t as getCacheHandler } from "../_chunks/handler-store-B-lqaGyh.js";
|
|
4
|
+
//#region src/cache/sizeof.ts
|
|
5
|
+
/**
|
|
6
|
+
* Lightweight byte-size estimation for cache entries.
|
|
7
|
+
*
|
|
8
|
+
* Estimates the in-memory byte cost of a JavaScript value using
|
|
9
|
+
* JSON.stringify().length * 2 (UTF-16 char width). This is a rough
|
|
10
|
+
* approximation — it doesn't account for V8 object overhead, Map
|
|
11
|
+
* metadata, or non-serializable values — but it's fast and good
|
|
12
|
+
* enough for cache budget enforcement.
|
|
13
|
+
*
|
|
14
|
+
* Values that fail JSON serialization (circular references, BigInt,
|
|
15
|
+
* etc.) return 0, allowing the entry to be cached without counting
|
|
16
|
+
* toward the byte budget. This is a conservative choice: it's better
|
|
17
|
+
* to cache and undercount than to reject the entry.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Estimate the byte size of a value.
|
|
21
|
+
*
|
|
22
|
+
* Uses `JSON.stringify(value).length * 2` to approximate UTF-16
|
|
23
|
+
* in-memory size. Returns 0 if the value is not serializable.
|
|
24
|
+
*/
|
|
25
|
+
function estimateByteSize(value) {
|
|
26
|
+
try {
|
|
27
|
+
const json = JSON.stringify(value);
|
|
28
|
+
if (json === void 0) return 0;
|
|
29
|
+
return json.length * 2;
|
|
30
|
+
} catch {
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
4
35
|
//#region src/cache/redis-handler.ts
|
|
5
36
|
var KEY_PREFIX = "timber:cache:";
|
|
6
37
|
var TAG_PREFIX = "timber:tag:";
|
|
@@ -83,32 +114,99 @@ function stableStringify(value) {
|
|
|
83
114
|
}
|
|
84
115
|
//#endregion
|
|
85
116
|
//#region src/cache/singleflight.ts
|
|
86
|
-
|
|
117
|
+
/**
|
|
118
|
+
* Error thrown when a singleflight call exceeds `timeoutMs`.
|
|
119
|
+
* Exported so callers can distinguish timeout from other errors.
|
|
120
|
+
*/
|
|
121
|
+
var SingleflightTimeoutError = class extends Error {
|
|
122
|
+
constructor(key, timeoutMs) {
|
|
123
|
+
super(`Singleflight timeout: key "${key}" exceeded ${timeoutMs}ms`);
|
|
124
|
+
this.name = "SingleflightTimeoutError";
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
function createSingleflight(opts) {
|
|
87
128
|
const inflight = /* @__PURE__ */ new Map();
|
|
129
|
+
const timeoutMs = opts?.timeoutMs;
|
|
88
130
|
return { do(key, fn) {
|
|
89
131
|
const existing = inflight.get(key);
|
|
90
132
|
if (existing) return existing;
|
|
91
|
-
|
|
133
|
+
let promise;
|
|
134
|
+
if (timeoutMs != null && timeoutMs > 0) promise = new Promise((resolve, reject) => {
|
|
135
|
+
const timer = setTimeout(() => reject(new SingleflightTimeoutError(key, timeoutMs)), timeoutMs);
|
|
136
|
+
try {
|
|
137
|
+
fn().then((value) => {
|
|
138
|
+
clearTimeout(timer);
|
|
139
|
+
resolve(value);
|
|
140
|
+
}, (err) => {
|
|
141
|
+
clearTimeout(timer);
|
|
142
|
+
reject(err);
|
|
143
|
+
});
|
|
144
|
+
} catch (err) {
|
|
145
|
+
clearTimeout(timer);
|
|
146
|
+
reject(err);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
else promise = fn();
|
|
150
|
+
const tracked = promise.finally(() => {
|
|
92
151
|
inflight.delete(key);
|
|
93
152
|
});
|
|
94
|
-
inflight.set(key,
|
|
95
|
-
return
|
|
153
|
+
inflight.set(key, tracked);
|
|
154
|
+
return tracked;
|
|
96
155
|
} };
|
|
97
156
|
}
|
|
98
157
|
//#endregion
|
|
158
|
+
//#region src/cache/fast-hash.ts
|
|
159
|
+
/**
|
|
160
|
+
* Fast non-cryptographic hash for cache keys.
|
|
161
|
+
*
|
|
162
|
+
* FNV-1a 64-bit produces a well-distributed hash with a collision
|
|
163
|
+
* probability of ~1 in 5 billion at 77k keys (birthday paradox).
|
|
164
|
+
* Not suitable for security, but ideal for cache key generation
|
|
165
|
+
* where we need speed over crypto strength.
|
|
166
|
+
*
|
|
167
|
+
* Uses BigInt for 64-bit arithmetic — supported in all modern runtimes
|
|
168
|
+
* including Cloudflare Workers. No node:crypto dependency.
|
|
169
|
+
*
|
|
170
|
+
* See TIM-370.
|
|
171
|
+
*/
|
|
172
|
+
var FNV_OFFSET_BASIS = 14695981039346656037n;
|
|
173
|
+
var FNV_PRIME = 1099511628211n;
|
|
174
|
+
var MASK_64 = 18446744073709551615n;
|
|
175
|
+
/**
|
|
176
|
+
* Compute a 64-bit FNV-1a hash of a string, returned as a 16-char hex string.
|
|
177
|
+
*
|
|
178
|
+
* 64 bits gives ~5 billion keys before a 50% collision probability
|
|
179
|
+
* (birthday paradox), making accidental collisions effectively impossible
|
|
180
|
+
* for cache key use cases.
|
|
181
|
+
*/
|
|
182
|
+
function fnv1aHash(input) {
|
|
183
|
+
let hash = FNV_OFFSET_BASIS;
|
|
184
|
+
for (let i = 0; i < input.length; i++) {
|
|
185
|
+
hash ^= BigInt(input.charCodeAt(i));
|
|
186
|
+
hash = hash * FNV_PRIME & MASK_64;
|
|
187
|
+
}
|
|
188
|
+
return hash.toString(16).padStart(16, "0");
|
|
189
|
+
}
|
|
190
|
+
//#endregion
|
|
99
191
|
//#region src/cache/timber-cache.ts
|
|
100
|
-
var
|
|
192
|
+
var defaultSingleflight = createSingleflight();
|
|
101
193
|
/**
|
|
102
|
-
* Generate a
|
|
194
|
+
* Generate a cache key from function identity and serialized args.
|
|
195
|
+
*
|
|
196
|
+
* Uses FNV-1a (fast non-crypto hash) instead of SHA-256. Cache keys don't
|
|
197
|
+
* need collision resistance — they need speed. The fnId prefix provides
|
|
198
|
+
* namespace isolation; the hash covers the args.
|
|
199
|
+
*
|
|
200
|
+
* See TIM-370 for perf motivation.
|
|
103
201
|
*/
|
|
104
202
|
function defaultKeyGenerator(fnId, args) {
|
|
105
203
|
const raw = fnId + ":" + stableStringify(args);
|
|
106
|
-
return
|
|
204
|
+
return fnId + ":" + fnv1aHash(raw);
|
|
107
205
|
}
|
|
108
206
|
/**
|
|
109
207
|
* Resolve tags from the options — supports static array or function form.
|
|
110
208
|
*/
|
|
111
|
-
function resolveTags
|
|
209
|
+
function resolveTags(opts, args) {
|
|
112
210
|
if (!opts.tags) return [];
|
|
113
211
|
if (Array.isArray(opts.tags)) return opts.tags;
|
|
114
212
|
return opts.tags(...args);
|
|
@@ -128,47 +226,53 @@ var fnIdCounter = 0;
|
|
|
128
226
|
*/
|
|
129
227
|
function createCache(fn, opts, handler) {
|
|
130
228
|
const fnId = `timber-cache:${fnIdCounter++}`;
|
|
131
|
-
|
|
229
|
+
const sf = opts.timeoutMs ? createSingleflight({ timeoutMs: opts.timeoutMs }) : defaultSingleflight;
|
|
230
|
+
return (async (...args) => {
|
|
132
231
|
const key = opts.key ? opts.key(...args) : defaultKeyGenerator(fnId, args);
|
|
133
232
|
const cacheStart = performance.now();
|
|
134
233
|
const cached = await handler.get(key);
|
|
135
234
|
if (cached && !cached.stale) {
|
|
136
|
-
|
|
235
|
+
addSpanEventSync("timber.cache.hit", {
|
|
137
236
|
key,
|
|
138
237
|
duration_ms: Math.round(performance.now() - cacheStart)
|
|
139
238
|
});
|
|
140
239
|
return cached.value;
|
|
141
240
|
}
|
|
142
241
|
if (cached && cached.stale && opts.staleWhileRevalidate) {
|
|
143
|
-
|
|
242
|
+
addSpanEventSync("timber.cache.hit", {
|
|
144
243
|
key,
|
|
145
244
|
duration_ms: Math.round(performance.now() - cacheStart),
|
|
146
245
|
stale: true
|
|
147
246
|
});
|
|
148
|
-
|
|
247
|
+
sf.do(`swr:${key}`, async () => {
|
|
149
248
|
try {
|
|
150
249
|
const fresh = await fn(...args);
|
|
151
|
-
const tags = resolveTags
|
|
250
|
+
const tags = resolveTags(opts, args);
|
|
152
251
|
await handler.set(key, fresh, {
|
|
153
252
|
ttl: opts.ttl,
|
|
154
253
|
tags
|
|
155
254
|
});
|
|
156
|
-
} catch {
|
|
255
|
+
} catch (err) {
|
|
256
|
+
logSwrRefetchFailed({
|
|
257
|
+
cacheKey: key,
|
|
258
|
+
error: err
|
|
259
|
+
});
|
|
260
|
+
}
|
|
157
261
|
}).catch(() => {});
|
|
158
262
|
return cached.value;
|
|
159
263
|
}
|
|
160
|
-
const result = await
|
|
161
|
-
const tags = resolveTags
|
|
264
|
+
const result = await sf.do(key, () => fn(...args));
|
|
265
|
+
const tags = resolveTags(opts, args);
|
|
162
266
|
await handler.set(key, result, {
|
|
163
267
|
ttl: opts.ttl,
|
|
164
268
|
tags
|
|
165
269
|
});
|
|
166
|
-
|
|
270
|
+
addSpanEventSync("timber.cache.miss", {
|
|
167
271
|
key,
|
|
168
272
|
duration_ms: Math.round(performance.now() - cacheStart)
|
|
169
273
|
});
|
|
170
274
|
return result;
|
|
171
|
-
};
|
|
275
|
+
});
|
|
172
276
|
}
|
|
173
277
|
/**
|
|
174
278
|
* Invalidate cache entries by tag or key.
|
|
@@ -177,71 +281,48 @@ createCache.invalidate = async function invalidate(handler, opts) {
|
|
|
177
281
|
await handler.invalidate(opts);
|
|
178
282
|
};
|
|
179
283
|
//#endregion
|
|
180
|
-
//#region src/cache/
|
|
181
|
-
var singleflight = createSingleflight();
|
|
182
|
-
var REQUEST_SPECIFIC_PROPS = new Set([
|
|
183
|
-
"cookies",
|
|
184
|
-
"cookie",
|
|
185
|
-
"session",
|
|
186
|
-
"sessionId",
|
|
187
|
-
"token",
|
|
188
|
-
"authorization",
|
|
189
|
-
"auth",
|
|
190
|
-
"headers"
|
|
191
|
-
]);
|
|
192
|
-
/**
|
|
193
|
-
* Generate a SHA-256 cache key from a stable function ID and serialized args.
|
|
194
|
-
*/
|
|
195
|
-
function generateKey(id, args) {
|
|
196
|
-
const raw = id + ":" + stableStringify(args);
|
|
197
|
-
return createHash("sha256").update(raw).digest("hex");
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Resolve tags from options — supports static array or function form.
|
|
201
|
-
*/
|
|
202
|
-
function resolveTags(opts, args) {
|
|
203
|
-
if (!opts.tags) return [];
|
|
204
|
-
if (Array.isArray(opts.tags)) return opts.tags;
|
|
205
|
-
return opts.tags(...args);
|
|
206
|
-
}
|
|
284
|
+
//#region src/cache/cache-api.ts
|
|
207
285
|
/**
|
|
208
|
-
*
|
|
209
|
-
*
|
|
286
|
+
* Public caching API: `cache(fn, opts)`.
|
|
287
|
+
*
|
|
288
|
+
* Wraps an async function with cross-request caching. Uses the configured
|
|
289
|
+
* cache handler (defaults to MemoryCacheHandler, overridable via timber.config.ts).
|
|
290
|
+
*
|
|
291
|
+
* ```ts
|
|
292
|
+
* import { cache } from '@timber-js/app/cache';
|
|
293
|
+
*
|
|
294
|
+
* const getUser = cache(
|
|
295
|
+
* async (id: string) => db.users.findUnique({ where: { id } }),
|
|
296
|
+
* { ttl: 60, tags: (id) => [`user:${id}`] }
|
|
297
|
+
* );
|
|
298
|
+
* ```
|
|
210
299
|
*/
|
|
211
|
-
function
|
|
212
|
-
|
|
213
|
-
const suspicious = Object.keys(props).filter((k) => REQUEST_SPECIFIC_PROPS.has(k.toLowerCase()));
|
|
214
|
-
if (suspicious.length > 0) console.warn(`[timber] "use cache" component ${id} received request-specific props: ${suspicious.join(", ")}. This may serve one user's cached render to another user. Remove request-specific data from props or remove "use cache".`);
|
|
300
|
+
function cache(fn, opts) {
|
|
301
|
+
return createCache(fn, opts, getCacheHandler());
|
|
215
302
|
}
|
|
216
303
|
/**
|
|
217
|
-
*
|
|
218
|
-
* with caching using the same cache handler as timber.cache.
|
|
304
|
+
* Invalidate cache entries by tag or key.
|
|
219
305
|
*
|
|
220
|
-
*
|
|
221
|
-
*
|
|
306
|
+
* ```ts
|
|
307
|
+
* cache.invalidate({ tag: 'products' });
|
|
308
|
+
* cache.invalidate({ key: 'user:abc' });
|
|
309
|
+
* ```
|
|
222
310
|
*/
|
|
223
|
-
function
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
const key = generateKey(opts.id, args);
|
|
227
|
-
const cached = await handler.get(key);
|
|
228
|
-
if (cached && !cached.stale) return cached.value;
|
|
229
|
-
const result = await singleflight.do(key, () => fn(...args));
|
|
230
|
-
const tags = resolveTags(opts, args);
|
|
231
|
-
await handler.set(key, result, {
|
|
232
|
-
ttl: opts.ttl,
|
|
233
|
-
tags
|
|
234
|
-
});
|
|
235
|
-
return result;
|
|
236
|
-
};
|
|
237
|
-
}
|
|
311
|
+
cache.invalidate = async function invalidate(opts) {
|
|
312
|
+
await getCacheHandler().invalidate(opts);
|
|
313
|
+
};
|
|
238
314
|
//#endregion
|
|
239
315
|
//#region src/cache/index.ts
|
|
240
316
|
var MemoryCacheHandler = class {
|
|
241
317
|
store = /* @__PURE__ */ new Map();
|
|
242
|
-
|
|
318
|
+
maxEntries;
|
|
319
|
+
maxBytes;
|
|
320
|
+
maxEntryBytes;
|
|
321
|
+
currentBytes = 0;
|
|
243
322
|
constructor(opts) {
|
|
244
|
-
this.
|
|
323
|
+
this.maxEntries = opts?.maxEntries ?? opts?.maxSize ?? 1e3;
|
|
324
|
+
this.maxBytes = opts?.maxBytes;
|
|
325
|
+
this.maxEntryBytes = opts?.maxEntryBytes;
|
|
245
326
|
}
|
|
246
327
|
async get(key) {
|
|
247
328
|
const entry = this.store.get(key);
|
|
@@ -255,30 +336,60 @@ var MemoryCacheHandler = class {
|
|
|
255
336
|
};
|
|
256
337
|
}
|
|
257
338
|
async set(key, value, opts) {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
339
|
+
const byteSize = estimateByteSize(value);
|
|
340
|
+
if (this.maxEntryBytes !== void 0 && byteSize > this.maxEntryBytes) return;
|
|
341
|
+
if (this.store.has(key)) {
|
|
342
|
+
const existing = this.store.get(key);
|
|
343
|
+
this.currentBytes -= existing.byteSize;
|
|
344
|
+
this.store.delete(key);
|
|
345
|
+
}
|
|
346
|
+
while (this.store.size >= this.maxEntries) this.evictOldest();
|
|
347
|
+
if (this.maxBytes !== void 0) {
|
|
348
|
+
while (this.currentBytes + byteSize > this.maxBytes && this.store.size > 0) this.evictOldest();
|
|
349
|
+
if (this.currentBytes + byteSize > this.maxBytes) return;
|
|
263
350
|
}
|
|
264
351
|
this.store.set(key, {
|
|
265
352
|
value,
|
|
266
353
|
expiresAt: Date.now() + opts.ttl * 1e3,
|
|
267
|
-
tags: opts.tags
|
|
354
|
+
tags: opts.tags,
|
|
355
|
+
byteSize
|
|
268
356
|
});
|
|
357
|
+
this.currentBytes += byteSize;
|
|
269
358
|
}
|
|
270
359
|
async invalidate(opts) {
|
|
271
|
-
if (opts.key)
|
|
360
|
+
if (opts.key) {
|
|
361
|
+
const entry = this.store.get(opts.key);
|
|
362
|
+
if (entry) {
|
|
363
|
+
this.currentBytes -= entry.byteSize;
|
|
364
|
+
this.store.delete(opts.key);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
272
367
|
if (opts.tag) {
|
|
273
|
-
for (const [key, entry] of this.store) if (entry.tags.includes(opts.tag))
|
|
368
|
+
for (const [key, entry] of this.store) if (entry.tags.includes(opts.tag)) {
|
|
369
|
+
this.currentBytes -= entry.byteSize;
|
|
370
|
+
this.store.delete(key);
|
|
371
|
+
}
|
|
274
372
|
}
|
|
275
373
|
}
|
|
276
374
|
/** Number of entries currently in the cache. */
|
|
277
375
|
get size() {
|
|
278
376
|
return this.store.size;
|
|
279
377
|
}
|
|
378
|
+
/** Estimated total byte size of all cached values. */
|
|
379
|
+
get bytes() {
|
|
380
|
+
return this.currentBytes;
|
|
381
|
+
}
|
|
382
|
+
/** Evict the oldest entry (front of Map). */
|
|
383
|
+
evictOldest() {
|
|
384
|
+
const oldest = this.store.keys().next().value;
|
|
385
|
+
if (oldest !== void 0) {
|
|
386
|
+
const entry = this.store.get(oldest);
|
|
387
|
+
this.currentBytes -= entry.byteSize;
|
|
388
|
+
this.store.delete(oldest);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
280
391
|
};
|
|
281
392
|
//#endregion
|
|
282
|
-
export { MemoryCacheHandler, RedisCacheHandler,
|
|
393
|
+
export { MemoryCacheHandler, RedisCacheHandler, cache, estimateByteSize, getCacheHandler, setCacheHandler };
|
|
283
394
|
|
|
284
395
|
//# sourceMappingURL=index.js.map
|