@gravito/core 2.0.0 → 2.0.1

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.
@@ -1,168 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/platform/node/globalThis.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/platform/node/index.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/platform/index.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/version.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/internal/semver.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/internal/global-utils.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag/ComponentLogger.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag/types.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag/internal/logLevelLogger.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/diag.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/internal/baggage-impl.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/internal/symbol.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/utils.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context/context.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag/consoleLogger.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/NoopMeter.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/Metric.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/propagation/TextMapPropagator.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context/NoopContextManager.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/context.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/trace_flags.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/invalid-span-constants.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/NonRecordingSpan.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/context-utils.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/spancontext-utils.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/NoopTracer.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/ProxyTracer.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/NoopTracerProvider.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/ProxyTracerProvider.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/SamplingResult.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/span_kind.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/status.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/internal/tracestate-validators.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/internal/tracestate-impl.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/internal/utils.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context-api.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag-api.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/NoopMeterProvider.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/metrics.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics-api.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/propagation/NoopTextMapPropagator.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/context-helpers.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/propagation.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/propagation-api.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/trace.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace-api.js", "../../../node_modules/.bun/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/index.js", "../src/ffi/types.ts", "../src/ffi/cbor-fallback.ts", "../src/ffi/hash-fallback.ts", "../src/ffi/NativeAccelerator.ts", "../src/ffi/NativeHasher.ts", "../src/adapters/bun/RadixNode.ts", "../src/adapters/bun/RadixRouter.ts", "../src/engine/AOTRouter.ts", "../src/transpiler-utils.ts", "../src/engine/analyzer.ts", "../src/engine/constants.ts", "../src/Container/RequestScopeMetrics.ts", "../src/Container/RequestScopeManager.ts", "../src/engine/FastContext.ts", "../src/engine/MinimalContext.ts", "../src/engine/path.ts", "../src/engine/pool.ts", "../src/engine/Gravito.ts", "../src/adapters/GravitoEngineAdapter.ts", "../src/adapters/types.ts", "../src/Application.ts", "../src/runtime/adapter-bun.ts", "../src/runtime/detection.ts", "../src/runtime/adapter-deno.ts", "../src/runtime/adapter-node.ts", "../src/runtime/adapter-unknown.ts", "../src/runtime/archive.ts", "../src/runtime/compression.ts", "../src/runtime/markdown.ts", "../src/runtime/deep-equals.ts", "../src/runtime/escape.ts", "../src/runtime/index.ts", "../src/ConfigManager.ts", "../src/compat/async-local-storage.ts", "../src/exceptions/CircularDependencyException.ts", "../src/Container.ts", "../src/Logger.ts", "../src/error-handling/RequestScopeErrorContext.ts", "../src/exceptions/GravitoException.ts", "../src/exceptions/HttpException.ts", "../src/exceptions/ValidationException.ts", "../src/helpers/response.ts", "../src/ErrorHandler.ts", "../src/types/events.ts", "../src/EventManager.ts", "../src/events/DeadLetterQueue.ts", "../src/events/BackpressureManager.ts", "../src/events/PriorityEscalationManager.ts", "../src/events/queue-core.ts", "../src/events/CircuitBreaker.ts", "../src/events/task-executor.ts", "../src/events/EventPriorityQueue.ts", "../src/events/aggregation/types.ts", "../src/events/aggregation/AggregationWindow.ts", "../src/events/aggregation/DeduplicationManager.ts", "../src/events/aggregation/EventBatcher.ts", "../src/events/aggregation/EventAggregationManager.ts", "../src/events/EventOptions.ts", "../src/events/IdempotencyCache.ts", "../src/hooks/ActionManager.ts", "../src/hooks/AsyncDetector.ts", "../src/hooks/dlq-operations.ts", "../src/hooks/FilterManager.ts", "../src/hooks/MigrationWarner.ts", "../src/compat/crypto.ts", "../src/reliability/RetryPolicy.ts", "../src/reliability/DeadLetterQueueManager.ts", "../src/HookManager.ts", "../src/events/observability/EventMetrics.ts", "../src/events/observability/EventTracer.ts", "../src/events/observability/EventTracing.ts", "../src/events/observability/ObservableHookManager.ts", "../src/events/observability/OTelEventMetrics.ts", "../src/GlobalErrorHandlers.ts", "../src/observability/contracts.ts", "../src/adapters/bun/BunRequest.ts", "../src/adapters/bun/BunContext.ts", "../src/adapters/bun/BunWebSocketHandler.ts", "../src/adapters/bun/BunNativeAdapter.ts", "../src/helpers/data.ts", "../src/helpers/Arr.ts", "../src/helpers/errors.ts", "../src/helpers/Str.ts", "../src/helpers.ts", "../src/http/CookieJar.ts", "../src/exceptions/ModelNotFoundException.ts", "../src/Route.ts", "../src/router/ControllerDispatcher.ts", "../src/router/RequestValidator.ts", "../src/Router.ts", "../src/security/Encrypter.ts", "../src/security/Hasher.ts", "../src/PlanetCore.ts", "../src/CommandKernel.ts", "../src/cli/queue-commands.ts", "../src/events/FlowControlStrategy.ts", "../src/events/RetryScheduler.ts", "../src/events/WorkerPoolMetrics.ts", "../src/events/WorkerPool.ts", "../src/observability/QueueDashboard.ts", "../src/exceptions/AuthenticationException.ts", "../src/exceptions/AuthorizationException.ts", "../src/ServiceProvider.ts", "../src/GravitoServer.ts", "../src/health/HealthProvider.ts", "../src/http/cookie.ts", "../src/RequestContext.ts", "../src/testing/TestResponse.ts", "../src/testing/HttpTester.ts", "../src/runtime-helpers.ts", "../src/binary/BinaryUtils.ts", "../src/index.ts"],
4
- "sourcesContent": [
5
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports._globalThis = void 0;\n/** only globals that common to node and browsers are allowed */\n// eslint-disable-next-line node/no-unsupported-features/es-builtins\nexports._globalThis = typeof globalThis === 'object' ? globalThis : global;\n//# sourceMappingURL=globalThis.js.map",
6
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./globalThis\"), exports);\n//# sourceMappingURL=index.js.map",
7
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./node\"), exports);\n//# sourceMappingURL=index.js.map",
8
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VERSION = void 0;\n// this is autogenerated file, see scripts/version-update.js\nexports.VERSION = '1.9.0';\n//# sourceMappingURL=version.js.map",
9
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isCompatible = exports._makeCompatibilityCheck = void 0;\nconst version_1 = require(\"../version\");\nconst re = /^(\\d+)\\.(\\d+)\\.(\\d+)(-(.+))?$/;\n/**\n * Create a function to test an API version to see if it is compatible with the provided ownVersion.\n *\n * The returned function has the following semantics:\n * - Exact match is always compatible\n * - Major versions must match exactly\n * - 1.x package cannot use global 2.x package\n * - 2.x package cannot use global 1.x package\n * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API\n * - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects\n * - 1.4 package may NOT use 1.3 global because it may try to call functions which don't exist on 1.3\n * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor\n * - Patch and build tag differences are not considered at this time\n *\n * @param ownVersion version which should be checked against\n */\nfunction _makeCompatibilityCheck(ownVersion) {\n const acceptedVersions = new Set([ownVersion]);\n const rejectedVersions = new Set();\n const myVersionMatch = ownVersion.match(re);\n if (!myVersionMatch) {\n // we cannot guarantee compatibility so we always return noop\n return () => false;\n }\n const ownVersionParsed = {\n major: +myVersionMatch[1],\n minor: +myVersionMatch[2],\n patch: +myVersionMatch[3],\n prerelease: myVersionMatch[4],\n };\n // if ownVersion has a prerelease tag, versions must match exactly\n if (ownVersionParsed.prerelease != null) {\n return function isExactmatch(globalVersion) {\n return globalVersion === ownVersion;\n };\n }\n function _reject(v) {\n rejectedVersions.add(v);\n return false;\n }\n function _accept(v) {\n acceptedVersions.add(v);\n return true;\n }\n return function isCompatible(globalVersion) {\n if (acceptedVersions.has(globalVersion)) {\n return true;\n }\n if (rejectedVersions.has(globalVersion)) {\n return false;\n }\n const globalVersionMatch = globalVersion.match(re);\n if (!globalVersionMatch) {\n // cannot parse other version\n // we cannot guarantee compatibility so we always noop\n return _reject(globalVersion);\n }\n const globalVersionParsed = {\n major: +globalVersionMatch[1],\n minor: +globalVersionMatch[2],\n patch: +globalVersionMatch[3],\n prerelease: globalVersionMatch[4],\n };\n // if globalVersion has a prerelease tag, versions must match exactly\n if (globalVersionParsed.prerelease != null) {\n return _reject(globalVersion);\n }\n // major versions must match\n if (ownVersionParsed.major !== globalVersionParsed.major) {\n return _reject(globalVersion);\n }\n if (ownVersionParsed.major === 0) {\n if (ownVersionParsed.minor === globalVersionParsed.minor &&\n ownVersionParsed.patch <= globalVersionParsed.patch) {\n return _accept(globalVersion);\n }\n return _reject(globalVersion);\n }\n if (ownVersionParsed.minor <= globalVersionParsed.minor) {\n return _accept(globalVersion);\n }\n return _reject(globalVersion);\n };\n}\nexports._makeCompatibilityCheck = _makeCompatibilityCheck;\n/**\n * Test an API version to see if it is compatible with this API.\n *\n * - Exact match is always compatible\n * - Major versions must match exactly\n * - 1.x package cannot use global 2.x package\n * - 2.x package cannot use global 1.x package\n * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API\n * - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects\n * - 1.4 package may NOT use 1.3 global because it may try to call functions which don't exist on 1.3\n * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor\n * - Patch and build tag differences are not considered at this time\n *\n * @param version version of the API requesting an instance of the global API\n */\nexports.isCompatible = _makeCompatibilityCheck(version_1.VERSION);\n//# sourceMappingURL=semver.js.map",
10
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.unregisterGlobal = exports.getGlobal = exports.registerGlobal = void 0;\nconst platform_1 = require(\"../platform\");\nconst version_1 = require(\"../version\");\nconst semver_1 = require(\"./semver\");\nconst major = version_1.VERSION.split('.')[0];\nconst GLOBAL_OPENTELEMETRY_API_KEY = Symbol.for(`opentelemetry.js.api.${major}`);\nconst _global = platform_1._globalThis;\nfunction registerGlobal(type, instance, diag, allowOverride = false) {\n var _a;\n const api = (_global[GLOBAL_OPENTELEMETRY_API_KEY] = (_a = _global[GLOBAL_OPENTELEMETRY_API_KEY]) !== null && _a !== void 0 ? _a : {\n version: version_1.VERSION,\n });\n if (!allowOverride && api[type]) {\n // already registered an API of this type\n const err = new Error(`@opentelemetry/api: Attempted duplicate registration of API: ${type}`);\n diag.error(err.stack || err.message);\n return false;\n }\n if (api.version !== version_1.VERSION) {\n // All registered APIs must be of the same version exactly\n const err = new Error(`@opentelemetry/api: Registration of version v${api.version} for ${type} does not match previously registered API v${version_1.VERSION}`);\n diag.error(err.stack || err.message);\n return false;\n }\n api[type] = instance;\n diag.debug(`@opentelemetry/api: Registered a global for ${type} v${version_1.VERSION}.`);\n return true;\n}\nexports.registerGlobal = registerGlobal;\nfunction getGlobal(type) {\n var _a, _b;\n const globalVersion = (_a = _global[GLOBAL_OPENTELEMETRY_API_KEY]) === null || _a === void 0 ? void 0 : _a.version;\n if (!globalVersion || !(0, semver_1.isCompatible)(globalVersion)) {\n return;\n }\n return (_b = _global[GLOBAL_OPENTELEMETRY_API_KEY]) === null || _b === void 0 ? void 0 : _b[type];\n}\nexports.getGlobal = getGlobal;\nfunction unregisterGlobal(type, diag) {\n diag.debug(`@opentelemetry/api: Unregistering a global for ${type} v${version_1.VERSION}.`);\n const api = _global[GLOBAL_OPENTELEMETRY_API_KEY];\n if (api) {\n delete api[type];\n }\n}\nexports.unregisterGlobal = unregisterGlobal;\n//# sourceMappingURL=global-utils.js.map",
11
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DiagComponentLogger = void 0;\nconst global_utils_1 = require(\"../internal/global-utils\");\n/**\n * Component Logger which is meant to be used as part of any component which\n * will add automatically additional namespace in front of the log message.\n * It will then forward all message to global diag logger\n * @example\n * const cLogger = diag.createComponentLogger({ namespace: '@opentelemetry/instrumentation-http' });\n * cLogger.debug('test');\n * // @opentelemetry/instrumentation-http test\n */\nclass DiagComponentLogger {\n constructor(props) {\n this._namespace = props.namespace || 'DiagComponentLogger';\n }\n debug(...args) {\n return logProxy('debug', this._namespace, args);\n }\n error(...args) {\n return logProxy('error', this._namespace, args);\n }\n info(...args) {\n return logProxy('info', this._namespace, args);\n }\n warn(...args) {\n return logProxy('warn', this._namespace, args);\n }\n verbose(...args) {\n return logProxy('verbose', this._namespace, args);\n }\n}\nexports.DiagComponentLogger = DiagComponentLogger;\nfunction logProxy(funcName, namespace, args) {\n const logger = (0, global_utils_1.getGlobal)('diag');\n // shortcut if logger not set\n if (!logger) {\n return;\n }\n args.unshift(namespace);\n return logger[funcName](...args);\n}\n//# sourceMappingURL=ComponentLogger.js.map",
12
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DiagLogLevel = void 0;\n/**\n * Defines the available internal logging levels for the diagnostic logger, the numeric values\n * of the levels are defined to match the original values from the initial LogLevel to avoid\n * compatibility/migration issues for any implementation that assume the numeric ordering.\n */\nvar DiagLogLevel;\n(function (DiagLogLevel) {\n /** Diagnostic Logging level setting to disable all logging (except and forced logs) */\n DiagLogLevel[DiagLogLevel[\"NONE\"] = 0] = \"NONE\";\n /** Identifies an error scenario */\n DiagLogLevel[DiagLogLevel[\"ERROR\"] = 30] = \"ERROR\";\n /** Identifies a warning scenario */\n DiagLogLevel[DiagLogLevel[\"WARN\"] = 50] = \"WARN\";\n /** General informational log message */\n DiagLogLevel[DiagLogLevel[\"INFO\"] = 60] = \"INFO\";\n /** General debug log message */\n DiagLogLevel[DiagLogLevel[\"DEBUG\"] = 70] = \"DEBUG\";\n /**\n * Detailed trace level logging should only be used for development, should only be set\n * in a development environment.\n */\n DiagLogLevel[DiagLogLevel[\"VERBOSE\"] = 80] = \"VERBOSE\";\n /** Used to set the logging level to include all logging */\n DiagLogLevel[DiagLogLevel[\"ALL\"] = 9999] = \"ALL\";\n})(DiagLogLevel = exports.DiagLogLevel || (exports.DiagLogLevel = {}));\n//# sourceMappingURL=types.js.map",
13
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createLogLevelDiagLogger = void 0;\nconst types_1 = require(\"../types\");\nfunction createLogLevelDiagLogger(maxLevel, logger) {\n if (maxLevel < types_1.DiagLogLevel.NONE) {\n maxLevel = types_1.DiagLogLevel.NONE;\n }\n else if (maxLevel > types_1.DiagLogLevel.ALL) {\n maxLevel = types_1.DiagLogLevel.ALL;\n }\n // In case the logger is null or undefined\n logger = logger || {};\n function _filterFunc(funcName, theLevel) {\n const theFunc = logger[funcName];\n if (typeof theFunc === 'function' && maxLevel >= theLevel) {\n return theFunc.bind(logger);\n }\n return function () { };\n }\n return {\n error: _filterFunc('error', types_1.DiagLogLevel.ERROR),\n warn: _filterFunc('warn', types_1.DiagLogLevel.WARN),\n info: _filterFunc('info', types_1.DiagLogLevel.INFO),\n debug: _filterFunc('debug', types_1.DiagLogLevel.DEBUG),\n verbose: _filterFunc('verbose', types_1.DiagLogLevel.VERBOSE),\n };\n}\nexports.createLogLevelDiagLogger = createLogLevelDiagLogger;\n//# sourceMappingURL=logLevelLogger.js.map",
14
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DiagAPI = void 0;\nconst ComponentLogger_1 = require(\"../diag/ComponentLogger\");\nconst logLevelLogger_1 = require(\"../diag/internal/logLevelLogger\");\nconst types_1 = require(\"../diag/types\");\nconst global_utils_1 = require(\"../internal/global-utils\");\nconst API_NAME = 'diag';\n/**\n * Singleton object which represents the entry point to the OpenTelemetry internal\n * diagnostic API\n */\nclass DiagAPI {\n /**\n * Private internal constructor\n * @private\n */\n constructor() {\n function _logProxy(funcName) {\n return function (...args) {\n const logger = (0, global_utils_1.getGlobal)('diag');\n // shortcut if logger not set\n if (!logger)\n return;\n return logger[funcName](...args);\n };\n }\n // Using self local variable for minification purposes as 'this' cannot be minified\n const self = this;\n // DiagAPI specific functions\n const setLogger = (logger, optionsOrLogLevel = { logLevel: types_1.DiagLogLevel.INFO }) => {\n var _a, _b, _c;\n if (logger === self) {\n // There isn't much we can do here.\n // Logging to the console might break the user application.\n // Try to log to self. If a logger was previously registered it will receive the log.\n const err = new Error('Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation');\n self.error((_a = err.stack) !== null && _a !== void 0 ? _a : err.message);\n return false;\n }\n if (typeof optionsOrLogLevel === 'number') {\n optionsOrLogLevel = {\n logLevel: optionsOrLogLevel,\n };\n }\n const oldLogger = (0, global_utils_1.getGlobal)('diag');\n const newLogger = (0, logLevelLogger_1.createLogLevelDiagLogger)((_b = optionsOrLogLevel.logLevel) !== null && _b !== void 0 ? _b : types_1.DiagLogLevel.INFO, logger);\n // There already is an logger registered. We'll let it know before overwriting it.\n if (oldLogger && !optionsOrLogLevel.suppressOverrideMessage) {\n const stack = (_c = new Error().stack) !== null && _c !== void 0 ? _c : '<failed to generate stacktrace>';\n oldLogger.warn(`Current logger will be overwritten from ${stack}`);\n newLogger.warn(`Current logger will overwrite one already registered from ${stack}`);\n }\n return (0, global_utils_1.registerGlobal)('diag', newLogger, self, true);\n };\n self.setLogger = setLogger;\n self.disable = () => {\n (0, global_utils_1.unregisterGlobal)(API_NAME, self);\n };\n self.createComponentLogger = (options) => {\n return new ComponentLogger_1.DiagComponentLogger(options);\n };\n self.verbose = _logProxy('verbose');\n self.debug = _logProxy('debug');\n self.info = _logProxy('info');\n self.warn = _logProxy('warn');\n self.error = _logProxy('error');\n }\n /** Get the singleton instance of the DiagAPI API */\n static instance() {\n if (!this._instance) {\n this._instance = new DiagAPI();\n }\n return this._instance;\n }\n}\nexports.DiagAPI = DiagAPI;\n//# sourceMappingURL=diag.js.map",
15
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BaggageImpl = void 0;\nclass BaggageImpl {\n constructor(entries) {\n this._entries = entries ? new Map(entries) : new Map();\n }\n getEntry(key) {\n const entry = this._entries.get(key);\n if (!entry) {\n return undefined;\n }\n return Object.assign({}, entry);\n }\n getAllEntries() {\n return Array.from(this._entries.entries()).map(([k, v]) => [k, v]);\n }\n setEntry(key, entry) {\n const newBaggage = new BaggageImpl(this._entries);\n newBaggage._entries.set(key, entry);\n return newBaggage;\n }\n removeEntry(key) {\n const newBaggage = new BaggageImpl(this._entries);\n newBaggage._entries.delete(key);\n return newBaggage;\n }\n removeEntries(...keys) {\n const newBaggage = new BaggageImpl(this._entries);\n for (const key of keys) {\n newBaggage._entries.delete(key);\n }\n return newBaggage;\n }\n clear() {\n return new BaggageImpl();\n }\n}\nexports.BaggageImpl = BaggageImpl;\n//# sourceMappingURL=baggage-impl.js.map",
16
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.baggageEntryMetadataSymbol = void 0;\n/**\n * Symbol used to make BaggageEntryMetadata an opaque type\n */\nexports.baggageEntryMetadataSymbol = Symbol('BaggageEntryMetadata');\n//# sourceMappingURL=symbol.js.map",
17
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.baggageEntryMetadataFromString = exports.createBaggage = void 0;\nconst diag_1 = require(\"../api/diag\");\nconst baggage_impl_1 = require(\"./internal/baggage-impl\");\nconst symbol_1 = require(\"./internal/symbol\");\nconst diag = diag_1.DiagAPI.instance();\n/**\n * Create a new Baggage with optional entries\n *\n * @param entries An array of baggage entries the new baggage should contain\n */\nfunction createBaggage(entries = {}) {\n return new baggage_impl_1.BaggageImpl(new Map(Object.entries(entries)));\n}\nexports.createBaggage = createBaggage;\n/**\n * Create a serializable BaggageEntryMetadata object from a string.\n *\n * @param str string metadata. Format is currently not defined by the spec and has no special meaning.\n *\n */\nfunction baggageEntryMetadataFromString(str) {\n if (typeof str !== 'string') {\n diag.error(`Cannot create baggage metadata from unknown type: ${typeof str}`);\n str = '';\n }\n return {\n __TYPE__: symbol_1.baggageEntryMetadataSymbol,\n toString() {\n return str;\n },\n };\n}\nexports.baggageEntryMetadataFromString = baggageEntryMetadataFromString;\n//# sourceMappingURL=utils.js.map",
18
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ROOT_CONTEXT = exports.createContextKey = void 0;\n/** Get a key to uniquely identify a context value */\nfunction createContextKey(description) {\n // The specification states that for the same input, multiple calls should\n // return different keys. Due to the nature of the JS dependency management\n // system, this creates problems where multiple versions of some package\n // could hold different keys for the same property.\n //\n // Therefore, we use Symbol.for which returns the same key for the same input.\n return Symbol.for(description);\n}\nexports.createContextKey = createContextKey;\nclass BaseContext {\n /**\n * Construct a new context which inherits values from an optional parent context.\n *\n * @param parentContext a context from which to inherit values\n */\n constructor(parentContext) {\n // for minification\n const self = this;\n self._currentContext = parentContext ? new Map(parentContext) : new Map();\n self.getValue = (key) => self._currentContext.get(key);\n self.setValue = (key, value) => {\n const context = new BaseContext(self._currentContext);\n context._currentContext.set(key, value);\n return context;\n };\n self.deleteValue = (key) => {\n const context = new BaseContext(self._currentContext);\n context._currentContext.delete(key);\n return context;\n };\n }\n}\n/** The root context is used as the default parent context when there is no active context */\nexports.ROOT_CONTEXT = new BaseContext();\n//# sourceMappingURL=context.js.map",
19
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DiagConsoleLogger = void 0;\nconst consoleMap = [\n { n: 'error', c: 'error' },\n { n: 'warn', c: 'warn' },\n { n: 'info', c: 'info' },\n { n: 'debug', c: 'debug' },\n { n: 'verbose', c: 'trace' },\n];\n/**\n * A simple Immutable Console based diagnostic logger which will output any messages to the Console.\n * If you want to limit the amount of logging to a specific level or lower use the\n * {@link createLogLevelDiagLogger}\n */\nclass DiagConsoleLogger {\n constructor() {\n function _consoleFunc(funcName) {\n return function (...args) {\n if (console) {\n // Some environments only expose the console when the F12 developer console is open\n // eslint-disable-next-line no-console\n let theFunc = console[funcName];\n if (typeof theFunc !== 'function') {\n // Not all environments support all functions\n // eslint-disable-next-line no-console\n theFunc = console.log;\n }\n // One last final check\n if (typeof theFunc === 'function') {\n return theFunc.apply(console, args);\n }\n }\n };\n }\n for (let i = 0; i < consoleMap.length; i++) {\n this[consoleMap[i].n] = _consoleFunc(consoleMap[i].c);\n }\n }\n}\nexports.DiagConsoleLogger = DiagConsoleLogger;\n//# sourceMappingURL=consoleLogger.js.map",
20
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createNoopMeter = exports.NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC = exports.NOOP_OBSERVABLE_GAUGE_METRIC = exports.NOOP_OBSERVABLE_COUNTER_METRIC = exports.NOOP_UP_DOWN_COUNTER_METRIC = exports.NOOP_HISTOGRAM_METRIC = exports.NOOP_GAUGE_METRIC = exports.NOOP_COUNTER_METRIC = exports.NOOP_METER = exports.NoopObservableUpDownCounterMetric = exports.NoopObservableGaugeMetric = exports.NoopObservableCounterMetric = exports.NoopObservableMetric = exports.NoopHistogramMetric = exports.NoopGaugeMetric = exports.NoopUpDownCounterMetric = exports.NoopCounterMetric = exports.NoopMetric = exports.NoopMeter = void 0;\n/**\n * NoopMeter is a noop implementation of the {@link Meter} interface. It reuses\n * constant NoopMetrics for all of its methods.\n */\nclass NoopMeter {\n constructor() { }\n /**\n * @see {@link Meter.createGauge}\n */\n createGauge(_name, _options) {\n return exports.NOOP_GAUGE_METRIC;\n }\n /**\n * @see {@link Meter.createHistogram}\n */\n createHistogram(_name, _options) {\n return exports.NOOP_HISTOGRAM_METRIC;\n }\n /**\n * @see {@link Meter.createCounter}\n */\n createCounter(_name, _options) {\n return exports.NOOP_COUNTER_METRIC;\n }\n /**\n * @see {@link Meter.createUpDownCounter}\n */\n createUpDownCounter(_name, _options) {\n return exports.NOOP_UP_DOWN_COUNTER_METRIC;\n }\n /**\n * @see {@link Meter.createObservableGauge}\n */\n createObservableGauge(_name, _options) {\n return exports.NOOP_OBSERVABLE_GAUGE_METRIC;\n }\n /**\n * @see {@link Meter.createObservableCounter}\n */\n createObservableCounter(_name, _options) {\n return exports.NOOP_OBSERVABLE_COUNTER_METRIC;\n }\n /**\n * @see {@link Meter.createObservableUpDownCounter}\n */\n createObservableUpDownCounter(_name, _options) {\n return exports.NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC;\n }\n /**\n * @see {@link Meter.addBatchObservableCallback}\n */\n addBatchObservableCallback(_callback, _observables) { }\n /**\n * @see {@link Meter.removeBatchObservableCallback}\n */\n removeBatchObservableCallback(_callback) { }\n}\nexports.NoopMeter = NoopMeter;\nclass NoopMetric {\n}\nexports.NoopMetric = NoopMetric;\nclass NoopCounterMetric extends NoopMetric {\n add(_value, _attributes) { }\n}\nexports.NoopCounterMetric = NoopCounterMetric;\nclass NoopUpDownCounterMetric extends NoopMetric {\n add(_value, _attributes) { }\n}\nexports.NoopUpDownCounterMetric = NoopUpDownCounterMetric;\nclass NoopGaugeMetric extends NoopMetric {\n record(_value, _attributes) { }\n}\nexports.NoopGaugeMetric = NoopGaugeMetric;\nclass NoopHistogramMetric extends NoopMetric {\n record(_value, _attributes) { }\n}\nexports.NoopHistogramMetric = NoopHistogramMetric;\nclass NoopObservableMetric {\n addCallback(_callback) { }\n removeCallback(_callback) { }\n}\nexports.NoopObservableMetric = NoopObservableMetric;\nclass NoopObservableCounterMetric extends NoopObservableMetric {\n}\nexports.NoopObservableCounterMetric = NoopObservableCounterMetric;\nclass NoopObservableGaugeMetric extends NoopObservableMetric {\n}\nexports.NoopObservableGaugeMetric = NoopObservableGaugeMetric;\nclass NoopObservableUpDownCounterMetric extends NoopObservableMetric {\n}\nexports.NoopObservableUpDownCounterMetric = NoopObservableUpDownCounterMetric;\nexports.NOOP_METER = new NoopMeter();\n// Synchronous instruments\nexports.NOOP_COUNTER_METRIC = new NoopCounterMetric();\nexports.NOOP_GAUGE_METRIC = new NoopGaugeMetric();\nexports.NOOP_HISTOGRAM_METRIC = new NoopHistogramMetric();\nexports.NOOP_UP_DOWN_COUNTER_METRIC = new NoopUpDownCounterMetric();\n// Asynchronous instruments\nexports.NOOP_OBSERVABLE_COUNTER_METRIC = new NoopObservableCounterMetric();\nexports.NOOP_OBSERVABLE_GAUGE_METRIC = new NoopObservableGaugeMetric();\nexports.NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC = new NoopObservableUpDownCounterMetric();\n/**\n * Create a no-op Meter\n */\nfunction createNoopMeter() {\n return exports.NOOP_METER;\n}\nexports.createNoopMeter = createNoopMeter;\n//# sourceMappingURL=NoopMeter.js.map",
21
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ValueType = void 0;\n/** The Type of value. It describes how the data is reported. */\nvar ValueType;\n(function (ValueType) {\n ValueType[ValueType[\"INT\"] = 0] = \"INT\";\n ValueType[ValueType[\"DOUBLE\"] = 1] = \"DOUBLE\";\n})(ValueType = exports.ValueType || (exports.ValueType = {}));\n//# sourceMappingURL=Metric.js.map",
22
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultTextMapSetter = exports.defaultTextMapGetter = void 0;\nexports.defaultTextMapGetter = {\n get(carrier, key) {\n if (carrier == null) {\n return undefined;\n }\n return carrier[key];\n },\n keys(carrier) {\n if (carrier == null) {\n return [];\n }\n return Object.keys(carrier);\n },\n};\nexports.defaultTextMapSetter = {\n set(carrier, key, value) {\n if (carrier == null) {\n return;\n }\n carrier[key] = value;\n },\n};\n//# sourceMappingURL=TextMapPropagator.js.map",
23
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NoopContextManager = void 0;\nconst context_1 = require(\"./context\");\nclass NoopContextManager {\n active() {\n return context_1.ROOT_CONTEXT;\n }\n with(_context, fn, thisArg, ...args) {\n return fn.call(thisArg, ...args);\n }\n bind(_context, target) {\n return target;\n }\n enable() {\n return this;\n }\n disable() {\n return this;\n }\n}\nexports.NoopContextManager = NoopContextManager;\n//# sourceMappingURL=NoopContextManager.js.map",
24
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ContextAPI = void 0;\nconst NoopContextManager_1 = require(\"../context/NoopContextManager\");\nconst global_utils_1 = require(\"../internal/global-utils\");\nconst diag_1 = require(\"./diag\");\nconst API_NAME = 'context';\nconst NOOP_CONTEXT_MANAGER = new NoopContextManager_1.NoopContextManager();\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Context API\n */\nclass ContextAPI {\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n constructor() { }\n /** Get the singleton instance of the Context API */\n static getInstance() {\n if (!this._instance) {\n this._instance = new ContextAPI();\n }\n return this._instance;\n }\n /**\n * Set the current context manager.\n *\n * @returns true if the context manager was successfully registered, else false\n */\n setGlobalContextManager(contextManager) {\n return (0, global_utils_1.registerGlobal)(API_NAME, contextManager, diag_1.DiagAPI.instance());\n }\n /**\n * Get the currently active context\n */\n active() {\n return this._getContextManager().active();\n }\n /**\n * Execute a function with an active context\n *\n * @param context context to be active during function execution\n * @param fn function to execute in a context\n * @param thisArg optional receiver to be used for calling fn\n * @param args optional arguments forwarded to fn\n */\n with(context, fn, thisArg, ...args) {\n return this._getContextManager().with(context, fn, thisArg, ...args);\n }\n /**\n * Bind a context to a target function or event emitter\n *\n * @param context context to bind to the event emitter or function. Defaults to the currently active context\n * @param target function or event emitter to bind\n */\n bind(context, target) {\n return this._getContextManager().bind(context, target);\n }\n _getContextManager() {\n return (0, global_utils_1.getGlobal)(API_NAME) || NOOP_CONTEXT_MANAGER;\n }\n /** Disable and remove the global context manager */\n disable() {\n this._getContextManager().disable();\n (0, global_utils_1.unregisterGlobal)(API_NAME, diag_1.DiagAPI.instance());\n }\n}\nexports.ContextAPI = ContextAPI;\n//# sourceMappingURL=context.js.map",
25
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TraceFlags = void 0;\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar TraceFlags;\n(function (TraceFlags) {\n /** Represents no flag set. */\n TraceFlags[TraceFlags[\"NONE\"] = 0] = \"NONE\";\n /** Bit to represent whether trace is sampled in trace flags. */\n TraceFlags[TraceFlags[\"SAMPLED\"] = 1] = \"SAMPLED\";\n})(TraceFlags = exports.TraceFlags || (exports.TraceFlags = {}));\n//# sourceMappingURL=trace_flags.js.map",
26
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.INVALID_SPAN_CONTEXT = exports.INVALID_TRACEID = exports.INVALID_SPANID = void 0;\nconst trace_flags_1 = require(\"./trace_flags\");\nexports.INVALID_SPANID = '0000000000000000';\nexports.INVALID_TRACEID = '00000000000000000000000000000000';\nexports.INVALID_SPAN_CONTEXT = {\n traceId: exports.INVALID_TRACEID,\n spanId: exports.INVALID_SPANID,\n traceFlags: trace_flags_1.TraceFlags.NONE,\n};\n//# sourceMappingURL=invalid-span-constants.js.map",
27
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NonRecordingSpan = void 0;\nconst invalid_span_constants_1 = require(\"./invalid-span-constants\");\n/**\n * The NonRecordingSpan is the default {@link Span} that is used when no Span\n * implementation is available. All operations are no-op including context\n * propagation.\n */\nclass NonRecordingSpan {\n constructor(_spanContext = invalid_span_constants_1.INVALID_SPAN_CONTEXT) {\n this._spanContext = _spanContext;\n }\n // Returns a SpanContext.\n spanContext() {\n return this._spanContext;\n }\n // By default does nothing\n setAttribute(_key, _value) {\n return this;\n }\n // By default does nothing\n setAttributes(_attributes) {\n return this;\n }\n // By default does nothing\n addEvent(_name, _attributes) {\n return this;\n }\n addLink(_link) {\n return this;\n }\n addLinks(_links) {\n return this;\n }\n // By default does nothing\n setStatus(_status) {\n return this;\n }\n // By default does nothing\n updateName(_name) {\n return this;\n }\n // By default does nothing\n end(_endTime) { }\n // isRecording always returns false for NonRecordingSpan.\n isRecording() {\n return false;\n }\n // By default does nothing\n recordException(_exception, _time) { }\n}\nexports.NonRecordingSpan = NonRecordingSpan;\n//# sourceMappingURL=NonRecordingSpan.js.map",
28
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSpanContext = exports.setSpanContext = exports.deleteSpan = exports.setSpan = exports.getActiveSpan = exports.getSpan = void 0;\nconst context_1 = require(\"../context/context\");\nconst NonRecordingSpan_1 = require(\"./NonRecordingSpan\");\nconst context_2 = require(\"../api/context\");\n/**\n * span key\n */\nconst SPAN_KEY = (0, context_1.createContextKey)('OpenTelemetry Context Key SPAN');\n/**\n * Return the span if one exists\n *\n * @param context context to get span from\n */\nfunction getSpan(context) {\n return context.getValue(SPAN_KEY) || undefined;\n}\nexports.getSpan = getSpan;\n/**\n * Gets the span from the current context, if one exists.\n */\nfunction getActiveSpan() {\n return getSpan(context_2.ContextAPI.getInstance().active());\n}\nexports.getActiveSpan = getActiveSpan;\n/**\n * Set the span on a context\n *\n * @param context context to use as parent\n * @param span span to set active\n */\nfunction setSpan(context, span) {\n return context.setValue(SPAN_KEY, span);\n}\nexports.setSpan = setSpan;\n/**\n * Remove current span stored in the context\n *\n * @param context context to delete span from\n */\nfunction deleteSpan(context) {\n return context.deleteValue(SPAN_KEY);\n}\nexports.deleteSpan = deleteSpan;\n/**\n * Wrap span context in a NoopSpan and set as span in a new\n * context\n *\n * @param context context to set active span on\n * @param spanContext span context to be wrapped\n */\nfunction setSpanContext(context, spanContext) {\n return setSpan(context, new NonRecordingSpan_1.NonRecordingSpan(spanContext));\n}\nexports.setSpanContext = setSpanContext;\n/**\n * Get the span context of the span if it exists.\n *\n * @param context context to get values from\n */\nfunction getSpanContext(context) {\n var _a;\n return (_a = getSpan(context)) === null || _a === void 0 ? void 0 : _a.spanContext();\n}\nexports.getSpanContext = getSpanContext;\n//# sourceMappingURL=context-utils.js.map",
29
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.wrapSpanContext = exports.isSpanContextValid = exports.isValidSpanId = exports.isValidTraceId = void 0;\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst invalid_span_constants_1 = require(\"./invalid-span-constants\");\nconst NonRecordingSpan_1 = require(\"./NonRecordingSpan\");\nconst VALID_TRACEID_REGEX = /^([0-9a-f]{32})$/i;\nconst VALID_SPANID_REGEX = /^[0-9a-f]{16}$/i;\nfunction isValidTraceId(traceId) {\n return VALID_TRACEID_REGEX.test(traceId) && traceId !== invalid_span_constants_1.INVALID_TRACEID;\n}\nexports.isValidTraceId = isValidTraceId;\nfunction isValidSpanId(spanId) {\n return VALID_SPANID_REGEX.test(spanId) && spanId !== invalid_span_constants_1.INVALID_SPANID;\n}\nexports.isValidSpanId = isValidSpanId;\n/**\n * Returns true if this {@link SpanContext} is valid.\n * @return true if this {@link SpanContext} is valid.\n */\nfunction isSpanContextValid(spanContext) {\n return (isValidTraceId(spanContext.traceId) && isValidSpanId(spanContext.spanId));\n}\nexports.isSpanContextValid = isSpanContextValid;\n/**\n * Wrap the given {@link SpanContext} in a new non-recording {@link Span}\n *\n * @param spanContext span context to be wrapped\n * @returns a new non-recording {@link Span} with the provided context\n */\nfunction wrapSpanContext(spanContext) {\n return new NonRecordingSpan_1.NonRecordingSpan(spanContext);\n}\nexports.wrapSpanContext = wrapSpanContext;\n//# sourceMappingURL=spancontext-utils.js.map",
30
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NoopTracer = void 0;\nconst context_1 = require(\"../api/context\");\nconst context_utils_1 = require(\"../trace/context-utils\");\nconst NonRecordingSpan_1 = require(\"./NonRecordingSpan\");\nconst spancontext_utils_1 = require(\"./spancontext-utils\");\nconst contextApi = context_1.ContextAPI.getInstance();\n/**\n * No-op implementations of {@link Tracer}.\n */\nclass NoopTracer {\n // startSpan starts a noop span.\n startSpan(name, options, context = contextApi.active()) {\n const root = Boolean(options === null || options === void 0 ? void 0 : options.root);\n if (root) {\n return new NonRecordingSpan_1.NonRecordingSpan();\n }\n const parentFromContext = context && (0, context_utils_1.getSpanContext)(context);\n if (isSpanContext(parentFromContext) &&\n (0, spancontext_utils_1.isSpanContextValid)(parentFromContext)) {\n return new NonRecordingSpan_1.NonRecordingSpan(parentFromContext);\n }\n else {\n return new NonRecordingSpan_1.NonRecordingSpan();\n }\n }\n startActiveSpan(name, arg2, arg3, arg4) {\n let opts;\n let ctx;\n let fn;\n if (arguments.length < 2) {\n return;\n }\n else if (arguments.length === 2) {\n fn = arg2;\n }\n else if (arguments.length === 3) {\n opts = arg2;\n fn = arg3;\n }\n else {\n opts = arg2;\n ctx = arg3;\n fn = arg4;\n }\n const parentContext = ctx !== null && ctx !== void 0 ? ctx : contextApi.active();\n const span = this.startSpan(name, opts, parentContext);\n const contextWithSpanSet = (0, context_utils_1.setSpan)(parentContext, span);\n return contextApi.with(contextWithSpanSet, fn, undefined, span);\n }\n}\nexports.NoopTracer = NoopTracer;\nfunction isSpanContext(spanContext) {\n return (typeof spanContext === 'object' &&\n typeof spanContext['spanId'] === 'string' &&\n typeof spanContext['traceId'] === 'string' &&\n typeof spanContext['traceFlags'] === 'number');\n}\n//# sourceMappingURL=NoopTracer.js.map",
31
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ProxyTracer = void 0;\nconst NoopTracer_1 = require(\"./NoopTracer\");\nconst NOOP_TRACER = new NoopTracer_1.NoopTracer();\n/**\n * Proxy tracer provided by the proxy tracer provider\n */\nclass ProxyTracer {\n constructor(_provider, name, version, options) {\n this._provider = _provider;\n this.name = name;\n this.version = version;\n this.options = options;\n }\n startSpan(name, options, context) {\n return this._getTracer().startSpan(name, options, context);\n }\n startActiveSpan(_name, _options, _context, _fn) {\n const tracer = this._getTracer();\n return Reflect.apply(tracer.startActiveSpan, tracer, arguments);\n }\n /**\n * Try to get a tracer from the proxy tracer provider.\n * If the proxy tracer provider has no delegate, return a noop tracer.\n */\n _getTracer() {\n if (this._delegate) {\n return this._delegate;\n }\n const tracer = this._provider.getDelegateTracer(this.name, this.version, this.options);\n if (!tracer) {\n return NOOP_TRACER;\n }\n this._delegate = tracer;\n return this._delegate;\n }\n}\nexports.ProxyTracer = ProxyTracer;\n//# sourceMappingURL=ProxyTracer.js.map",
32
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NoopTracerProvider = void 0;\nconst NoopTracer_1 = require(\"./NoopTracer\");\n/**\n * An implementation of the {@link TracerProvider} which returns an impotent\n * Tracer for all calls to `getTracer`.\n *\n * All operations are no-op.\n */\nclass NoopTracerProvider {\n getTracer(_name, _version, _options) {\n return new NoopTracer_1.NoopTracer();\n }\n}\nexports.NoopTracerProvider = NoopTracerProvider;\n//# sourceMappingURL=NoopTracerProvider.js.map",
33
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ProxyTracerProvider = void 0;\nconst ProxyTracer_1 = require(\"./ProxyTracer\");\nconst NoopTracerProvider_1 = require(\"./NoopTracerProvider\");\nconst NOOP_TRACER_PROVIDER = new NoopTracerProvider_1.NoopTracerProvider();\n/**\n * Tracer provider which provides {@link ProxyTracer}s.\n *\n * Before a delegate is set, tracers provided are NoOp.\n * When a delegate is set, traces are provided from the delegate.\n * When a delegate is set after tracers have already been provided,\n * all tracers already provided will use the provided delegate implementation.\n */\nclass ProxyTracerProvider {\n /**\n * Get a {@link ProxyTracer}\n */\n getTracer(name, version, options) {\n var _a;\n return ((_a = this.getDelegateTracer(name, version, options)) !== null && _a !== void 0 ? _a : new ProxyTracer_1.ProxyTracer(this, name, version, options));\n }\n getDelegate() {\n var _a;\n return (_a = this._delegate) !== null && _a !== void 0 ? _a : NOOP_TRACER_PROVIDER;\n }\n /**\n * Set the delegate tracer provider\n */\n setDelegate(delegate) {\n this._delegate = delegate;\n }\n getDelegateTracer(name, version, options) {\n var _a;\n return (_a = this._delegate) === null || _a === void 0 ? void 0 : _a.getTracer(name, version, options);\n }\n}\nexports.ProxyTracerProvider = ProxyTracerProvider;\n//# sourceMappingURL=ProxyTracerProvider.js.map",
34
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SamplingDecision = void 0;\n/**\n * @deprecated use the one declared in @opentelemetry/sdk-trace-base instead.\n * A sampling decision that determines how a {@link Span} will be recorded\n * and collected.\n */\nvar SamplingDecision;\n(function (SamplingDecision) {\n /**\n * `Span.isRecording() === false`, span will not be recorded and all events\n * and attributes will be dropped.\n */\n SamplingDecision[SamplingDecision[\"NOT_RECORD\"] = 0] = \"NOT_RECORD\";\n /**\n * `Span.isRecording() === true`, but `Sampled` flag in {@link TraceFlags}\n * MUST NOT be set.\n */\n SamplingDecision[SamplingDecision[\"RECORD\"] = 1] = \"RECORD\";\n /**\n * `Span.isRecording() === true` AND `Sampled` flag in {@link TraceFlags}\n * MUST be set.\n */\n SamplingDecision[SamplingDecision[\"RECORD_AND_SAMPLED\"] = 2] = \"RECORD_AND_SAMPLED\";\n})(SamplingDecision = exports.SamplingDecision || (exports.SamplingDecision = {}));\n//# sourceMappingURL=SamplingResult.js.map",
35
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SpanKind = void 0;\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar SpanKind;\n(function (SpanKind) {\n /** Default value. Indicates that the span is used internally. */\n SpanKind[SpanKind[\"INTERNAL\"] = 0] = \"INTERNAL\";\n /**\n * Indicates that the span covers server-side handling of an RPC or other\n * remote request.\n */\n SpanKind[SpanKind[\"SERVER\"] = 1] = \"SERVER\";\n /**\n * Indicates that the span covers the client-side wrapper around an RPC or\n * other remote request.\n */\n SpanKind[SpanKind[\"CLIENT\"] = 2] = \"CLIENT\";\n /**\n * Indicates that the span describes producer sending a message to a\n * broker. Unlike client and server, there is no direct critical path latency\n * relationship between producer and consumer spans.\n */\n SpanKind[SpanKind[\"PRODUCER\"] = 3] = \"PRODUCER\";\n /**\n * Indicates that the span describes consumer receiving a message from a\n * broker. Unlike client and server, there is no direct critical path latency\n * relationship between producer and consumer spans.\n */\n SpanKind[SpanKind[\"CONSUMER\"] = 4] = \"CONSUMER\";\n})(SpanKind = exports.SpanKind || (exports.SpanKind = {}));\n//# sourceMappingURL=span_kind.js.map",
36
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SpanStatusCode = void 0;\n/**\n * An enumeration of status codes.\n */\nvar SpanStatusCode;\n(function (SpanStatusCode) {\n /**\n * The default status.\n */\n SpanStatusCode[SpanStatusCode[\"UNSET\"] = 0] = \"UNSET\";\n /**\n * The operation has been validated by an Application developer or\n * Operator to have completed successfully.\n */\n SpanStatusCode[SpanStatusCode[\"OK\"] = 1] = \"OK\";\n /**\n * The operation contains an error.\n */\n SpanStatusCode[SpanStatusCode[\"ERROR\"] = 2] = \"ERROR\";\n})(SpanStatusCode = exports.SpanStatusCode || (exports.SpanStatusCode = {}));\n//# sourceMappingURL=status.js.map",
37
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateValue = exports.validateKey = void 0;\nconst VALID_KEY_CHAR_RANGE = '[_0-9a-z-*/]';\nconst VALID_KEY = `[a-z]${VALID_KEY_CHAR_RANGE}{0,255}`;\nconst VALID_VENDOR_KEY = `[a-z0-9]${VALID_KEY_CHAR_RANGE}{0,240}@[a-z]${VALID_KEY_CHAR_RANGE}{0,13}`;\nconst VALID_KEY_REGEX = new RegExp(`^(?:${VALID_KEY}|${VALID_VENDOR_KEY})$`);\nconst VALID_VALUE_BASE_REGEX = /^[ -~]{0,255}[!-~]$/;\nconst INVALID_VALUE_COMMA_EQUAL_REGEX = /,|=/;\n/**\n * Key is opaque string up to 256 characters printable. It MUST begin with a\n * lowercase letter, and can only contain lowercase letters a-z, digits 0-9,\n * underscores _, dashes -, asterisks *, and forward slashes /.\n * For multi-tenant vendor scenarios, an at sign (@) can be used to prefix the\n * vendor name. Vendors SHOULD set the tenant ID at the beginning of the key.\n * see https://www.w3.org/TR/trace-context/#key\n */\nfunction validateKey(key) {\n return VALID_KEY_REGEX.test(key);\n}\nexports.validateKey = validateKey;\n/**\n * Value is opaque string up to 256 characters printable ASCII RFC0020\n * characters (i.e., the range 0x20 to 0x7E) except comma , and =.\n */\nfunction validateValue(value) {\n return (VALID_VALUE_BASE_REGEX.test(value) &&\n !INVALID_VALUE_COMMA_EQUAL_REGEX.test(value));\n}\nexports.validateValue = validateValue;\n//# sourceMappingURL=tracestate-validators.js.map",
38
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TraceStateImpl = void 0;\nconst tracestate_validators_1 = require(\"./tracestate-validators\");\nconst MAX_TRACE_STATE_ITEMS = 32;\nconst MAX_TRACE_STATE_LEN = 512;\nconst LIST_MEMBERS_SEPARATOR = ',';\nconst LIST_MEMBER_KEY_VALUE_SPLITTER = '=';\n/**\n * TraceState must be a class and not a simple object type because of the spec\n * requirement (https://www.w3.org/TR/trace-context/#tracestate-field).\n *\n * Here is the list of allowed mutations:\n * - New key-value pair should be added into the beginning of the list\n * - The value of any key can be updated. Modified keys MUST be moved to the\n * beginning of the list.\n */\nclass TraceStateImpl {\n constructor(rawTraceState) {\n this._internalState = new Map();\n if (rawTraceState)\n this._parse(rawTraceState);\n }\n set(key, value) {\n // TODO: Benchmark the different approaches(map vs list) and\n // use the faster one.\n const traceState = this._clone();\n if (traceState._internalState.has(key)) {\n traceState._internalState.delete(key);\n }\n traceState._internalState.set(key, value);\n return traceState;\n }\n unset(key) {\n const traceState = this._clone();\n traceState._internalState.delete(key);\n return traceState;\n }\n get(key) {\n return this._internalState.get(key);\n }\n serialize() {\n return this._keys()\n .reduce((agg, key) => {\n agg.push(key + LIST_MEMBER_KEY_VALUE_SPLITTER + this.get(key));\n return agg;\n }, [])\n .join(LIST_MEMBERS_SEPARATOR);\n }\n _parse(rawTraceState) {\n if (rawTraceState.length > MAX_TRACE_STATE_LEN)\n return;\n this._internalState = rawTraceState\n .split(LIST_MEMBERS_SEPARATOR)\n .reverse() // Store in reverse so new keys (.set(...)) will be placed at the beginning\n .reduce((agg, part) => {\n const listMember = part.trim(); // Optional Whitespace (OWS) handling\n const i = listMember.indexOf(LIST_MEMBER_KEY_VALUE_SPLITTER);\n if (i !== -1) {\n const key = listMember.slice(0, i);\n const value = listMember.slice(i + 1, part.length);\n if ((0, tracestate_validators_1.validateKey)(key) && (0, tracestate_validators_1.validateValue)(value)) {\n agg.set(key, value);\n }\n else {\n // TODO: Consider to add warning log\n }\n }\n return agg;\n }, new Map());\n // Because of the reverse() requirement, trunc must be done after map is created\n if (this._internalState.size > MAX_TRACE_STATE_ITEMS) {\n this._internalState = new Map(Array.from(this._internalState.entries())\n .reverse() // Use reverse same as original tracestate parse chain\n .slice(0, MAX_TRACE_STATE_ITEMS));\n }\n }\n _keys() {\n return Array.from(this._internalState.keys()).reverse();\n }\n _clone() {\n const traceState = new TraceStateImpl();\n traceState._internalState = new Map(this._internalState);\n return traceState;\n }\n}\nexports.TraceStateImpl = TraceStateImpl;\n//# sourceMappingURL=tracestate-impl.js.map",
39
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createTraceState = void 0;\nconst tracestate_impl_1 = require(\"./tracestate-impl\");\nfunction createTraceState(rawTraceState) {\n return new tracestate_impl_1.TraceStateImpl(rawTraceState);\n}\nexports.createTraceState = createTraceState;\n//# sourceMappingURL=utils.js.map",
40
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.context = void 0;\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nconst context_1 = require(\"./api/context\");\n/** Entrypoint for context API */\nexports.context = context_1.ContextAPI.getInstance();\n//# sourceMappingURL=context-api.js.map",
41
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.diag = void 0;\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nconst diag_1 = require(\"./api/diag\");\n/**\n * Entrypoint for Diag API.\n * Defines Diagnostic handler used for internal diagnostic logging operations.\n * The default provides a Noop DiagLogger implementation which may be changed via the\n * diag.setLogger(logger: DiagLogger) function.\n */\nexports.diag = diag_1.DiagAPI.instance();\n//# sourceMappingURL=diag-api.js.map",
42
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NOOP_METER_PROVIDER = exports.NoopMeterProvider = void 0;\nconst NoopMeter_1 = require(\"./NoopMeter\");\n/**\n * An implementation of the {@link MeterProvider} which returns an impotent Meter\n * for all calls to `getMeter`\n */\nclass NoopMeterProvider {\n getMeter(_name, _version, _options) {\n return NoopMeter_1.NOOP_METER;\n }\n}\nexports.NoopMeterProvider = NoopMeterProvider;\nexports.NOOP_METER_PROVIDER = new NoopMeterProvider();\n//# sourceMappingURL=NoopMeterProvider.js.map",
43
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MetricsAPI = void 0;\nconst NoopMeterProvider_1 = require(\"../metrics/NoopMeterProvider\");\nconst global_utils_1 = require(\"../internal/global-utils\");\nconst diag_1 = require(\"./diag\");\nconst API_NAME = 'metrics';\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Metrics API\n */\nclass MetricsAPI {\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n constructor() { }\n /** Get the singleton instance of the Metrics API */\n static getInstance() {\n if (!this._instance) {\n this._instance = new MetricsAPI();\n }\n return this._instance;\n }\n /**\n * Set the current global meter provider.\n * Returns true if the meter provider was successfully registered, else false.\n */\n setGlobalMeterProvider(provider) {\n return (0, global_utils_1.registerGlobal)(API_NAME, provider, diag_1.DiagAPI.instance());\n }\n /**\n * Returns the global meter provider.\n */\n getMeterProvider() {\n return (0, global_utils_1.getGlobal)(API_NAME) || NoopMeterProvider_1.NOOP_METER_PROVIDER;\n }\n /**\n * Returns a meter from the global meter provider.\n */\n getMeter(name, version, options) {\n return this.getMeterProvider().getMeter(name, version, options);\n }\n /** Remove the global meter provider */\n disable() {\n (0, global_utils_1.unregisterGlobal)(API_NAME, diag_1.DiagAPI.instance());\n }\n}\nexports.MetricsAPI = MetricsAPI;\n//# sourceMappingURL=metrics.js.map",
44
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.metrics = void 0;\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nconst metrics_1 = require(\"./api/metrics\");\n/** Entrypoint for metrics API */\nexports.metrics = metrics_1.MetricsAPI.getInstance();\n//# sourceMappingURL=metrics-api.js.map",
45
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NoopTextMapPropagator = void 0;\n/**\n * No-op implementations of {@link TextMapPropagator}.\n */\nclass NoopTextMapPropagator {\n /** Noop inject function does nothing */\n inject(_context, _carrier) { }\n /** Noop extract function does nothing and returns the input context */\n extract(context, _carrier) {\n return context;\n }\n fields() {\n return [];\n }\n}\nexports.NoopTextMapPropagator = NoopTextMapPropagator;\n//# sourceMappingURL=NoopTextMapPropagator.js.map",
46
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.deleteBaggage = exports.setBaggage = exports.getActiveBaggage = exports.getBaggage = void 0;\nconst context_1 = require(\"../api/context\");\nconst context_2 = require(\"../context/context\");\n/**\n * Baggage key\n */\nconst BAGGAGE_KEY = (0, context_2.createContextKey)('OpenTelemetry Baggage Key');\n/**\n * Retrieve the current baggage from the given context\n *\n * @param {Context} Context that manage all context values\n * @returns {Baggage} Extracted baggage from the context\n */\nfunction getBaggage(context) {\n return context.getValue(BAGGAGE_KEY) || undefined;\n}\nexports.getBaggage = getBaggage;\n/**\n * Retrieve the current baggage from the active/current context\n *\n * @returns {Baggage} Extracted baggage from the context\n */\nfunction getActiveBaggage() {\n return getBaggage(context_1.ContextAPI.getInstance().active());\n}\nexports.getActiveBaggage = getActiveBaggage;\n/**\n * Store a baggage in the given context\n *\n * @param {Context} Context that manage all context values\n * @param {Baggage} baggage that will be set in the actual context\n */\nfunction setBaggage(context, baggage) {\n return context.setValue(BAGGAGE_KEY, baggage);\n}\nexports.setBaggage = setBaggage;\n/**\n * Delete the baggage stored in the given context\n *\n * @param {Context} Context that manage all context values\n */\nfunction deleteBaggage(context) {\n return context.deleteValue(BAGGAGE_KEY);\n}\nexports.deleteBaggage = deleteBaggage;\n//# sourceMappingURL=context-helpers.js.map",
47
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PropagationAPI = void 0;\nconst global_utils_1 = require(\"../internal/global-utils\");\nconst NoopTextMapPropagator_1 = require(\"../propagation/NoopTextMapPropagator\");\nconst TextMapPropagator_1 = require(\"../propagation/TextMapPropagator\");\nconst context_helpers_1 = require(\"../baggage/context-helpers\");\nconst utils_1 = require(\"../baggage/utils\");\nconst diag_1 = require(\"./diag\");\nconst API_NAME = 'propagation';\nconst NOOP_TEXT_MAP_PROPAGATOR = new NoopTextMapPropagator_1.NoopTextMapPropagator();\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Propagation API\n */\nclass PropagationAPI {\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n constructor() {\n this.createBaggage = utils_1.createBaggage;\n this.getBaggage = context_helpers_1.getBaggage;\n this.getActiveBaggage = context_helpers_1.getActiveBaggage;\n this.setBaggage = context_helpers_1.setBaggage;\n this.deleteBaggage = context_helpers_1.deleteBaggage;\n }\n /** Get the singleton instance of the Propagator API */\n static getInstance() {\n if (!this._instance) {\n this._instance = new PropagationAPI();\n }\n return this._instance;\n }\n /**\n * Set the current propagator.\n *\n * @returns true if the propagator was successfully registered, else false\n */\n setGlobalPropagator(propagator) {\n return (0, global_utils_1.registerGlobal)(API_NAME, propagator, diag_1.DiagAPI.instance());\n }\n /**\n * Inject context into a carrier to be propagated inter-process\n *\n * @param context Context carrying tracing data to inject\n * @param carrier carrier to inject context into\n * @param setter Function used to set values on the carrier\n */\n inject(context, carrier, setter = TextMapPropagator_1.defaultTextMapSetter) {\n return this._getGlobalPropagator().inject(context, carrier, setter);\n }\n /**\n * Extract context from a carrier\n *\n * @param context Context which the newly created context will inherit from\n * @param carrier Carrier to extract context from\n * @param getter Function used to extract keys from a carrier\n */\n extract(context, carrier, getter = TextMapPropagator_1.defaultTextMapGetter) {\n return this._getGlobalPropagator().extract(context, carrier, getter);\n }\n /**\n * Return a list of all fields which may be used by the propagator.\n */\n fields() {\n return this._getGlobalPropagator().fields();\n }\n /** Remove the global propagator */\n disable() {\n (0, global_utils_1.unregisterGlobal)(API_NAME, diag_1.DiagAPI.instance());\n }\n _getGlobalPropagator() {\n return (0, global_utils_1.getGlobal)(API_NAME) || NOOP_TEXT_MAP_PROPAGATOR;\n }\n}\nexports.PropagationAPI = PropagationAPI;\n//# sourceMappingURL=propagation.js.map",
48
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.propagation = void 0;\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nconst propagation_1 = require(\"./api/propagation\");\n/** Entrypoint for propagation API */\nexports.propagation = propagation_1.PropagationAPI.getInstance();\n//# sourceMappingURL=propagation-api.js.map",
49
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TraceAPI = void 0;\nconst global_utils_1 = require(\"../internal/global-utils\");\nconst ProxyTracerProvider_1 = require(\"../trace/ProxyTracerProvider\");\nconst spancontext_utils_1 = require(\"../trace/spancontext-utils\");\nconst context_utils_1 = require(\"../trace/context-utils\");\nconst diag_1 = require(\"./diag\");\nconst API_NAME = 'trace';\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Tracing API\n */\nclass TraceAPI {\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n constructor() {\n this._proxyTracerProvider = new ProxyTracerProvider_1.ProxyTracerProvider();\n this.wrapSpanContext = spancontext_utils_1.wrapSpanContext;\n this.isSpanContextValid = spancontext_utils_1.isSpanContextValid;\n this.deleteSpan = context_utils_1.deleteSpan;\n this.getSpan = context_utils_1.getSpan;\n this.getActiveSpan = context_utils_1.getActiveSpan;\n this.getSpanContext = context_utils_1.getSpanContext;\n this.setSpan = context_utils_1.setSpan;\n this.setSpanContext = context_utils_1.setSpanContext;\n }\n /** Get the singleton instance of the Trace API */\n static getInstance() {\n if (!this._instance) {\n this._instance = new TraceAPI();\n }\n return this._instance;\n }\n /**\n * Set the current global tracer.\n *\n * @returns true if the tracer provider was successfully registered, else false\n */\n setGlobalTracerProvider(provider) {\n const success = (0, global_utils_1.registerGlobal)(API_NAME, this._proxyTracerProvider, diag_1.DiagAPI.instance());\n if (success) {\n this._proxyTracerProvider.setDelegate(provider);\n }\n return success;\n }\n /**\n * Returns the global tracer provider.\n */\n getTracerProvider() {\n return (0, global_utils_1.getGlobal)(API_NAME) || this._proxyTracerProvider;\n }\n /**\n * Returns a tracer from the global tracer provider.\n */\n getTracer(name, version) {\n return this.getTracerProvider().getTracer(name, version);\n }\n /** Remove the global tracer provider */\n disable() {\n (0, global_utils_1.unregisterGlobal)(API_NAME, diag_1.DiagAPI.instance());\n this._proxyTracerProvider = new ProxyTracerProvider_1.ProxyTracerProvider();\n }\n}\nexports.TraceAPI = TraceAPI;\n//# sourceMappingURL=trace.js.map",
50
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.trace = void 0;\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nconst trace_1 = require(\"./api/trace\");\n/** Entrypoint for trace API */\nexports.trace = trace_1.TraceAPI.getInstance();\n//# sourceMappingURL=trace-api.js.map",
51
- "\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.trace = exports.propagation = exports.metrics = exports.diag = exports.context = exports.INVALID_SPAN_CONTEXT = exports.INVALID_TRACEID = exports.INVALID_SPANID = exports.isValidSpanId = exports.isValidTraceId = exports.isSpanContextValid = exports.createTraceState = exports.TraceFlags = exports.SpanStatusCode = exports.SpanKind = exports.SamplingDecision = exports.ProxyTracerProvider = exports.ProxyTracer = exports.defaultTextMapSetter = exports.defaultTextMapGetter = exports.ValueType = exports.createNoopMeter = exports.DiagLogLevel = exports.DiagConsoleLogger = exports.ROOT_CONTEXT = exports.createContextKey = exports.baggageEntryMetadataFromString = void 0;\nvar utils_1 = require(\"./baggage/utils\");\nObject.defineProperty(exports, \"baggageEntryMetadataFromString\", { enumerable: true, get: function () { return utils_1.baggageEntryMetadataFromString; } });\n// Context APIs\nvar context_1 = require(\"./context/context\");\nObject.defineProperty(exports, \"createContextKey\", { enumerable: true, get: function () { return context_1.createContextKey; } });\nObject.defineProperty(exports, \"ROOT_CONTEXT\", { enumerable: true, get: function () { return context_1.ROOT_CONTEXT; } });\n// Diag APIs\nvar consoleLogger_1 = require(\"./diag/consoleLogger\");\nObject.defineProperty(exports, \"DiagConsoleLogger\", { enumerable: true, get: function () { return consoleLogger_1.DiagConsoleLogger; } });\nvar types_1 = require(\"./diag/types\");\nObject.defineProperty(exports, \"DiagLogLevel\", { enumerable: true, get: function () { return types_1.DiagLogLevel; } });\n// Metrics APIs\nvar NoopMeter_1 = require(\"./metrics/NoopMeter\");\nObject.defineProperty(exports, \"createNoopMeter\", { enumerable: true, get: function () { return NoopMeter_1.createNoopMeter; } });\nvar Metric_1 = require(\"./metrics/Metric\");\nObject.defineProperty(exports, \"ValueType\", { enumerable: true, get: function () { return Metric_1.ValueType; } });\n// Propagation APIs\nvar TextMapPropagator_1 = require(\"./propagation/TextMapPropagator\");\nObject.defineProperty(exports, \"defaultTextMapGetter\", { enumerable: true, get: function () { return TextMapPropagator_1.defaultTextMapGetter; } });\nObject.defineProperty(exports, \"defaultTextMapSetter\", { enumerable: true, get: function () { return TextMapPropagator_1.defaultTextMapSetter; } });\nvar ProxyTracer_1 = require(\"./trace/ProxyTracer\");\nObject.defineProperty(exports, \"ProxyTracer\", { enumerable: true, get: function () { return ProxyTracer_1.ProxyTracer; } });\nvar ProxyTracerProvider_1 = require(\"./trace/ProxyTracerProvider\");\nObject.defineProperty(exports, \"ProxyTracerProvider\", { enumerable: true, get: function () { return ProxyTracerProvider_1.ProxyTracerProvider; } });\nvar SamplingResult_1 = require(\"./trace/SamplingResult\");\nObject.defineProperty(exports, \"SamplingDecision\", { enumerable: true, get: function () { return SamplingResult_1.SamplingDecision; } });\nvar span_kind_1 = require(\"./trace/span_kind\");\nObject.defineProperty(exports, \"SpanKind\", { enumerable: true, get: function () { return span_kind_1.SpanKind; } });\nvar status_1 = require(\"./trace/status\");\nObject.defineProperty(exports, \"SpanStatusCode\", { enumerable: true, get: function () { return status_1.SpanStatusCode; } });\nvar trace_flags_1 = require(\"./trace/trace_flags\");\nObject.defineProperty(exports, \"TraceFlags\", { enumerable: true, get: function () { return trace_flags_1.TraceFlags; } });\nvar utils_2 = require(\"./trace/internal/utils\");\nObject.defineProperty(exports, \"createTraceState\", { enumerable: true, get: function () { return utils_2.createTraceState; } });\nvar spancontext_utils_1 = require(\"./trace/spancontext-utils\");\nObject.defineProperty(exports, \"isSpanContextValid\", { enumerable: true, get: function () { return spancontext_utils_1.isSpanContextValid; } });\nObject.defineProperty(exports, \"isValidTraceId\", { enumerable: true, get: function () { return spancontext_utils_1.isValidTraceId; } });\nObject.defineProperty(exports, \"isValidSpanId\", { enumerable: true, get: function () { return spancontext_utils_1.isValidSpanId; } });\nvar invalid_span_constants_1 = require(\"./trace/invalid-span-constants\");\nObject.defineProperty(exports, \"INVALID_SPANID\", { enumerable: true, get: function () { return invalid_span_constants_1.INVALID_SPANID; } });\nObject.defineProperty(exports, \"INVALID_TRACEID\", { enumerable: true, get: function () { return invalid_span_constants_1.INVALID_TRACEID; } });\nObject.defineProperty(exports, \"INVALID_SPAN_CONTEXT\", { enumerable: true, get: function () { return invalid_span_constants_1.INVALID_SPAN_CONTEXT; } });\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nconst context_api_1 = require(\"./context-api\");\nObject.defineProperty(exports, \"context\", { enumerable: true, get: function () { return context_api_1.context; } });\nconst diag_api_1 = require(\"./diag-api\");\nObject.defineProperty(exports, \"diag\", { enumerable: true, get: function () { return diag_api_1.diag; } });\nconst metrics_api_1 = require(\"./metrics-api\");\nObject.defineProperty(exports, \"metrics\", { enumerable: true, get: function () { return metrics_api_1.metrics; } });\nconst propagation_api_1 = require(\"./propagation-api\");\nObject.defineProperty(exports, \"propagation\", { enumerable: true, get: function () { return propagation_api_1.propagation; } });\nconst trace_api_1 = require(\"./trace-api\");\nObject.defineProperty(exports, \"trace\", { enumerable: true, get: function () { return trace_api_1.trace; } });\n// Default export.\nexports.default = {\n context: context_api_1.context,\n diag: diag_api_1.diag,\n metrics: metrics_api_1.metrics,\n propagation: propagation_api_1.propagation,\n trace: trace_api_1.trace,\n};\n//# sourceMappingURL=index.js.map",
52
- "/**\n * FFI (Foreign Function Interface) 類型定義\n * 支持 bun:ffi 的原生加速層\n */\n\n/**\n * CBOR 編碼/解碼加速器介面\n * 可由原生 C 實現或 JavaScript 回退實現\n */\nexport interface CborAccelerator {\n /**\n * 將任意 JavaScript 物件編碼為 CBOR 二進制格式\n * @param data - 要編碼的物件(支援:map、string、uint、float64、bytes、null、boolean)\n * @returns CBOR 編碼的二進制資料\n */\n encode(data: Record<string, unknown>): Uint8Array\n\n /**\n * 將 CBOR 二進制格式解碼為 JavaScript 物件\n * @param bytes - CBOR 編碼的二進制資料\n * @returns 解碼後的物件\n */\n decode(bytes: Uint8Array): Record<string, unknown>\n}\n\n/**\n * FFI 加速層狀態報告\n */\nexport interface NativeAcceleratorStatus {\n /**\n * 原生 FFI 加速是否可用\n */\n readonly available: boolean\n\n /**\n * 當前使用的運行時實現\n * - 'bun-ffi': Bun C 編譯器(bun:ffi 的 cc())\n * - 'js-fallback': 手寫 JavaScript CBOR 實現\n * - 'cborg': npm 的 cborg 套件(已棄用,僅用於向後相容)\n */\n readonly runtime: 'bun-ffi' | 'js-fallback' | 'cborg'\n\n /**\n * 運行時版本或詳細資訊\n */\n readonly version: string\n}\n\n/**\n * FFI 層配置選項\n */\nexport interface FfiConfig {\n /**\n * 啟用調試日誌\n * @default false\n */\n readonly debug?: boolean\n\n /**\n * 最大 buffer 大小(位元組)\n * @default 1048576 (1MB)\n */\n readonly maxBufferSize?: number\n\n /**\n * 強制使用特定的加速器實現\n * - undefined: 自動選擇(優先 bun-ffi,降級到 js-fallback)\n * - 'bun-ffi': 只使用原生 C 實現\n * - 'js-fallback': 只使用 JavaScript 實現\n */\n readonly forceImplementation?: 'bun-ffi' | 'js-fallback'\n}\n\n/**\n * CBOR Major Type 常數\n * 符合 RFC 7049 規範\n */\nexport const CBOR_MAJOR_TYPES = {\n UINT: 0, // 正整數 (0 to 2^64-1)\n NEGINT: 1, // 負整數 (-1 to -2^64)\n BYTES: 2, // 位元組字串\n TEXT: 3, // 文字字串\n ARRAY: 4, // 陣列\n MAP: 5, // Map 物件\n TAG: 6, // 語意 tag\n SIMPLE: 7, // 簡單值與浮點數\n} as const\n\n/**\n * CBOR 簡單值常數\n */\nexport const CBOR_SIMPLE_VALUES = {\n FALSE: 20, // Boolean false\n TRUE: 21, // Boolean true\n NULL: 22, // null\n UNDEFINED: 23, // undefined (不常用)\n} as const\n\n/**\n * CBOR 長度編碼的附加資訊\n */\nexport const CBOR_LENGTH_ENCODING = {\n SMALL_RANGE_END: 23, // 0-23: 直接作為值\n UINT8: 24, // 24: 接下來 1 byte 為 uint8_t\n UINT16: 25, // 25: 接下來 2 bytes 為 uint16_t (大端序)\n UINT32: 26, // 26: 接下來 4 bytes 為 uint32_t (大端序)\n UINT64: 27, // 27: 接下來 8 bytes 為 uint64_t (大端序)\n FLOAT16: 25, // 25: IEEE 754 半精度浮點數 (special case for SIMPLE)\n FLOAT32: 26, // 26: IEEE 754 單精度浮點數\n FLOAT64: 27, // 27: IEEE 754 雙精度浮點數\n INDEFINITE: 31, // 31: 無限長度編碼\n} as const\n\n/**\n * 雜湊加速器介面\n * 可由 Bun 原生實現或 Node.js 回退實現\n */\nexport interface HashAccelerator {\n /**\n * SHA-256 雜湊計算\n * @param input - 輸入(字串或二進制)\n * @returns 十六進制編碼的 SHA-256 雜湊值(64 字元)\n */\n sha256(input: string | Uint8Array): string\n\n /**\n * HMAC-SHA256 計算\n * @param key - 密鑰\n * @param data - 要雜湊的數據\n * @returns 十六進制編碼的 HMAC-SHA256 值(64 字元)\n */\n hmacSha256(key: string, data: string): string\n}\n\n/**\n * 雜湊加速器狀態報告\n */\nexport interface NativeHasherStatus {\n /**\n * 雜湊加速層是否可用\n */\n readonly available: boolean\n\n /**\n * 當前使用的運行時實現\n * - 'bun-crypto-hasher': Bun 原生 CryptoHasher(C 實現,推薦)\n * - 'node-crypto': node:crypto 回退實現\n */\n readonly runtime: 'bun-crypto-hasher' | 'node-crypto'\n}\n",
53
- "/**\n * JavaScript CBOR 回退實現\n * 用於非 Bun 環境或 FFI 不可用的情況\n * 符合 RFC 7049 規範\n */\n\nimport type { CborAccelerator } from './types'\nimport { CBOR_LENGTH_ENCODING, CBOR_MAJOR_TYPES, CBOR_SIMPLE_VALUES } from './types'\n\n/**\n * CBOR 編碼器\n * 將 JavaScript 物件編碼為 CBOR 二進制格式\n */\nexport class CborFallbackEncoder implements CborAccelerator {\n private static readonly DEFAULT_BUFFER_SIZE = 4096\n private static readonly MAX_DEPTH = 16\n private static readonly MAX_BUFFER_SIZE = 1024 * 1024 // 1MB\n\n private buffer: Uint8Array\n private offset: number\n\n constructor() {\n this.buffer = new Uint8Array(CborFallbackEncoder.DEFAULT_BUFFER_SIZE)\n this.offset = 0\n }\n\n /**\n * 編碼 JavaScript 物件為 CBOR 格式\n */\n encode(data: Record<string, unknown>): Uint8Array {\n this.buffer = new Uint8Array(CborFallbackEncoder.DEFAULT_BUFFER_SIZE)\n this.offset = 0\n this.encodeValue(data, 0)\n return this.buffer.slice(0, this.offset)\n }\n\n /**\n * 解碼 CBOR 二進制為 JavaScript 物件\n */\n decode(bytes: Uint8Array): Record<string, unknown> {\n const decoder = new CborFallbackDecoder(bytes)\n const value = decoder.decode()\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error('CBOR 根值必須是物件')\n }\n return value as Record<string, unknown>\n }\n\n /**\n * 確保 buffer 有足夠空間\n */\n private ensureCapacity(required: number): void {\n let newCapacity = this.buffer.length\n while (this.offset + required > newCapacity) {\n newCapacity *= 2\n if (newCapacity > CborFallbackEncoder.MAX_BUFFER_SIZE) {\n throw new Error(\n `CBOR 編碼超過最大 buffer 大小 ${CborFallbackEncoder.MAX_BUFFER_SIZE} 位元組`\n )\n }\n }\n if (newCapacity !== this.buffer.length) {\n const newBuffer = new Uint8Array(newCapacity)\n newBuffer.set(this.buffer)\n this.buffer = newBuffer\n }\n }\n\n /**\n * 編寫一個位元組\n */\n private writeByte(byte: number): void {\n this.ensureCapacity(1)\n this.buffer[this.offset++] = byte & 0xff\n }\n\n /**\n * 編寫多個位元組\n */\n private writeBytes(bytes: ArrayLike<number>): void {\n this.ensureCapacity(bytes.length)\n this.buffer.set(bytes, this.offset)\n this.offset += bytes.length\n }\n\n /**\n * 編寫 CBOR 長度(Major Type + Additional Info)\n */\n private writeLength(majorType: number, length: number): void {\n const type = majorType << 5\n\n if (length < 24) {\n this.writeByte(type | length)\n } else if (length <= 0xff) {\n this.writeByte(type | CBOR_LENGTH_ENCODING.UINT8)\n this.writeByte(length)\n } else if (length <= 0xffff) {\n this.writeByte(type | CBOR_LENGTH_ENCODING.UINT16)\n this.writeByte((length >> 8) & 0xff)\n this.writeByte(length & 0xff)\n } else if (length <= 0xffffffff) {\n this.writeByte(type | CBOR_LENGTH_ENCODING.UINT32)\n this.writeByte((length >> 24) & 0xff)\n this.writeByte((length >> 16) & 0xff)\n this.writeByte((length >> 8) & 0xff)\n this.writeByte(length & 0xff)\n } else {\n throw new Error(`CBOR 不支援 > 2^32 的長度: ${length}`)\n }\n }\n\n /**\n * 遞迴編碼值\n */\n private encodeValue(value: unknown, depth: number): void {\n if (depth > CborFallbackEncoder.MAX_DEPTH) {\n throw new Error(`CBOR 編碼深度超過限制 ${CborFallbackEncoder.MAX_DEPTH}`)\n }\n\n if (value === null) {\n this.writeByte((CBOR_MAJOR_TYPES.SIMPLE << 5) | CBOR_SIMPLE_VALUES.NULL)\n } else if (value === true) {\n this.writeByte((CBOR_MAJOR_TYPES.SIMPLE << 5) | CBOR_SIMPLE_VALUES.TRUE)\n } else if (value === false) {\n this.writeByte((CBOR_MAJOR_TYPES.SIMPLE << 5) | CBOR_SIMPLE_VALUES.FALSE)\n } else if (typeof value === 'number') {\n this.encodeNumber(value)\n } else if (typeof value === 'string') {\n this.encodeString(value)\n } else if (value instanceof Uint8Array) {\n this.encodeBytes(value)\n } else if (Array.isArray(value)) {\n this.encodeArray(value, depth)\n } else if (typeof value === 'object') {\n this.encodeMap(value as Record<string, unknown>, depth)\n } else {\n throw new Error(`CBOR 不支援類型: ${typeof value}`)\n }\n }\n\n /**\n * 編碼整數或浮點數\n * 對於超過 uint32 範圍的整數,使用 float64 編碼(JavaScript 精度限制)\n */\n private encodeNumber(num: number): void {\n // 檢查是否為整數且在 uint32/negint32 範圍內\n if (Number.isInteger(num) && !Object.is(num, -0)) {\n if (num >= 0 && num <= 0xffffffff) {\n this.writeLength(CBOR_MAJOR_TYPES.UINT, num)\n return\n }\n if (num < 0 && -1 - num <= 0xffffffff) {\n this.writeLength(CBOR_MAJOR_TYPES.NEGINT, -1 - num)\n return\n }\n // 超過 32-bit 範圍的整數,降級為 float64\n }\n {\n // 浮點數(float64)\n const bytes = new Uint8Array(9)\n bytes[0] = (CBOR_MAJOR_TYPES.SIMPLE << 5) | CBOR_LENGTH_ENCODING.FLOAT64\n\n // IEEE 754 雙精度大端序\n const view = new DataView(new ArrayBuffer(8))\n view.setFloat64(0, num, false)\n for (let i = 0; i < 8; i++) {\n bytes[i + 1] = view.getUint8(i)\n }\n this.writeBytes(bytes)\n }\n }\n\n /**\n * 編碼字串\n */\n private encodeString(str: string): void {\n const encoder = new TextEncoder()\n const bytes = encoder.encode(str)\n this.writeLength(CBOR_MAJOR_TYPES.TEXT, bytes.length)\n this.writeBytes(bytes)\n }\n\n /**\n * 編碼位元組陣列\n */\n private encodeBytes(bytes: Uint8Array): void {\n this.writeLength(CBOR_MAJOR_TYPES.BYTES, bytes.length)\n this.writeBytes(bytes)\n }\n\n /**\n * 編碼陣列\n */\n private encodeArray(arr: unknown[], depth: number): void {\n this.writeLength(CBOR_MAJOR_TYPES.ARRAY, arr.length)\n for (const item of arr) {\n this.encodeValue(item, depth + 1)\n }\n }\n\n /**\n * 編碼物件(Map)\n */\n private encodeMap(obj: Record<string, unknown>, depth: number): void {\n const keys = Object.keys(obj)\n this.writeLength(CBOR_MAJOR_TYPES.MAP, keys.length)\n for (const key of keys) {\n this.encodeString(key)\n this.encodeValue(obj[key], depth + 1)\n }\n }\n}\n\n/**\n * CBOR 解碼器\n */\nexport class CborFallbackDecoder {\n private static readonly MAX_DEPTH = 16\n private data: Uint8Array\n private offset: number\n\n constructor(data: Uint8Array) {\n this.data = data\n this.offset = 0\n }\n\n /**\n * 解碼 CBOR 資料\n */\n decode(): unknown {\n return this.decodeValue(0)\n }\n\n /**\n * 讀取一個位元組\n */\n private readByte(): number {\n if (this.offset >= this.data.length) {\n throw new Error('CBOR 資料不足')\n }\n return this.data[this.offset++]\n }\n\n /**\n * 讀取固定長度的位元組\n */\n private readBytes(length: number): Uint8Array {\n if (this.offset + length > this.data.length) {\n throw new Error('CBOR 資料不足')\n }\n const result = this.data.slice(this.offset, this.offset + length)\n this.offset += length\n return result\n }\n\n /**\n * 讀取 CBOR 長度\n */\n private readLength(additionalInfo: number): number {\n if (additionalInfo < 24) {\n return additionalInfo\n }\n if (additionalInfo === 24) {\n return this.readByte()\n }\n if (additionalInfo === 25) {\n const b1 = this.readByte()\n const b2 = this.readByte()\n return (b1 << 8) | b2\n }\n if (additionalInfo === 26) {\n const b1 = this.readByte()\n const b2 = this.readByte()\n const b3 = this.readByte()\n const b4 = this.readByte()\n return (b1 << 24) | (b2 << 16) | (b3 << 8) | b4\n }\n if (additionalInfo === 27) {\n // 64-bit,但 JavaScript 無法精確表示,只支援到 2^53\n const high =\n (this.readByte() << 24) | (this.readByte() << 16) | (this.readByte() << 8) | this.readByte()\n const low =\n (this.readByte() << 24) | (this.readByte() << 16) | (this.readByte() << 8) | this.readByte()\n return high * 0x100000000 + low\n }\n throw new Error(`CBOR 無效的長度編碼: ${additionalInfo}`)\n }\n\n /**\n * 遞迴解碼值\n */\n private decodeValue(depth: number): unknown {\n if (depth > CborFallbackDecoder.MAX_DEPTH) {\n throw new Error(`CBOR 解碼深度超過限制 ${CborFallbackDecoder.MAX_DEPTH}`)\n }\n\n const byte = this.readByte()\n const majorType = (byte >> 5) & 0x07\n const additionalInfo = byte & 0x1f\n\n switch (majorType) {\n case CBOR_MAJOR_TYPES.UINT:\n return this.readLength(additionalInfo)\n\n case CBOR_MAJOR_TYPES.NEGINT:\n return -1 - this.readLength(additionalInfo)\n\n case CBOR_MAJOR_TYPES.BYTES: {\n const length = this.readLength(additionalInfo)\n return this.readBytes(length)\n }\n\n case CBOR_MAJOR_TYPES.TEXT: {\n const length = this.readLength(additionalInfo)\n const bytes = this.readBytes(length)\n const decoder = new TextDecoder()\n return decoder.decode(bytes)\n }\n\n case CBOR_MAJOR_TYPES.ARRAY: {\n const length = this.readLength(additionalInfo)\n const result: unknown[] = []\n for (let i = 0; i < length; i++) {\n result.push(this.decodeValue(depth + 1))\n }\n return result\n }\n\n case CBOR_MAJOR_TYPES.MAP: {\n const length = this.readLength(additionalInfo)\n const result: Record<string, unknown> = {}\n for (let i = 0; i < length; i++) {\n const key = this.decodeValue(depth + 1)\n if (typeof key !== 'string') {\n throw new Error(`CBOR Map 的 key 必須是字串,得到: ${typeof key}`)\n }\n result[key] = this.decodeValue(depth + 1)\n }\n return result\n }\n\n case CBOR_MAJOR_TYPES.SIMPLE:\n if (additionalInfo === CBOR_SIMPLE_VALUES.FALSE) {\n return false\n }\n if (additionalInfo === CBOR_SIMPLE_VALUES.TRUE) {\n return true\n }\n if (additionalInfo === CBOR_SIMPLE_VALUES.NULL) {\n return null\n }\n\n // 浮點數\n if (additionalInfo === CBOR_LENGTH_ENCODING.FLOAT32) {\n const bytes = this.readBytes(4)\n const view = new DataView(bytes.buffer, bytes.byteOffset)\n return view.getFloat32(0, false)\n }\n if (additionalInfo === CBOR_LENGTH_ENCODING.FLOAT64) {\n const bytes = this.readBytes(8)\n const view = new DataView(bytes.buffer, bytes.byteOffset)\n return view.getFloat64(0, false)\n }\n\n throw new Error(`CBOR 不支援的 simple value: ${additionalInfo}`)\n\n case CBOR_MAJOR_TYPES.TAG:\n // TAG 類型在此實現中跳過\n return this.decodeValue(depth)\n\n default:\n throw new Error(`CBOR 無效的 major type: ${majorType}`)\n }\n }\n}\n",
54
- "/**\n * 雜湊加速器 JavaScript 回退實現\n * 基於 node:crypto 標準庫\n *\n * 使用場景:\n * - 非 Bun 環境(Node.js、Deno 等)\n * - Bun CryptoHasher 不可用的情況\n *\n * 性能特性:\n * - 短 key (<100 bytes):~1-2x 慢於 Bun.CryptoHasher(N-API 橋接開銷)\n * - 長 payload:差異較小(主要計算時間)\n * - 一致性:與 node:crypto 標準行為完全相同\n */\n\nimport { createHash, createHmac } from 'node:crypto'\nimport type { HashAccelerator } from './types'\n\n/**\n * Node.js crypto 回退實現\n * 適用於非 Bun 環境\n */\nexport class HashFallback implements HashAccelerator {\n /**\n * SHA-256 計算(回退實現)\n * @param input - 輸入(字串或 Uint8Array)\n * @returns 十六進制編碼的 SHA-256 雜湊值\n */\n sha256(input: string | Uint8Array): string {\n return createHash('sha256').update(input).digest('hex')\n }\n\n /**\n * HMAC-SHA256 計算(回退實現)\n * @param key - 密鑰\n * @param data - 要雜湊的數據\n * @returns 十六進制編碼的 HMAC-SHA256 值\n */\n hmacSha256(key: string, data: string): string {\n return createHmac('sha256', key).update(data).digest('hex')\n }\n}\n",
55
- "/**\n * 原生加速器統一入口\n * 遵循 Galaxy Architecture 的運行時自適應模式\n * 與 RuntimeAdapter 模式保持一致\n */\n\nimport { CborFallbackEncoder } from './cbor-fallback'\nimport type { CborAccelerator, NativeAcceleratorStatus } from './types'\n\n/**\n * 原生加速器類別\n * 提供運行時自適應的 CBOR 編碼/解碼加速\n * - 在 Bun 環境下優先使用 C 編譯器實現(bun:ffi)\n * - 在非 Bun 環境或 FFI 不可用時自動降級到 JavaScript 實現\n */\nexport class NativeAccelerator {\n private static readonly DEBUG_ENV = 'GRAVITO_FFI_DEBUG'\n private static readonly DISABLE_ENV = 'GRAVITO_FFI_DISABLE'\n\n /**\n * FFI 可用性緩存\n * null: 未檢測, true: 可用, false: 不可用\n */\n private static available: boolean | null = null\n\n /**\n * 當前加速器實例緩存\n */\n private static cborAccelerator: CborAccelerator | null = null\n\n /**\n * 當前狀態\n */\n private static status: NativeAcceleratorStatus | null = null\n\n /**\n * 檢測原生 FFI 是否可用\n * 偵測邏輯:\n * 1. 檢查 GRAVITO_FFI_DISABLE 環境變數\n * 2. 檢查 Bun 運行時可用性\n * 3. 檢查 bun:ffi 的 cc() 是否可用\n */\n static isAvailable(): boolean {\n if (this.available !== null) {\n return this.available\n }\n\n // 檢查環境變數強制禁用\n if (typeof process !== 'undefined' && process.env) {\n if (process.env[this.DISABLE_ENV] === '1') {\n this.available = false\n return false\n }\n }\n\n // 檢查 Bun 運行時\n try {\n if (typeof Bun === 'undefined') {\n this.available = false\n return false\n }\n\n // 嘗試載入 bun:ffi 的 cc 函數\n const bunFfi = require('bun:ffi')\n if (typeof bunFfi.cc !== 'function') {\n this.available = false\n return false\n }\n\n this.available = true\n return true\n } catch {\n this.available = false\n return false\n }\n }\n\n /**\n * 取得 CBOR 加速器實例\n * 優先使用 Native,失敗則降級到 Fallback\n */\n static getCborAccelerator(): CborAccelerator {\n if (this.cborAccelerator !== null) {\n return this.cborAccelerator\n }\n\n // 嘗試載入原生實現\n if (this.isAvailable()) {\n try {\n const native = this.loadNativeImplementation()\n if (native !== null) {\n this.cborAccelerator = native\n this.updateStatus('bun-ffi')\n return native\n }\n } catch (error) {\n const debugMode = this.isDebugEnabled()\n if (debugMode) {\n console.warn('[GRAVITO_FFI] Native CBOR 載入失敗,降級到 JavaScript 實現:', error)\n }\n // 繼續降級到 Fallback\n }\n }\n\n // 降級到 JavaScript 實現\n const fallback = new CborFallbackEncoder()\n this.cborAccelerator = fallback\n this.updateStatus('js-fallback')\n\n if (this.isDebugEnabled()) {\n console.log('[GRAVITO_FFI] 使用 JavaScript 回退實現')\n }\n\n return fallback\n }\n\n /**\n * 取得加速器狀態\n */\n static getStatus(): NativeAcceleratorStatus {\n // 確保狀態已初始化\n if (this.status === null) {\n this.getCborAccelerator()\n }\n return (\n this.status || {\n available: false,\n runtime: 'js-fallback',\n version: '1.0.0',\n }\n )\n }\n\n /**\n * 重置加速器狀態(用於測試)\n */\n static reset(): void {\n this.available = null\n this.cborAccelerator = null\n this.status = null\n }\n\n /**\n * 解析 C 原始碼路徑\n * 支援從原始碼目錄或 npm 套件的 src/ffi/native 目錄載入\n */\n private static resolveCSourcePath(): string {\n const path = require('node:path')\n const fs = require('node:fs')\n\n // 取得當前模組目錄(ESM 優先,CJS 回退)\n const currentDir =\n typeof import.meta?.dir === 'string' && import.meta.dir !== ''\n ? import.meta.dir\n : typeof __dirname === 'string'\n ? __dirname\n : process.cwd()\n\n // 嘗試多個可能的路徑(開發時 vs 發佈後)\n const candidates = [\n path.resolve(currentDir, 'native', 'cbor.c'),\n path.resolve(currentDir, '..', 'ffi', 'native', 'cbor.c'),\n path.resolve(currentDir, '..', '..', 'src', 'ffi', 'native', 'cbor.c'),\n ]\n\n for (const candidate of candidates) {\n try {\n if (fs.existsSync(candidate)) {\n return candidate\n }\n } catch {}\n }\n\n throw new Error(`C 原始碼檔案未找到,嘗試路徑: ${candidates.join(', ')}`)\n }\n\n /**\n * 載入原生 C 實現\n * 使用 bun:ffi 的 cc() 動態編譯 C 代碼\n * 優先從檔案載入完整實現,避免內聯限制\n */\n private static loadNativeImplementation(): CborAccelerator | null {\n try {\n // 檢查 Bun 運行時\n if (typeof Bun === 'undefined') {\n return null\n }\n\n const bunFfi = require('bun:ffi')\n if (typeof bunFfi.cc !== 'function') {\n return null\n }\n\n // 解析 C 原始碼路徑\n const cSourcePath = this.resolveCSourcePath()\n\n if (this.isDebugEnabled()) {\n console.log(`[GRAVITO_FFI] 載入 C 原始碼: ${cSourcePath}`)\n }\n\n // 使用 bun:ffi 的 cc() 編譯 C 代碼\n // cc() 的 source 參數接受檔案路徑(不是源碼字串)\n const lib = bunFfi.cc({\n source: cSourcePath,\n symbols: {\n gravito_cbor_encode: {\n args: ['ptr', 'usize', 'ptr', 'usize'],\n returns: 'i32',\n },\n gravito_cbor_decode: {\n args: ['ptr', 'usize', 'ptr', 'usize'],\n returns: 'i32',\n },\n },\n })\n\n // cc() 返回 { close, symbols: { ... } }\n return new NativeCborAccelerator(lib.symbols)\n } catch (error) {\n if (this.isDebugEnabled()) {\n console.error('[GRAVITO_FFI] 編譯失敗:', error)\n }\n return null\n }\n }\n\n /**\n * 檢查是否啟用調試模式\n */\n private static isDebugEnabled(): boolean {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[this.DEBUG_ENV] === '1'\n }\n return false\n }\n\n /**\n * 更新狀態\n */\n private static updateStatus(runtime: 'bun-ffi' | 'js-fallback'): void {\n this.status = {\n available: runtime === 'bun-ffi',\n runtime,\n version: runtime === 'bun-ffi' ? 'native-1.0.0' : 'js-fallback-1.0.0',\n }\n }\n}\n\n/**\n * 原生 C CBOR 加速器包裝類\n */\nclass NativeCborAccelerator implements CborAccelerator {\n private symbols: any\n\n constructor(symbols: any) {\n this.symbols = symbols\n }\n\n encode(data: Record<string, unknown>): Uint8Array {\n // 將物件序列化為 JSON\n const json = JSON.stringify(data)\n const jsonBytes = new TextEncoder().encode(json)\n\n // 估算 CBOR 輸出大小(CBOR 通常比 JSON 小 20-40%)\n let outputCapacity = Math.ceil(jsonBytes.length * 1.5)\n const maxAttempts = 3\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const outputBuffer = new Uint8Array(outputCapacity)\n\n // 調用 C 編碼函數\n const result = this.symbols.gravito_cbor_encode(\n jsonBytes,\n jsonBytes.length,\n outputBuffer,\n outputCapacity\n )\n\n if (typeof result !== 'number') {\n throw new Error('FFI 回傳值無效')\n }\n\n if (result > 0) {\n // 成功\n return outputBuffer.slice(0, result)\n }\n\n if (result === -1) {\n // Buffer 不足,擴大重試\n outputCapacity *= 2\n continue\n }\n\n // 其他錯誤\n throw new Error(`CBOR 編碼失敗 (error: ${result})`)\n }\n\n throw new Error(`CBOR 編碼失敗:超過最大重試次數,需要 > ${outputCapacity} 位元組`)\n }\n\n decode(bytes: Uint8Array): Record<string, unknown> {\n // 估算 JSON 輸出大小(JSON 通常比 CBOR 大)\n let jsonCapacity = Math.ceil(bytes.length * 3)\n const maxAttempts = 3\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const jsonBuffer = new Uint8Array(jsonCapacity)\n\n // 調用 C 解碼函數\n const result = this.symbols.gravito_cbor_decode(bytes, bytes.length, jsonBuffer, jsonCapacity)\n\n if (typeof result !== 'number') {\n throw new Error('FFI 回傳值無效')\n }\n\n if (result > 0) {\n // 成功\n const jsonString = new TextDecoder().decode(jsonBuffer.slice(0, result))\n const obj = JSON.parse(jsonString)\n\n if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {\n throw new Error('CBOR 根值必須是物件')\n }\n\n return obj as Record<string, unknown>\n }\n\n if (result === -1) {\n // Buffer 不足,擴大重試\n jsonCapacity *= 2\n continue\n }\n\n // 其他錯誤\n throw new Error(`CBOR 解碼失敗 (error: ${result})`)\n }\n\n throw new Error(`CBOR 解碼失敗:超過最大重試次數,需要 > ${jsonCapacity} 位元組`)\n }\n}\n",
56
- "/**\n * 原生雜湊加速器\n * 運行時自適應實現,遵循 Galaxy Architecture 的設計模式\n *\n * 架構:\n * - 在 Bun 環境:使用 Bun.CryptoHasher(C 實現,高效)\n * - 其他環境:自動降級到 node:crypto\n * - 完全相同的 API 和結果保證\n *\n * 性能:\n * - Bun 環境:2-3x 快於 node:crypto(消除 N-API 開銷)\n * - 跨運行時:完全相容性\n *\n * 應用場景:\n * - FileStore.hashKey() 熱路徑\n * - Encrypter.hash() 加密雜湊\n * - 任何需要高效雜湊計算的地方\n */\n\nimport { HashFallback } from './hash-fallback'\nimport type { HashAccelerator, NativeHasherStatus } from './types'\n\n/**\n * Bun 原生 CryptoHasher 實現\n * 直接使用 Bun.CryptoHasher API\n */\nclass BunCryptoHasher implements HashAccelerator {\n /**\n * SHA-256 計算(Bun 原生)\n * @param input - 輸入(字串或 Uint8Array)\n * @returns 十六進制編碼的 SHA-256 雜湊值\n */\n sha256(input: string | Uint8Array): string {\n return new Bun.CryptoHasher('sha256').update(input).digest('hex')\n }\n\n /**\n * HMAC-SHA256 計算(Bun 原生)\n * Bun.CryptoHasher 第二參數直接支援 HMAC 密鑰\n *\n * @param key - 密鑰\n * @param data - 要雜湊的數據\n * @returns 十六進制編碼的 HMAC-SHA256 值\n */\n hmacSha256(key: string, data: string): string {\n return new Bun.CryptoHasher('sha256', key).update(data).digest('hex')\n }\n}\n\n/**\n * 原生雜湊加速器統一入口\n * 提供運行時自適應的 SHA-256/HMAC-SHA256 計算\n *\n * 使用範例:\n * ```typescript\n * // SHA-256\n * const hash = NativeHasher.sha256('data')\n *\n * // HMAC-SHA256\n * const hmac = NativeHasher.hmacSha256('secret', 'message')\n *\n * // 檢查狀態\n * const status = NativeHasher.getStatus()\n * console.log(`使用: ${status.runtime}`)\n * ```\n */\nexport class NativeHasher {\n /**\n * 當前加速器實例緩存\n */\n private static accelerator: HashAccelerator | null = null\n\n /**\n * 當前狀態緩存\n */\n private static status: NativeHasherStatus | null = null\n\n /**\n * 取得雜湊加速器實例\n * 優先使用 Bun.CryptoHasher,失敗則降級到 node:crypto\n *\n * @returns 雜湊加速器實例\n */\n private static getAccelerator(): HashAccelerator {\n if (this.accelerator !== null) {\n return this.accelerator\n }\n\n // 嘗試使用 Bun 原生實現\n if (this.isBunAvailable()) {\n try {\n this.accelerator = new BunCryptoHasher()\n this.updateStatus('bun-crypto-hasher')\n return this.accelerator\n } catch {\n // 降級到回退實現\n }\n }\n\n // 降級到 node:crypto 回退\n this.accelerator = new HashFallback()\n this.updateStatus('node-crypto')\n return this.accelerator\n }\n\n /**\n * 檢測 Bun 運行時和 CryptoHasher 可用性\n *\n * @returns Bun.CryptoHasher 是否可用\n */\n private static isBunAvailable(): boolean {\n try {\n return typeof Bun !== 'undefined' && typeof Bun.CryptoHasher === 'function'\n } catch {\n return false\n }\n }\n\n /**\n * 更新狀態\n *\n * @param runtime - 當前使用的運行時\n */\n private static updateStatus(runtime: 'bun-crypto-hasher' | 'node-crypto'): void {\n this.status = {\n available: runtime === 'bun-crypto-hasher',\n runtime,\n }\n }\n\n /**\n * 計算 SHA-256 雜湊\n * 支援字串和二進制輸入\n *\n * @param input - 要雜湊的數據(字串或 Uint8Array)\n * @returns 十六進制編碼的 SHA-256 雜湊值(64 字元)\n *\n * @example\n * ```typescript\n * const hash = NativeHasher.sha256('hello')\n * // '2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824'\n *\n * // 支援 Uint8Array\n * const bytes = new TextEncoder().encode('hello')\n * const hash2 = NativeHasher.sha256(bytes)\n * // 相同結果\n * ```\n */\n static sha256(input: string | Uint8Array): string {\n return this.getAccelerator().sha256(input)\n }\n\n /**\n * 計算 HMAC-SHA256\n * 用於認證消息完整性\n *\n * @param key - HMAC 密鑰\n * @param data - 要雜湊的數據\n * @returns 十六進制編碼的 HMAC-SHA256 值(64 字元)\n *\n * @example\n * ```typescript\n * const hmac = NativeHasher.hmacSha256('secret', 'message')\n * // '8b1a9953c4611296aed9e132b8502cf413b1b881fed3e8d26ab'...\n *\n * // 適用於加密驗證\n * const iv = Buffer.from('...').toString('base64')\n * const encrypted = '...'\n * const mac = NativeHasher.hmacSha256(key, iv + encrypted)\n * ```\n */\n static hmacSha256(key: string, data: string): string {\n return this.getAccelerator().hmacSha256(key, data)\n }\n\n /**\n * 取得加速器狀態\n * 用於診斷和性能監測\n *\n * @returns 加速器狀態報告\n *\n * @example\n * ```typescript\n * const status = NativeHasher.getStatus()\n * console.log(`可用: ${status.available}`)\n * console.log(`運行時: ${status.runtime}`)\n *\n * // 條件邏輯\n * if (status.runtime === 'bun-crypto-hasher') {\n * console.log('使用 Bun 原生實現(高效)')\n * } else {\n * console.log('使用 node:crypto(相容性回退)')\n * }\n * ```\n */\n static getStatus(): NativeHasherStatus {\n // 確保狀態已初始化\n if (this.status === null) {\n this.getAccelerator()\n }\n\n return (\n this.status || {\n available: false,\n runtime: 'node-crypto',\n }\n )\n }\n\n /**\n * 重置加速器狀態\n * 主要用於測試目的,允許重新初始化運行時檢測\n *\n * @internal\n * @example\n * ```typescript\n * // 測試中\n * NativeHasher.reset()\n * // 下一次呼叫會重新偵測運行時\n * const status = NativeHasher.getStatus()\n * ```\n */\n static reset(): void {\n this.accelerator = null\n this.status = null\n }\n}\n",
57
- "import type { HttpMethod } from '../../http/types'\nimport { NodeType, type RouteHandler } from './types'\n\n/**\n * Node in the Radix Router tree.\n * @internal\n */\nexport class RadixNode {\n // Path segment for this node (e.g., \"users\", \":id\")\n public segment: string\n\n // Node type (Static, Param, Wildcard)\n public type: NodeType\n\n // Children nodes (mapped by segment for fast lookup)\n public children: Map<string, RadixNode> = new Map()\n\n // Specialized child for parameter node (only one per level allowed usually to avoid ambiguity, though some routers support multiple)\n public paramChild: RadixNode | null = null\n\n // Specialized child for wildcard node\n public wildcardChild: RadixNode | null = null\n\n // Handlers registered at this node (keyed by HTTP method)\n public handlers: Map<HttpMethod, RouteHandler[]> = new Map()\n\n // Parameter name if this is a PARAM node (e.g., \"id\" for \":id\")\n public paramName: string | null = null\n\n // Parameter constraints (regex) - only applicable if this is a PARAM node\n // If we support per-route constraints, they might need to be stored differently,\n // but for now assume constraints are defined at node level (uncommon) or checked at match time.\n // Laravel allows global pattern constraints or per-route.\n // Ideally, constraints should be stored with the handler or part of matching logic.\n // For a Radix tree, if we have constraints, we might need to backtrack if constraint fails?\n // Or simply store constraint with the param node.\n public regex: RegExp | null = null\n\n constructor(segment = '', type: NodeType = NodeType.STATIC) {\n this.segment = segment\n this.type = type\n }\n\n toJSON(): any {\n return {\n segment: this.segment,\n type: this.type,\n children: Array.from(this.children.entries()).map(([k, v]) => [k, v.toJSON()]),\n paramChild: this.paramChild?.toJSON() || null,\n wildcardChild: this.wildcardChild?.toJSON() || null,\n paramName: this.paramName,\n regex: this.regex ? this.regex.source : null,\n }\n }\n\n static fromJSON(json: any): RadixNode {\n const node = new RadixNode(json.segment, json.type)\n node.paramName = json.paramName\n if (json.regex) {\n node.regex = new RegExp(json.regex)\n }\n if (json.children) {\n for (const [key, childJson] of json.children) {\n node.children.set(key, RadixNode.fromJSON(childJson))\n }\n }\n if (json.paramChild) {\n node.paramChild = RadixNode.fromJSON(json.paramChild)\n }\n if (json.wildcardChild) {\n node.wildcardChild = RadixNode.fromJSON(json.wildcardChild)\n }\n return node\n }\n}\n",
58
- "import type { HttpMethod } from '../../http/types'\nimport { RadixNode } from './RadixNode'\nimport { NodeType, type RouteHandler, type RouteMatch } from './types'\n\n/**\n * Simple LRU Cache for route matching\n * @internal\n */\nclass RouteCache {\n private cache = new Map<string, RouteMatch | null>()\n private readonly maxSize = 10000\n\n get(key: string): RouteMatch | null | undefined {\n return this.cache.get(key)\n }\n\n set(key: string, value: RouteMatch | null): void {\n if (this.cache.size >= this.maxSize) {\n // Remove first (oldest) entry\n const firstKey = this.cache.keys().next().value\n if (firstKey) {\n this.cache.delete(firstKey)\n }\n }\n this.cache.set(key, value)\n }\n\n clear(): void {\n this.cache.clear()\n }\n\n has(key: string): boolean {\n return this.cache.has(key)\n }\n}\n\n/**\n * High-performance Radix Tree Router for Bun\n */\nexport class RadixRouter {\n private root: RadixNode = new RadixNode()\n\n // Global parameter constraints (e.g., id => /^\\d+$/)\n private globalConstraints: Map<string, RegExp> = new Map()\n\n // Route cache (P2 optimization)\n private routeCache = new RouteCache()\n\n /**\n * Add a generic parameter constraint\n */\n where(param: string, regex: RegExp): void {\n this.globalConstraints.set(param, regex)\n }\n\n /**\n * Register a route\n */\n add(method: HttpMethod, path: string, handlers: RouteHandler[]): void {\n let node = this.root\n const segments = this.splitPath(path)\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]!\n\n // Determine node type\n if (segment === '*') {\n // Wildcard\n if (!node.wildcardChild) {\n node.wildcardChild = new RadixNode('*', NodeType.WILDCARD)\n }\n node = node.wildcardChild\n break\n } else if (segment.startsWith(':')) {\n // Parameter\n const paramName = segment.slice(1)\n if (!node.paramChild) {\n const child = new RadixNode(segment, NodeType.PARAM)\n child.paramName = paramName\n // Apply global constraint if exists\n const constraint = this.globalConstraints.get(paramName)\n if (constraint) {\n child.regex = constraint\n }\n node.paramChild = child\n }\n node = node.paramChild!\n } else {\n // Static\n if (!node.children.has(segment)) {\n node.children.set(segment, new RadixNode(segment, NodeType.STATIC))\n }\n node = node.children.get(segment)!\n }\n }\n\n // Ensure we store handlers for lowercase method\n node.handlers.set(method.toLowerCase() as HttpMethod, handlers)\n\n // P2 optimization: Clear cache when new route added\n this.routeCache.clear()\n }\n\n /**\n * Match a request\n */\n match(method: string, path: string): RouteMatch | null {\n const normalizedMethod = method.toLowerCase() as HttpMethod\n\n // Fast path for root\n if (path === '/' || path === '') {\n const handlers = this.root.handlers.get(normalizedMethod)\n if (handlers) {\n return { handlers, params: {} }\n }\n return null\n }\n\n // P2 optimization: Check route cache first\n const cacheKey = `${normalizedMethod}:${path}`\n if (this.routeCache.has(cacheKey)) {\n return this.routeCache.get(cacheKey) ?? null\n }\n\n // Removing leading slash for faster segmenting\n const searchPath = path.startsWith('/') ? path.slice(1) : path\n const segments = searchPath.split('/')\n\n const result = this.matchRecursive(this.root, segments, 0, {}, normalizedMethod)\n\n // P2 optimization: Cache the result\n this.routeCache.set(cacheKey, result)\n\n return result\n }\n\n private matchRecursive(\n node: RadixNode,\n segments: string[],\n depth: number,\n params: Record<string, string>,\n method: HttpMethod\n ): RouteMatch | null {\n // 1. Check if we reached end of path\n if (depth >= segments.length) {\n let handlers = node.handlers.get(method)\n if (!handlers) {\n handlers = node.handlers.get('all' as HttpMethod)\n }\n if (handlers) {\n return { handlers, params }\n }\n return null\n }\n\n const segment = segments[depth]!\n\n // 2. Try Static Match\n const staticChild = node.children.get(segment)\n if (staticChild) {\n const match = this.matchRecursive(staticChild, segments, depth + 1, params, method)\n if (match) {\n return match\n }\n }\n\n // 3. Try Param Match\n const paramChild = node.paramChild\n if (paramChild) {\n // Check constraints\n if (paramChild.regex && !paramChild.regex.test(segment)) {\n // Constraint failed, continue to wildcard\n } else {\n // Capture param\n if (paramChild.paramName) {\n params[paramChild.paramName] = decodeURIComponent(segment)\n const match = this.matchRecursive(paramChild, segments, depth + 1, params, method)\n if (match) {\n return match\n }\n // Backtrack\n delete params[paramChild.paramName]\n }\n }\n }\n\n // 4. Try Wildcard Match\n if (node.wildcardChild) {\n let handlers = node.wildcardChild.handlers.get(method)\n if (!handlers) {\n handlers = node.wildcardChild.handlers.get('all' as HttpMethod)\n }\n if (handlers) {\n return { handlers, params }\n }\n }\n\n return null\n }\n\n private splitPath(path: string): string[] {\n if (path === '/' || path === '') {\n return []\n }\n let p = path\n if (p.startsWith('/')) {\n p = p.slice(1)\n }\n if (p.endsWith('/')) {\n p = p.slice(0, -1)\n }\n return p.split('/')\n }\n\n /**\n * Serialize the router to a JSON string\n */\n serialize(): string {\n return JSON.stringify({\n root: this.root.toJSON(),\n globalConstraints: Array.from(this.globalConstraints.entries()).map(([k, v]) => [\n k,\n v.source,\n ]),\n })\n }\n\n /**\n * Restore a router from a serialized JSON string\n */\n static fromSerialized(json: string): RadixRouter {\n const data = JSON.parse(json)\n const router = new RadixRouter()\n\n router.root = RadixNode.fromJSON(data.root)\n\n if (data.globalConstraints) {\n for (const [key, source] of data.globalConstraints) {\n router.globalConstraints.set(key, new RegExp(source))\n }\n }\n\n return router\n }\n}\n",
59
- "/**\n * @fileoverview AOT (Ahead-of-Time) Router\n *\n * Hybrid routing strategy:\n * - Static routes: O(1) Map lookup\n * - Dynamic routes: Optimized Radix Tree\n *\n * The key optimization is separating static from dynamic routes at registration time,\n * not at match time. This eliminates unnecessary tree traversal for static paths.\n *\n * @module @gravito/core/engine\n */\n\nimport { RadixRouter } from '../adapters/bun/RadixRouter'\nimport type { HttpMethod } from '../http/types'\nimport type { Handler, Middleware, RouteMatch, RouteMetadata } from './types'\n\n/**\n * Route definition for re-playing routes (mounting)\n */\ninterface RouteDefinition {\n method: HttpMethod\n path: string\n handler: Handler\n middleware: Middleware[]\n}\n\n/**\n * AOT Router - Optimized for Bun\n */\nexport class AOTRouter {\n // Static route cache: \"METHOD:PATH\" -> RouteMetadata\n /** @internal */\n public readonly staticRoutes = new Map<string, RouteMetadata>()\n\n // Dynamic route handler (Radix Tree)\n private dynamicRouter = new RadixRouter()\n\n // Store all route definitions to support mounting/merging\n /** @internal */\n public readonly routeDefinitions: RouteDefinition[] = []\n\n // Global middleware (applies to all routes)\n /** @internal */\n public readonly globalMiddleware: Middleware[] = []\n\n // Path-based middleware: pattern -> middleware[]\n /** @internal */\n public readonly pathMiddleware = new Map<string, Middleware[]>()\n\n // Dynamic route patterns: handler function -> route pattern\n // 用於追蹤動態路由的模式,防止高基數問題\n private dynamicRoutePatterns = new Map<Function, string>()\n\n private middlewareCache = new Map<string, { data: Middleware[]; version: number }>()\n private cacheMaxSize = 1000\n private _version = 0\n\n /**\n * Get the current version for cache invalidation\n * Incremented whenever middleware or routes are modified\n */\n public get version(): number {\n return this._version\n }\n\n /**\n * Register a route\n *\n * Automatically determines if route is static or dynamic.\n * Static routes are stored in a Map for O(1) lookup.\n * Dynamic routes use the Radix Tree.\n *\n * @param method - HTTP method\n * @param path - Route path\n * @param handler - Route handler\n * @param middleware - Route-specific middleware\n */\n add(method: HttpMethod, path: string, handler: Handler, middleware: Middleware[] = []): void {\n // Store definition for mounting support\n this.routeDefinitions.push({ method, path, handler, middleware })\n\n const normalizedMethod = method.toLowerCase() as HttpMethod\n\n if (this.isStaticPath(path)) {\n // Static route - use Map\n const key = `${normalizedMethod}:${path}`\n this.staticRoutes.set(key, { handler, middleware })\n } else {\n // Dynamic route - use Radix Tree\n // Wrap handler to match our Handler type\n const wrappedHandler = handler as unknown as Function\n this.dynamicRouter.add(normalizedMethod, path, [wrappedHandler])\n\n // Store route pattern for this handler\n this.dynamicRoutePatterns.set(wrappedHandler, path)\n\n // Store middleware separately\n if (middleware.length > 0) {\n this.pathMiddleware.set(`${normalizedMethod}:${path}`, middleware)\n }\n }\n }\n\n /**\n * Mount another router at a prefix\n */\n mount(prefix: string, other: AOTRouter): void {\n // 1. Convert other's global middleware to pattern middleware\n if (other.globalMiddleware.length > 0) {\n // Apply to both /prefix and /prefix/*\n this.usePattern(prefix, ...other.globalMiddleware)\n\n const wildcard = prefix === '/' ? '/*' : `${prefix}/*`\n this.usePattern(wildcard, ...other.globalMiddleware)\n }\n\n // 2. Transfer pattern-based middleware (only user-defined patterns, not route-specific)\n for (const [pattern, mws] of other.pathMiddleware) {\n // Skip route-specific middleware entries (they have method prefix like \"get:/path/:id\")\n // These are stored by add() with format \"method:path\"\n const hasMethodPrefix = /^(get|post|put|delete|patch|options|head):/.test(pattern)\n if (hasMethodPrefix) {\n continue\n }\n\n // Normalize pattern\n let newPattern: string\n if (pattern === '*') {\n newPattern = prefix === '/' ? '/*' : `${prefix}/*`\n } else if (pattern.startsWith('/')) {\n newPattern = prefix === '/' ? pattern : `${prefix}${pattern}`\n } else {\n newPattern = prefix === '/' ? `/${pattern}` : `${prefix}/${pattern}`\n }\n\n this.usePattern(newPattern, ...mws)\n }\n\n // 3. Transfer all routes\n for (const def of other.routeDefinitions) {\n // Calculate new path\n let newPath: string\n if (prefix === '/') {\n newPath = def.path\n } else if (def.path === '/') {\n newPath = prefix\n } else {\n newPath = `${prefix}${def.path}`\n }\n\n this.add(def.method, newPath, def.handler, def.middleware)\n }\n }\n\n /**\n * Add global middleware\n *\n * These run for every request, before route-specific middleware.\n *\n * @param middleware - Middleware functions\n */\n use(...middleware: Middleware[]): void {\n this.globalMiddleware.push(...middleware)\n this._version++\n }\n\n /**\n * Add path-based middleware\n *\n * Supports wildcard patterns like '/api/*'\n *\n * @param pattern - Path pattern\n * @param middleware - Middleware functions\n */\n usePattern(pattern: string, ...middleware: Middleware[]): void {\n // Special case: '*' pattern should be treated as global middleware\n if (pattern === '*') {\n this.globalMiddleware.push(...middleware)\n } else {\n const existing = this.pathMiddleware.get(pattern) ?? []\n this.pathMiddleware.set(pattern, [...existing, ...middleware])\n }\n this._version++\n }\n\n /**\n * Match a request to a route\n *\n * Returns the handler, params, and all applicable middleware.\n *\n * @param method - HTTP method\n * @param path - Request path\n * @returns Route match or null if not found\n */\n match(method: string, path: string): RouteMatch {\n const normalizedMethod = method.toLowerCase() as HttpMethod\n\n // Try static route first (O(1))\n const staticKey = `${normalizedMethod}:${path}`\n const staticRoute = this.staticRoutes.get(staticKey)\n\n if (staticRoute) {\n return {\n handler: staticRoute.handler,\n params: {},\n middleware: this.collectMiddleware(path, staticRoute.middleware),\n routePattern: path,\n }\n }\n\n // Try dynamic route (Radix Tree)\n const match = this.dynamicRouter.match(normalizedMethod, path)\n\n if (match && match.handlers.length > 0) {\n const handler = match.handlers[0] as unknown as Handler\n const wrappedHandler = match.handlers[0]\n\n // 從 Map 中取得路由模式\n const routePattern = this.dynamicRoutePatterns.get(wrappedHandler)\n const routeKey = routePattern ? `${normalizedMethod}:${routePattern}` : null\n const routeMiddleware = routeKey ? (this.pathMiddleware.get(routeKey) ?? []) : []\n\n return {\n handler,\n params: match.params,\n middleware: this.collectMiddleware(path, routeMiddleware),\n routePattern,\n }\n }\n\n // No match\n return {\n handler: null,\n params: {},\n middleware: [],\n }\n }\n\n /**\n * Public wrapper for collectMiddleware (used by Gravito for optimization)\n */\n collectMiddlewarePublic(path: string, routeMiddleware: Middleware[]): Middleware[] {\n return this.collectMiddleware(path, routeMiddleware)\n }\n\n /**\n * Collect all applicable middleware for a path\n *\n * Order: global -> pattern-based -> route-specific\n *\n * @param path - Request path\n * @param routeMiddleware - Route-specific middleware\n * @returns Combined middleware array\n */\n private collectMiddleware(path: string, routeMiddleware: Middleware[]): Middleware[] {\n // Fast path: no middleware at all\n if (\n this.globalMiddleware.length === 0 &&\n this.pathMiddleware.size === 0 &&\n routeMiddleware.length === 0\n ) {\n return []\n }\n\n // Optimized cache key: use path directly for O(1) lookups\n // Cache format: path -> { middleware array, version }\n const cacheKey = path\n const cached = this.middlewareCache.get(cacheKey)\n\n // Cache hit: return immediately (same path gets same middleware)\n if (cached !== undefined && cached.version === this._version) {\n return cached.data\n }\n\n const middleware: Middleware[] = []\n\n // 1. Global middleware (most common case)\n if (this.globalMiddleware.length > 0) {\n middleware.push(...this.globalMiddleware)\n }\n\n // 2. Pattern-based middleware (check only if pathMiddleware exists)\n if (this.pathMiddleware.size > 0) {\n for (const [pattern, mw] of this.pathMiddleware) {\n // Skip route-specific entries (they have method prefix)\n if (pattern.includes(':')) {\n continue\n }\n\n if (this.matchPattern(pattern, path)) {\n middleware.push(...mw)\n }\n }\n }\n\n // 3. Route-specific middleware\n if (routeMiddleware.length > 0) {\n middleware.push(...routeMiddleware)\n }\n\n // LRU cache: only cache if under max size\n if (this.middlewareCache.size < this.cacheMaxSize) {\n this.middlewareCache.set(cacheKey, { data: middleware, version: this._version })\n } else if (this.middlewareCache.has(cacheKey)) {\n // Update existing cache entry\n this.middlewareCache.set(cacheKey, { data: middleware, version: this._version })\n }\n\n return middleware\n }\n\n /**\n * Get all static routes optimized for Bun's native router.\n *\n * Unlike basic offloading, this version supports routes with middleware\n * by pre-compiling the middleware chain into a single native handler.\n *\n * @param onMatch - Factory to wrap handler and middleware into a Bun-compatible function\n * @returns Record of path -> Handler (Bun-compatible)\n */\n getNativeRoutes(\n onMatch: (\n handler: Handler,\n middleware: Middleware[],\n path: string\n ) => (req: Request) => Response | Promise<Response>\n ): Record<string, any> {\n const routes: Record<string, any> = {}\n\n for (const [key, metadata] of this.staticRoutes) {\n const [method, path] = key.split(':')\n if (method !== 'get') {\n continue // Bun's native routes primarily focus on GET for Response objects\n }\n\n // Collect all applicable middleware (Global + Pattern + Route-specific)\n const allMiddleware = this.collectMiddleware(path!, metadata.middleware)\n\n // Map to Bun's native router format\n // The middleware chain is compiled and wrapped by the caller (Gravito)\n routes[path!] = onMatch(metadata.handler, allMiddleware, path!)\n }\n\n return routes\n }\n\n /**\n * Check if a path is static (no parameters or wildcards)\n */\n private isStaticPath(path: string): boolean {\n return !path.includes(':') && !path.includes('*')\n }\n\n /**\n * Match a pattern against a path\n *\n * Supports:\n * - Exact match: '/api/users'\n * - Wildcard suffix: '/api/*'\n *\n * @param pattern - Pattern to match\n * @param path - Path to test\n * @returns True if pattern matches\n */\n private matchPattern(pattern: string, path: string): boolean {\n if (pattern === '*') {\n return true\n }\n if (pattern === path) {\n return true\n }\n\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n return path.startsWith(prefix)\n }\n\n return false\n }\n\n /**\n * Get all registered routes (for debugging)\n */\n getRoutes(): Array<{ method: string; path: string; type: 'static' | 'dynamic' }> {\n const routes: Array<{ method: string; path: string; type: 'static' | 'dynamic' }> = []\n\n // Static routes\n for (const key of this.staticRoutes.keys()) {\n const [method, path] = key.split(':')\n routes.push({ method: method!, path: path!, type: 'static' })\n }\n\n // Dynamic routes (harder to enumerate from Radix Tree)\n // For now, we'll skip this - it's mainly for debugging anyway\n\n return routes\n }\n}\n",
60
- "/**\n * @fileoverview Transpiler 工具庫 - AST 層級代碼分析\n *\n * 使用 Bun.Transpiler API 進行精確的 handler 函式分析,\n * 相比傳統字串匹配,精確度從 ~85% 提升至 ~99%。\n *\n * 核心策略:\n * 1. 使用 transformSync() 標準化代碼格式(統一縮排、引號等)\n * 2. 對轉換後的代碼使用精確的正規表達式匹配 member expression\n * 3. 區分 API 呼叫(.req.header())與變數名稱(const header = ...)\n * 4. 支援解構賦值模式(const { header } = ctx.req)\n * 5. 快取 Transpiler 實例(性能提升 5.9x)+ LRU 快取結果(額外 128x)\n *\n * @module @gravito/core/transpiler-utils\n * @since 3.1.0\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Transpiler 快取類別\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Transpiler 分析結果的快取鍵對應值\n * 儲存轉換後的代碼字串\n */\ninterface TranspilerCacheEntry {\n /** 轉換後的標準化代碼 */\n transformed: string\n /** 快取建立時間(ms,用於 TTL 過期) */\n createdAt: number\n}\n\n/**\n * TranspilerCache - 管理 Bun.Transpiler 實例與結果快取\n *\n * 避免重複建立 Transpiler(每次建立約需 40µs),\n * 並快取 transformSync 結果(重用快取比每次 transform 快 128x)。\n *\n * @example\n * ```typescript\n * const cache = TranspilerCache.getInstance()\n * const transformed = cache.transform(handlerSource)\n * ```\n */\nexport class TranspilerCache {\n private static instance: TranspilerCache | null = null\n\n /** 共享的 Bun.Transpiler 實例(避免重複建立) */\n private readonly transpiler: Bun.Transpiler\n\n /** LRU 快取:原始代碼 → 轉換結果 */\n private readonly cache: Map<string, TranspilerCacheEntry>\n\n /** 快取大小上限 */\n private readonly maxSize: number\n\n /** 快取 TTL(毫秒),預設 5 分鐘 */\n private readonly ttlMs: number\n\n private constructor(maxSize = 512, ttlMs = 5 * 60 * 1000) {\n // 使用 'ts' loader 以支援 TypeScript 語法\n this.transpiler = new Bun.Transpiler({ loader: 'ts' })\n this.cache = new Map()\n this.maxSize = maxSize\n this.ttlMs = ttlMs\n }\n\n /**\n * 取得單例實例\n * 確保全程只建立一個 Transpiler 實例\n */\n static getInstance(): TranspilerCache {\n TranspilerCache.instance ??= new TranspilerCache()\n return TranspilerCache.instance\n }\n\n /**\n * 重置單例(主要用於測試)\n */\n static resetInstance(): void {\n TranspilerCache.instance = null\n }\n\n /**\n * 轉換代碼並快取結果\n *\n * 先嘗試從快取取得,若未命中則呼叫 transformSync 並儲存結果。\n * 快取已滿時淘汰最舊的條目(近似 LRU)。\n *\n * 處理兩個 Bun.Transpiler 邊緣案例:\n * 1. 箭頭函式表達式:`async (ctx) => ...` → transformSync 返回空字串\n * 解法:包裝成 `const __fn = <source>` 後再轉換\n * 2. 匿名函式表達式:`function(ctx) {...}` → transformSync 拋出 Parse error\n * 解法:同樣包裝後轉換\n *\n * @param source - 原始 handler 函式字串\n * @returns 轉換後的標準化代碼,若完全失敗則回傳 null\n */\n transform(source: string): string | null {\n // 1. 快取命中\n const cached = this.cache.get(source)\n if (cached !== undefined) {\n // 檢查 TTL\n if (Date.now() - cached.createdAt < this.ttlMs) {\n return cached.transformed\n }\n // 過期,移除\n this.cache.delete(source)\n }\n\n // 2. 執行 transform(含邊緣案例處理)\n const transformed = this.doTransform(source)\n if (transformed === null) {\n // 完全失敗,不快取,讓呼叫方 fallback\n return null\n }\n\n // 3. 淘汰舊條目(若已達上限)\n if (this.cache.size >= this.maxSize) {\n // 刪除最舊的條目(Map 迭代順序即插入順序)\n const firstKey = this.cache.keys().next().value\n if (firstKey !== undefined) {\n this.cache.delete(firstKey)\n }\n }\n\n // 4. 存入快取\n this.cache.set(source, { transformed, createdAt: Date.now() })\n return transformed\n }\n\n /**\n * 實際執行 transformSync,處理箭頭函式和匿名函式的邊緣案例\n *\n * @param source - 原始代碼字串\n * @returns 轉換後的代碼,或失敗時回傳 null\n */\n private doTransform(source: string): string | null {\n // 嘗試直接 transform\n try {\n const out = this.transpiler.transformSync(source)\n // 若輸出非空,直接使用(named function / async function 正常情況)\n if (out.trim().length > 0) {\n return out\n }\n // 空字串輸出 = 箭頭函式表達式(如 `async (ctx) => ctx.json({})`)\n // 嘗試包裝後再 transform\n return this.transformWrapped(source)\n } catch {\n // Parse error = 匿名函式表達式(如 `function(ctx) {...}`)\n // 嘗試包裝後再 transform\n return this.transformWrapped(source)\n }\n }\n\n /**\n * 將代碼包裝成賦值語句後再 transform\n *\n * 用於處理無法直接 transform 的函式表達式。\n * 包裝格式:`const __fn = <source>`\n *\n * @param source - 原始函式字串\n * @returns 包裝後的轉換結果,或失敗時回傳 null\n */\n private transformWrapped(source: string): string | null {\n try {\n const wrapped = `const __fn = ${source}`\n const out = this.transpiler.transformSync(wrapped)\n return out.trim().length > 0 ? out : null\n } catch {\n return null\n }\n }\n\n /**\n * 取得目前快取大小\n */\n get size(): number {\n return this.cache.size\n }\n\n /**\n * 清除所有快取條目\n */\n clear(): void {\n this.cache.clear()\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 精確模式偵測正規表達式\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 所有偵測模式集中定義,方便維護與測試\n *\n * 設計原則:\n * - Member access: 匹配 `.req.<方法名>(` 形式(函式呼叫)\n * - Destructure: 匹配 `{ <屬性名> } = <任意>.<req前綴>` 形式(解構賦值)\n * - 排除字串賦值:轉換後的字串賦值格式為 `= \"...\"` 或 `= '...'`,\n * 正規表達式只匹配 `.req.` 開頭的 member access,因此自然排除\n */\nconst PATTERNS = {\n /**\n * 偵測 headers/header 的成員存取\n *\n * 匹配:\n * - `.req.header(` 或 `.req.headers(`\n * - `{ header } = *.req` 或 `{ headers } = *.req`\n */\n HEADERS_CALL: /\\.req\\.headers?\\s*\\(/,\n HEADERS_DESTR: /\\{[^}]*\\bheaders?\\b[^}]*\\}\\s*=\\s*\\w+\\.req/,\n\n /**\n * 偵測 query/queries 的成員存取\n *\n * 匹配:\n * - `.req.query(` 或 `.req.queries(`\n * - `{ query } = *.req` 或 `{ queries } = *.req`\n */\n QUERY_CALL: /\\.req\\.quer(?:y|ies)\\s*\\(/,\n QUERY_DESTR: /\\{[^}]*\\bquer(?:y|ies)\\b[^}]*\\}\\s*=\\s*\\w+\\.req/,\n\n /**\n * 偵測 body 相關的成員存取\n *\n * 匹配:\n * - `.req.json(` `.req.text(` `.req.formData(` `.req.blob(` `.req.arrayBuffer(`\n * - `{ body } = *.req`\n * - `.req.body`(直接屬性存取)\n */\n BODY_CALL: /\\.req\\.(?:json|text|formData|blob|arrayBuffer)\\s*\\(/,\n BODY_DESTR: /\\{[^}]*\\bbody\\b[^}]*\\}\\s*=\\s*\\w+\\.req/,\n BODY_PROP: /\\.req\\.body\\b/,\n\n /**\n * 偵測 param/params 的成員存取\n *\n * 匹配:\n * - `.req.param(` 或 `.req.params(`\n * - `{ param } = *.req` 或 `{ params } = *.req`\n */\n PARAMS_CALL: /\\.req\\.params?\\s*\\(/,\n PARAMS_DESTR: /\\{[^}]*\\bparams?\\b[^}]*\\}\\s*=\\s*\\w+\\.req/,\n\n /**\n * 偵測非同步函式(用於原始碼)\n *\n * 直接匹配原始碼中的 async 關鍵字。\n * 注意:isAsync 不用 transformSync 結果,因為:\n * 1. 箭頭函式 `async (ctx) => ...` 的 transformSync 返回空字串\n * 2. `async` 關鍵字本身不存在假陽性問題(沒有 API 叫做 async)\n *\n * 匹配:\n * - `async function` - async 具名/匿名函式\n * - `async (` - async 箭頭函式(括號形式)\n * - `async ctx` - async 箭頭函式(無括號單參數)\n */\n IS_ASYNC: /\\basync\\b/,\n} as const\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 核心分析函式\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Transpiler 分析的返回結果\n * 與 HandlerAnalysis 介面對應\n */\nexport interface TranspilerAnalysisResult {\n usesHeaders: boolean\n usesQuery: boolean\n usesBody: boolean\n usesParams: boolean\n isAsync: boolean\n}\n\n/**\n * 使用 Bun.Transpiler 進行精確的 handler 靜態分析\n *\n * 相比字串匹配,此函式能正確區分:\n * - API 呼叫(`ctx.req.header(name)`)vs 變數名稱(`const header = '...'`)\n * - 解構賦值(`const { header } = ctx.req`)\n * - Minified 代碼(transformSync 先標準化)\n * - 箭頭函式與匿名函式(包裝策略處理 Bun.Transpiler 邊緣案例)\n *\n * 若 Transpiler 轉換失敗,會自動 fallback 到字串匹配模式。\n *\n * ## isAsync 特殊處理\n *\n * `isAsync` 直接從原始碼偵測 `async` 關鍵字,而不是從 transformSync 結果:\n * - 箭頭函式 `async (ctx) => ...` 的 transformSync 返回空字串\n * - `async` 關鍵字本身不存在假陽性問題\n *\n * @param source - handler 函式的字串表示(通常來自 handler.toString())\n * @returns 分析結果,或在 fallback 模式下的近似結果\n *\n * @example\n * ```typescript\n * const handler = async (ctx) => {\n * const name = ctx.req.query('name')\n * return ctx.json({ name })\n * }\n * const result = analyzeHandlerWithTranspiler(handler.toString())\n * // result.usesQuery === true\n * // result.usesHeaders === false(即使有 'header' 字串,也不會誤判)\n * // result.isAsync === true(即使是箭頭函式也能正確偵測)\n * ```\n */\nexport function analyzeHandlerWithTranspiler(source: string): TranspilerAnalysisResult {\n const cache = TranspilerCache.getInstance()\n const transformed = cache.transform(source)\n\n // isAsync 直接從原始碼偵測(不依賴 transformSync 結果)\n // 因為箭頭函式的 transformSync 返回空字串,且 async 關鍵字無假陽性問題\n const isAsync = PATTERNS.IS_ASYNC.test(source)\n\n // 若 Transpiler 成功,使用精確的 AST 級別模式分析其他屬性\n if (transformed !== null) {\n return { ...analyzeTransformedCode(transformed), isAsync }\n }\n\n // Fallback:Transpiler 失敗時使用字串匹配(保守估計)\n return { ...fallbackStringAnalysis(source), isAsync }\n}\n\n/**\n * 對 Transpiler 轉換後的代碼進行精確模式分析(不含 isAsync)\n *\n * @param code - transformSync() 返回的標準化代碼\n * @returns 分析結果(isAsync 由呼叫方根據原始碼設定)\n */\nfunction analyzeTransformedCode(\n code: string\n): Omit<TranspilerAnalysisResult, 'isAsync'> & { isAsync: boolean } {\n return {\n usesHeaders: PATTERNS.HEADERS_CALL.test(code) || PATTERNS.HEADERS_DESTR.test(code),\n usesQuery: PATTERNS.QUERY_CALL.test(code) || PATTERNS.QUERY_DESTR.test(code),\n usesBody:\n PATTERNS.BODY_CALL.test(code) ||\n PATTERNS.BODY_DESTR.test(code) ||\n PATTERNS.BODY_PROP.test(code),\n usesParams: PATTERNS.PARAMS_CALL.test(code) || PATTERNS.PARAMS_DESTR.test(code),\n // 這個值會被呼叫方覆蓋,這裡保留是為了型別完整性\n isAsync: PATTERNS.IS_ASYNC.test(code),\n }\n}\n\n/**\n * 字串匹配 Fallback 分析\n *\n * 當 Bun.Transpiler 不可用或轉換失敗時使用,\n * 比原始實現略為保守(寬鬆匹配以減少假陰性)。\n *\n * @param source - 原始 handler 函式字串\n * @returns 分析結果(精確度較低,~85%)\n */\nfunction fallbackStringAnalysis(source: string): TranspilerAnalysisResult {\n return {\n usesHeaders:\n source.includes('.header(') ||\n source.includes('.header)') ||\n source.includes('.headers(') ||\n source.includes('.headers)'),\n usesQuery:\n source.includes('.query(') ||\n source.includes('.query)') ||\n source.includes('.queries(') ||\n source.includes('.queries)'),\n usesBody:\n source.includes('.json()') ||\n source.includes('.text()') ||\n source.includes('.formData()') ||\n source.includes('.body'),\n usesParams:\n source.includes('.param(') ||\n source.includes('.param)') ||\n source.includes('.params(') ||\n source.includes('.params)'),\n isAsync: source.includes('async') || source.includes('await'),\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 輔助工具函式\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 測試 handler 源代碼是否存取特定的 req 成員屬性\n *\n * 工具函式,方便在 Gravito.ts 等地方進行特定屬性的快速檢測。\n *\n * @param source - handler 函式的字串表示\n * @param property - 要測試的屬性名稱(如 'header', 'query', 'body')\n * @returns 若該屬性被存取則回傳 true\n *\n * @example\n * ```typescript\n * const src = handler.toString()\n * if (hasReqMemberAccess(src, 'header')) {\n * // handler 存取了 header\n * }\n * ```\n */\nexport function hasReqMemberAccess(source: string, property: string): boolean {\n const cache = TranspilerCache.getInstance()\n const transformed = cache.transform(source)\n const code = transformed ?? source\n\n // 成員函式呼叫:.req.<property>(\n const callPattern = new RegExp(`\\\\.req\\\\.${property}\\\\s*\\\\(`)\n // 解構賦值:{ <property> } = *.req\n const destrPattern = new RegExp(`\\\\{[^}]*\\\\b${property}\\\\b[^}]*\\\\}\\\\s*=\\\\s*\\\\w+\\\\.req`)\n // 直接屬性存取:.req.<property>(用於 .body 等)\n const propPattern = new RegExp(`\\\\.req\\\\.${property}\\\\b`)\n\n return callPattern.test(code) || destrPattern.test(code) || propPattern.test(code)\n}\n\n/**\n * 判斷 handler 是否為非同步函式\n *\n * 直接從原始碼偵測 `async` 關鍵字,不依賴 transformSync 結果,\n * 因為箭頭函式的 transformSync 返回空字串。\n * `async` 關鍵字本身不存在假陽性問題。\n *\n * @param source - handler 函式的字串表示\n * @returns 若為 async 函式則回傳 true\n */\nexport function isAsyncHandler(source: string): boolean {\n return PATTERNS.IS_ASYNC.test(source)\n}\n\n/**\n * 預熱 Transpiler 快取\n *\n * 在應用啟動時呼叫,觸發 Transpiler 實例建立,\n * 避免第一個請求時的冷啟動延遲。\n */\nexport function warmupTranspilerCache(): void {\n const cache = TranspilerCache.getInstance()\n // 轉換一個簡單的 handler 觸發初始化\n cache.transform('function warmup(ctx) { return ctx.json({}) }')\n}\n",
61
- "/**\n * @fileoverview Handler 靜態分析器(Elysia-inspired,升級版)\n *\n * 分析 handler 函式,偵測其存取了哪些請求屬性,\n * 以選擇最優化的 Context 類型(minimal/fast/full)。\n *\n * ## 版本歷史\n *\n * ### v2(目前版本)- 使用 Bun.Transpiler\n * - 精確度:~99%(AST 層級分析)\n * - 正確處理假陽性:`const header = '...'` 不再誤判\n * - 支援解構賦值:`const { header } = ctx.req`\n * - 支援 Minified 代碼(transformSync 先標準化)\n * - Fallback:若 Transpiler 失敗,退回字串匹配\n *\n * ### v1(原版本)- 字串匹配\n * - 精確度:~85%\n * - 假陽性:變數名稱包含目標字串會誤判\n * - 假陰性:解構賦值無法偵測\n * - Minified 代碼可能失效\n *\n * @module @gravito/core/engine/analyzer\n * @since 3.0.0\n */\n\nimport { analyzeHandlerWithTranspiler } from '../transpiler-utils'\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 公開介面(向後相容,未改變)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Handler 靜態分析結果\n *\n * 記錄 handler 函式使用了哪些請求屬性,\n * 用於選擇最優化的 Context 類型。\n *\n * @public\n * @since 3.0.0\n */\nexport interface HandlerAnalysis {\n /** 是否存取了 request headers */\n usesHeaders: boolean\n /** 是否存取了 query string 參數 */\n usesQuery: boolean\n /** 是否存取了 request body */\n usesBody: boolean\n /** 是否存取了 route 路徑參數 */\n usesParams: boolean\n /** 是否為非同步函式(含 async/await) */\n isAsync: boolean\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 主要分析函式(升級版)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 分析 handler 函式,偵測其使用了哪些請求屬性\n *\n * 使用 Bun.Transpiler 進行 AST 層級的精確分析(精確度 ~99%)。\n * 若 Transpiler 不可用,自動 fallback 到字串匹配(精確度 ~85%)。\n *\n * ## 精確度提升說明\n *\n * **假陽性修復**(原本誤判,現在正確):\n * ```typescript\n * // 這個 handler 原本會誤判 usesHeaders = true\n * // 因為字串 'header' 出現在變數名稱中\n * function handler(ctx) {\n * const header = 'Content-Type' // ← 變數名稱,不是 API 呼叫\n * return ctx.json({ header })\n * }\n * // 現在:usesHeaders = false ✅\n * ```\n *\n * **假陰性修復**(原本漏偵測,現在正確):\n * ```typescript\n * // 這個 handler 原本會漏偵測解構賦值\n * function handler(ctx) {\n * const { header, query } = ctx.req // ← 解構賦值\n * return ctx.json({ header })\n * }\n * // 現在:usesHeaders = true, usesQuery = true ✅\n * ```\n *\n * @param handler - 要分析的 handler 函式\n * @returns HandlerAnalysis 分析結果\n *\n * @example\n * ```typescript\n * const handler = async (ctx) => {\n * const name = ctx.req.query('name')\n * return ctx.json({ name })\n * }\n *\n * const analysis = analyzeHandler(handler)\n * // analysis.usesQuery === true\n * // analysis.usesHeaders === false\n * // analysis.isAsync === true\n *\n * const type = getOptimalContextType(analysis)\n * // type === 'fast'\n * ```\n */\n// biome-ignore lint/complexity/noBannedTypes: 保持 public API 向後相容,handler 可以是任意 callable\nexport function analyzeHandler(handler: Function): HandlerAnalysis {\n const source = handler.toString()\n // 委派給 Transpiler 版本(含快取與 fallback)\n return analyzeHandlerWithTranspiler(source)\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Context 類型選擇(不變,保持向後相容)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 根據分析結果決定最優化的 Context 類型\n *\n * Context 類型由輕到重:\n * - `minimal`:僅支援路徑參數與靜態回應,零 overhead\n * - `fast`:支援 headers 與 query,使用物件池\n * - `full`:支援完整功能含 body 解析(async)\n *\n * 選擇邏輯(優先順序):\n * 1. 若存取 headers → `fast`(header 設置需要完整支援)\n * 2. 若不存取任何屬性 → `minimal`\n * 3. 若僅存取 params → `minimal`(params 在 minimal 中也可用)\n * 4. 若存取 body → `full`(async body 解析需要完整 context)\n * 5. 其他 → `fast`\n *\n * @param analysis - HandlerAnalysis 分析結果\n * @returns 最優化的 context 類型\n */\nexport function getOptimalContextType(analysis: HandlerAnalysis): 'minimal' | 'fast' | 'full' {\n // 存取 headers → 需要 fast context(header 設定功能)\n if (analysis.usesHeaders) {\n return 'fast'\n }\n\n // 不存取任何請求屬性 → 可使用 minimal context\n if (!analysis.usesQuery && !analysis.usesBody && !analysis.usesParams) {\n return 'minimal'\n }\n\n // 僅存取 params → minimal context 已有路徑參數支援\n if (!analysis.usesQuery && !analysis.usesBody && analysis.usesParams) {\n return 'minimal'\n }\n\n // 存取 body → 需要 full context(async body 解析)\n if (analysis.usesBody) {\n return 'full'\n }\n\n return 'fast'\n}\n",
62
- "/**\n * @fileoverview Engine Constants & Cached Buffers\n *\n * Pre-allocated resources to minimize runtime allocation overhead.\n * Specifically targets Bun's zero-copy capabilities.\n */\n\nconst encoder = new TextEncoder()\n\n// Pre-encoded JSON responses for common scenarios\nexport const CACHED_RESPONSES = {\n NOT_FOUND: encoder.encode('{\"error\":\"Not Found\"}'),\n INTERNAL_ERROR: encoder.encode('{\"error\":\"Internal Server Error\"}'),\n OK: encoder.encode('{\"ok\":true}'),\n EMPTY: new Uint8Array(0),\n} as const\n\n// Content-Type constants (avoid string allocation)\nexport const HEADERS = {\n JSON: { 'Content-Type': 'application/json; charset=utf-8' },\n TEXT: { 'Content-Type': 'text/plain; charset=utf-8' },\n HTML: { 'Content-Type': 'text/html; charset=utf-8' },\n} as const\n",
63
- "/**\n * RequestScopeMetrics - Observability for RequestScope lifecycle\n *\n * Tracks cleanup execution time, scope size, and service counts\n * for performance monitoring and diagnostics.\n *\n * @example\n * ```typescript\n * const metrics = new RequestScopeMetrics()\n * metrics.recordCleanupStart()\n * await scope.cleanup()\n * metrics.recordCleanupEnd()\n *\n * console.log(metrics.toJSON())\n * // { cleanupDuration: 2.5, scopeSize: 3, servicesCleaned: 3 }\n * ```\n */\nexport class RequestScopeMetrics {\n private cleanupStartTime: number | null = null\n private cleanupDuration: number | null = null\n private scopeSize = 0\n private servicesCleaned = 0\n private errorsOccurred = 0\n\n /**\n * Record start of cleanup operation\n */\n recordCleanupStart(): void {\n this.cleanupStartTime = performance.now()\n }\n\n /**\n * Record end of cleanup operation\n *\n * @param scopeSize - Number of services in the scope\n * @param servicesCleaned - Number of services that had cleanup called\n * @param errorsOccurred - Number of cleanup errors\n */\n recordCleanupEnd(scopeSize: number, servicesCleaned: number, errorsOccurred = 0): void {\n if (this.cleanupStartTime !== null) {\n this.cleanupDuration = performance.now() - this.cleanupStartTime\n this.cleanupStartTime = null\n }\n\n this.scopeSize = scopeSize\n this.servicesCleaned = servicesCleaned\n this.errorsOccurred = errorsOccurred\n }\n\n /**\n * Get cleanup duration in milliseconds\n *\n * @returns Duration in ms, or null if cleanup not completed\n */\n getCleanupDuration(): number | null {\n return this.cleanupDuration\n }\n\n /**\n * Check if cleanup took longer than threshold (default 2ms)\n * Useful for detecting slow cleanups\n *\n * @param thresholdMs - Threshold in milliseconds\n * @returns True if cleanup exceeded threshold\n */\n isSlowCleanup(thresholdMs = 2): boolean {\n if (this.cleanupDuration === null) {\n return false\n }\n return this.cleanupDuration > thresholdMs\n }\n\n /**\n * Export metrics as JSON for logging/monitoring\n */\n toJSON() {\n return {\n cleanupDuration: this.cleanupDuration,\n scopeSize: this.scopeSize,\n servicesCleaned: this.servicesCleaned,\n errorsOccurred: this.errorsOccurred,\n hasErrors: this.errorsOccurred > 0,\n isSlowCleanup: this.isSlowCleanup(),\n }\n }\n\n /**\n * Export metrics as compact string for logging\n */\n toString(): string {\n const duration = this.cleanupDuration ?? 'pending'\n return (\n `cleanup: ${duration}ms, ` +\n `scope: ${this.scopeSize}, ` +\n `cleaned: ${this.servicesCleaned}, ` +\n `errors: ${this.errorsOccurred}`\n )\n }\n}\n\n/**\n * RequestScopeObserver - Hook for monitoring RequestScope lifecycle\n *\n * Implement this interface to receive callbacks during scope operations\n */\nexport interface RequestScopeObserver {\n /**\n * Called when a service is resolved in the scope\n */\n onServiceResolved?(key: string | symbol, isFromCache: boolean): void\n\n /**\n * Called when cleanup starts\n */\n onCleanupStart?(): void\n\n /**\n * Called when cleanup completes\n */\n onCleanupEnd?(metrics: RequestScopeMetrics): void\n\n /**\n * Called when cleanup encounters an error\n */\n onCleanupError?(error: Error): void\n}\n\n/**\n * RequestScopeMetricsCollector - Aggregates metrics across multiple scopes\n *\n * Used for application-level monitoring and performance tracking\n *\n * @example\n * ```typescript\n * const collector = new RequestScopeMetricsCollector()\n *\n * // Record metrics from multiple requests\n * collector.record(metrics1)\n * collector.record(metrics2)\n * collector.record(metrics3)\n *\n * // Get aggregated stats\n * const stats = collector.getStats()\n * console.log(stats.averageCleanupTime) // 3.5ms\n * ```\n */\nexport class RequestScopeMetricsCollector {\n private metrics: RequestScopeMetrics[] = []\n\n /**\n * Record metrics from a request scope\n */\n record(metrics: RequestScopeMetrics): void {\n this.metrics.push(metrics)\n }\n\n /**\n * Get aggregated statistics\n */\n getStats() {\n if (this.metrics.length === 0) {\n return {\n count: 0,\n averageCleanupTime: null,\n maxCleanupTime: null,\n minCleanupTime: null,\n totalErrorCount: 0,\n errorRate: 0,\n }\n }\n\n const durations = this.metrics\n .map((m) => m.getCleanupDuration())\n .filter((d): d is number => d !== null)\n\n const errorCounts = this.metrics.map((m) => m.toJSON().errorsOccurred)\n const totalErrors = errorCounts.reduce((a, b) => a + b, 0)\n\n return {\n count: this.metrics.length,\n averageCleanupTime:\n durations.length > 0 ? durations.reduce((a, b) => a + b) / durations.length : null,\n maxCleanupTime: durations.length > 0 ? Math.max(...durations) : null,\n minCleanupTime: durations.length > 0 ? Math.min(...durations) : null,\n totalErrorCount: totalErrors,\n errorRate: totalErrors / this.metrics.length,\n }\n }\n\n /**\n * Clear collected metrics\n */\n clear(): void {\n this.metrics = []\n }\n\n /**\n * Get number of recorded metrics\n */\n size(): number {\n return this.metrics.length\n }\n\n /**\n * Export metrics as JSON array\n */\n toJSON() {\n return this.metrics.map((m) => m.toJSON())\n }\n}\n",
64
- "import type { ServiceKey } from '../Container'\nimport { RequestScopeMetrics, type RequestScopeObserver } from './RequestScopeMetrics'\n\n/**\n * Manages request-scoped service instances within a single HTTP request.\n *\n * Each request gets its own RequestScopeManager instance with isolated state.\n * Services are cached within the request and automatically cleaned up when\n * the request ends.\n *\n * @example\n * ```typescript\n * const scope = new RequestScopeManager()\n * const cache = scope.resolve('productCache', () => new ProductCache())\n * // ... use cache ...\n * await scope.cleanup() // Called automatically by Gravito engine\n * ```\n */\nexport class RequestScopeManager {\n private scoped = new Map<string, unknown>()\n private metadata = new Map<string, Record<string, unknown>>()\n private metrics = new RequestScopeMetrics()\n private observer: RequestScopeObserver | null = null\n\n constructor(observer?: RequestScopeObserver) {\n this.observer = observer || null\n }\n\n /**\n * Set observer for monitoring scope lifecycle\n */\n setObserver(observer: RequestScopeObserver): void {\n this.observer = observer\n }\n\n /**\n * Get metrics for this scope\n */\n getMetrics(): RequestScopeMetrics {\n return this.metrics\n }\n\n /**\n * Resolve or retrieve a request-scoped service instance.\n *\n * If the service already exists in this scope, returns the cached instance.\n * Otherwise, calls the factory function to create a new instance and caches it.\n *\n * Automatically detects and records services with cleanup methods.\n *\n * @template T - The type of the service.\n * @param key - The service key (for caching).\n * @param factory - Factory function to create the instance if not cached.\n * @returns The cached or newly created instance.\n */\n resolve<T>(key: ServiceKey, factory: () => T): T {\n const keyStr = String(key)\n const isFromCache = this.scoped.has(keyStr)\n\n if (!isFromCache) {\n const instance = factory()\n this.scoped.set(keyStr, instance)\n\n // Record metadata for cleanup detection\n if (instance && typeof instance === 'object' && 'cleanup' in instance) {\n this.metadata.set(keyStr, { hasCleanup: true })\n }\n }\n\n // Notify observer\n this.observer?.onServiceResolved?.(key, isFromCache)\n\n return this.scoped.get(keyStr) as T\n }\n\n /**\n * Clean up all request-scoped instances.\n *\n * Calls the cleanup() method on each service that has one.\n * Silently ignores cleanup errors to prevent cascading failures.\n * Called automatically by the Gravito engine in the request finally block.\n *\n * @returns Promise that resolves when all cleanup is complete.\n */\n async cleanup(): Promise<void> {\n this.metrics.recordCleanupStart()\n this.observer?.onCleanupStart?.()\n\n const errors: unknown[] = []\n let servicesCleaned = 0\n\n for (const [, instance] of this.scoped) {\n if (instance && typeof instance === 'object' && 'cleanup' in instance) {\n const fn = (instance as any).cleanup\n if (typeof fn === 'function') {\n try {\n await fn.call(instance)\n servicesCleaned++\n } catch (error) {\n // Collect errors but continue cleanup\n errors.push(error)\n this.observer?.onCleanupError?.(\n error instanceof Error ? error : new Error(String(error))\n )\n }\n }\n }\n }\n\n const scopeSize = this.scoped.size\n this.scoped.clear()\n this.metadata.clear()\n\n // Record metrics\n this.metrics.recordCleanupEnd(scopeSize, servicesCleaned, errors.length)\n this.observer?.onCleanupEnd?.(this.metrics)\n\n // Log errors if any occurred\n if (errors.length > 0) {\n console.error('RequestScope cleanup errors:', errors)\n }\n }\n\n /**\n * Get the number of services in this scope (for monitoring).\n *\n * @returns The count of cached services.\n */\n size(): number {\n return this.scoped.size\n }\n}\n",
65
- "/**\n * @fileoverview FastContext - Pooled Request Context\n *\n * Minimal, high-performance context implementation designed for object pooling.\n * Lazy parsing strategy: only parse what's actually accessed.\n *\n * @module @gravito/core/engine\n */\n\nimport { RequestScopeManager } from '../Container/RequestScopeManager'\nimport type { FastRequest, FastContext as IFastContext } from './types'\n\n// Bun runtime optimization: cache frequently used functions\nconst bunEscapeHTML = require('bun').escapeHTML\n\n/**\n * Lazy-parsed request wrapper\n *\n * Delays parsing of query params, headers, and body until accessed.\n * This is a key optimization for requests that don't need all data.\n */\nclass FastRequestImpl implements FastRequest {\n private _request!: Request\n private _params!: Record<string, string>\n private _path!: string\n private _routePattern?: string\n private _url: URL | null = null\n private _query: URLSearchParams | null = null\n private _headers: Record<string, string> | null = null\n private _cachedJson: unknown = undefined\n private _jsonParsed = false\n private _cachedText: string | undefined = undefined\n private _textParsed = false\n private _cachedFormData: FormData | undefined = undefined\n private _formDataParsed = false\n private _cachedQueries: Record<string, string | string[]> | null = null\n private _cachedCookies: Record<string, string> | null = null\n // Back-reference for release check optimization\n private _ctx: FastContext\n\n constructor(ctx: FastContext) {\n this._ctx = ctx\n }\n\n /**\n * Initialize for new request\n */\n init(\n request: Request,\n params: Record<string, string> = {},\n path = '',\n routePattern?: string\n ): this {\n this._request = request\n this._params = params\n this._path = path\n this._routePattern = routePattern\n this._url = null\n this._query = null\n this._headers = null\n this._cachedJson = undefined\n this._jsonParsed = false\n this._cachedText = undefined\n this._textParsed = false\n this._cachedFormData = undefined\n this._formDataParsed = false\n this._cachedQueries = null\n this._cachedCookies = null\n return this\n }\n\n /**\n * Reset for pooling\n */\n reset(): void {\n // Release references to allow GC\n this._request = undefined as any\n this._params = undefined as any\n this._url = null\n this._query = null\n this._headers = null\n this._cachedJson = undefined\n this._jsonParsed = false\n this._cachedText = undefined\n this._textParsed = false\n this._cachedFormData = undefined\n this._formDataParsed = false\n this._cachedQueries = null\n this._cachedCookies = null\n }\n\n private checkReleased(): void {\n if (this._ctx._isReleased) {\n throw new Error(\n 'FastContext usage after release detected! (Object Pool Strict Lifecycle Guard)'\n )\n }\n }\n\n get url(): string {\n this.checkReleased()\n return this._request.url\n }\n\n get method(): string {\n this.checkReleased()\n return this._request.method\n }\n\n get path(): string {\n this.checkReleased()\n return this._path\n }\n\n get routePattern(): string | undefined {\n this.checkReleased()\n return this._routePattern\n }\n\n param(name: string): string | undefined {\n this.checkReleased()\n return this._params[name]\n }\n\n params(): Record<string, string> {\n this.checkReleased()\n return { ...this._params }\n }\n\n private getUrl(): URL {\n if (!this._url) {\n this._url = new URL(this._request.url)\n }\n return this._url\n }\n\n query(name: string): string | undefined {\n this.checkReleased()\n if (!this._query) {\n this._query = this.getUrl().searchParams\n }\n return this._query.get(name) ?? undefined\n }\n\n queries(): Record<string, string | string[]> {\n this.checkReleased()\n // Return cached queries object if available\n if (this._cachedQueries !== null) {\n return this._cachedQueries\n }\n\n if (!this._query) {\n this._query = this.getUrl().searchParams\n }\n\n const result: Record<string, string | string[]> = {}\n for (const [key, value] of this._query.entries()) {\n const existing = result[key]\n if (existing === undefined) {\n result[key] = value\n } else if (Array.isArray(existing)) {\n existing.push(value)\n } else {\n result[key] = [existing, value]\n }\n }\n this._cachedQueries = result\n return result\n }\n\n header(name: string): string | undefined {\n this.checkReleased()\n return this._request.headers.get(name) ?? undefined\n }\n\n headers(): Record<string, string> {\n this.checkReleased()\n if (!this._headers) {\n this._headers = {}\n for (const [key, value] of this._request.headers.entries()) {\n this._headers[key] = value\n }\n }\n return { ...this._headers }\n }\n\n get cookies(): Record<string, string> {\n this.checkReleased()\n // Return cached cookies if available\n if (this._cachedCookies !== null) {\n return this._cachedCookies\n }\n\n // 1. Try Bun Native CookieMap (Injected in Bun.serve routes API)\n const nativeCookies = (this._request as any).cookies\n if (nativeCookies) {\n this._cachedCookies = nativeCookies\n return nativeCookies\n }\n\n // 2. Fallback: Parse from Header manually (Lazy Parsed)\n const cookieHeader = this._request.headers.get('cookie')\n if (!cookieHeader) {\n this._cachedCookies = {}\n return {}\n }\n\n // Manual parse implementation (optimized for speed)\n // Handles URL-encoded values and flexible separators ('; ' or ';')\n const cookies: Record<string, string> = {}\n const pairs = cookieHeader.split(/;\\s*/)\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i]!\n const idx = pair.indexOf('=')\n if (idx > 0) {\n const name = pair.substring(0, idx)\n const value = pair.substring(idx + 1)\n // Decode value if URL-encoded, fallback to raw value on decode error\n try {\n cookies[name] = decodeURIComponent(value)\n } catch {\n cookies[name] = value\n }\n }\n }\n this._cachedCookies = cookies\n return cookies\n }\n\n async json<T = unknown>(): Promise<T> {\n this.checkReleased()\n if (!this._jsonParsed) {\n this._cachedJson = await this._request.json()\n this._jsonParsed = true\n }\n return this._cachedJson as T\n }\n\n async text(): Promise<string> {\n this.checkReleased()\n if (!this._textParsed) {\n this._cachedText = await this._request.text()\n this._textParsed = true\n }\n return this._cachedText!\n }\n\n async formData(): Promise<FormData> {\n this.checkReleased()\n if (!this._formDataParsed) {\n this._cachedFormData = await this._request.formData()\n this._formDataParsed = true\n }\n return this._cachedFormData!\n }\n\n get raw(): Request {\n this.checkReleased()\n return this._request\n }\n}\n\n/**\n * FastContext - Pooled request context\n *\n * Designed for minimal memory allocation and maximum reuse.\n * All response helpers create Response objects directly without intermediate wrappers.\n */\nexport class FastContext implements IFastContext {\n public readonly req: FastRequestImpl = new FastRequestImpl(this)\n // private _statusCode = 200\n private _headers = new Headers() // Reuse this object\n\n public _isReleased = false // Made public for internal check access\n private _requestScope: RequestScopeManager | null = null // Request-scoped services\n\n /**\n * Initialize context for a new request\n *\n * This is called when acquiring from the pool.\n */\n init(\n request: Request,\n params: Record<string, string> = {},\n path = '',\n routePattern?: string\n ): this {\n this._isReleased = false\n this.req.init(request, params, path, routePattern)\n // Optimization: Creating new Headers is faster than iterating to delete in Bun\n // But for strict object pooling, we might want to reconsider.\n // For now, new Headers() is safe and fast enough.\n this._headers = new Headers()\n this._requestScope = new RequestScopeManager() // Initialize request scope\n return this\n }\n\n /**\n * Reset context for pooling (Cleanup)\n *\n * This is called when releasing back to the pool.\n * Implements \"Deep-Reset Protocol\" and \"Release Guard\".\n */\n reset(): void {\n this._isReleased = true\n this.req.reset()\n // We don't clear _headers here because init() will create a new one.\n // If we wanted to reuse, we would clear it here.\n this._store.clear()\n this._requestScope = null // Release reference for GC\n }\n\n /**\n * Check if context is released\n */\n private checkReleased(): void {\n if (this._isReleased) {\n throw new Error(\n 'FastContext usage after release detected! (Object Pool Strict Lifecycle Guard)'\n )\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Response Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n json<T>(data: T, status = 200): Response {\n this.checkReleased()\n // Merge custom headers with Content-Type\n const headers = new Headers(this._headers)\n headers.set('Content-Type', 'application/json; charset=utf-8')\n return Response.json(data, { status, headers })\n }\n\n text(text: string, status = 200): Response {\n this.checkReleased()\n // Merge custom headers with Content-Type\n const headers = new Headers(this._headers)\n headers.set('Content-Type', 'text/plain; charset=utf-8')\n return new Response(text, { status, headers })\n }\n\n html(html: string, status = 200): Response {\n this.checkReleased()\n // Merge custom headers with Content-Type\n const headers = new Headers(this._headers)\n headers.set('Content-Type', 'text/html; charset=utf-8')\n return new Response(html, { status, headers })\n }\n\n /**\n * Escape HTML using Bun's SIMD-accelerated native implementation\n */\n escape(html: string): string {\n return bunEscapeHTML(html)\n }\n\n redirect(url: string, status: 301 | 302 | 303 | 307 | 308 = 302): Response {\n this.checkReleased()\n return new Response(null, {\n status,\n headers: { Location: url },\n })\n }\n\n body(data: BodyInit | null, status = 200): Response {\n this.checkReleased()\n return new Response(data, {\n status,\n headers: this._headers,\n })\n }\n\n /**\n * Send high-performance binary response (e.g. CBOR, Protobuf)\n * Utilizing Bun's native ArrayBufferSink for zero-allocation construction.\n */\n binary(data: Uint8Array | ArrayBuffer, status = 200): Response {\n this.checkReleased()\n const body = data instanceof ArrayBuffer ? new Uint8Array(data) : data\n return new Response(body as any, {\n status,\n headers: { 'Content-Type': 'application/octet-stream' },\n })\n }\n\n stream(stream: any, status = 200): Response {\n this.checkReleased()\n // Direct streaming for zero-copy socket transfers\n return new Response(stream, {\n status,\n headers: { 'Content-Type': 'application/octet-stream' },\n })\n }\n\n notFound(message = 'Not Found'): Response {\n return this.text(message, 404)\n }\n\n forbidden(message = 'Forbidden'): Response {\n return this.text(message, 403)\n }\n\n unauthorized(message = 'Unauthorized'): Response {\n return this.text(message, 401)\n }\n\n badRequest(message = 'Bad Request'): Response {\n return this.text(message, 400)\n }\n\n async forward(target: string, _options: any = {}): Promise<Response> {\n this.checkReleased()\n // Minimal implementation of forwarding\n const url = new URL(this.req.url)\n const targetUrl = new URL(\n target.startsWith('http') ? target : `${url.protocol}//${target}${this.req.path}`\n )\n\n // Copy query params\n const searchParams = new URLSearchParams(url.search)\n searchParams.forEach((v, k) => {\n targetUrl.searchParams.set(k, v)\n })\n\n return fetch(targetUrl.toString(), {\n method: this.req.method,\n headers: this.req.raw.headers,\n body: this.req.method !== 'GET' && this.req.method !== 'HEAD' ? this.req.raw.body : null,\n // @ts-expect-error - Bun/Fetch specific\n duplex: 'half',\n })\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Header Management\n // ─────────────────────────────────────────────────────────────────────────\n\n header(name: string): string | undefined\n header(name: string, value: string): void\n header(name: string, value?: string): string | undefined | undefined {\n this.checkReleased()\n if (value !== undefined) {\n this._headers.set(name, value)\n return\n }\n return this.req.header(name)\n }\n\n /**\n * Status code setter (no-op)\n *\n * Note: Since all response helpers accept a `status` parameter,\n * this method is not actively used. Status should be set directly\n * in the response helper call (e.g., `ctx.json({}, 201)`).\n */\n status(_code: number): void {\n this.checkReleased()\n // Status is set per-response, not stored on context\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Context Variables\n // ─────────────────────────────────────────────────────────────────────────\n\n private _store = new Map<string, any>()\n\n get<T>(key: string): T {\n return this._store.get(key)\n }\n\n set(key: string, value: any): void {\n this._store.set(key, value)\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Request Scope Management\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get the request-scoped service manager for this request.\n *\n * @returns The RequestScopeManager for this request.\n * @throws Error if called before init() or after reset().\n */\n requestScope(): RequestScopeManager {\n if (!this._requestScope) {\n throw new Error('RequestScope not initialized. Call init() first.')\n }\n return this._requestScope\n }\n\n /**\n * Resolve a request-scoped service (convenience method).\n *\n * @template T - The service type.\n * @param key - The service key for caching.\n * @param factory - Factory function to create the service.\n * @returns The cached or newly created service instance.\n */\n scoped<T>(key: string | symbol, factory: () => T): T {\n return this.requestScope().resolve(key, factory)\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Lifecycle helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n public route: (name: string, params?: any, query?: any) => string = () => ''\n\n get native(): this {\n return this\n }\n}\n",
66
- "/**\n * @fileoverview MinimalContext - Ultra-lightweight Request Context\n *\n * Designed for zero-middleware static routes where pool overhead\n * exceeds the cost of creating a new object.\n *\n * Key difference from FastContext:\n * - No object pooling (direct instantiation is faster for simple cases)\n * - No Headers object reuse (creates inline)\n * - Minimal memory footprint\n *\n * @module @gravito/core/engine\n */\n\nimport { RequestScopeManager } from '../Container/RequestScopeManager'\nimport type { FastRequest, FastContext as IFastContext } from './types'\n\n// Bun runtime optimization: cache frequently used functions\nconst bunEscapeHTML = require('bun').escapeHTML\n\n/**\n * Minimal request wrapper\n */\nclass MinimalRequest implements FastRequest {\n private _searchParams: URLSearchParams | null = null\n private _cachedQueries: Record<string, string | string[]> | null = null\n private _cachedJsonPromise: Promise<unknown> | null = null\n private _cachedTextPromise: Promise<string> | null = null\n private _cachedFormDataPromise: Promise<FormData> | null = null\n\n constructor(\n private readonly _request: Request,\n private readonly _params: Record<string, string>,\n private readonly _path: string,\n private readonly _routePattern?: string\n ) {}\n\n get url(): string {\n return this._request.url\n }\n\n get method(): string {\n return this._request.method\n }\n\n get path(): string {\n return this._path\n }\n\n get routePattern(): string | undefined {\n return this._routePattern\n }\n\n param(name: string): string | undefined {\n return this._params[name]\n }\n\n params(): Record<string, string> {\n return { ...this._params }\n }\n\n /**\n * Lazy-initialize searchParams, only parse once\n */\n private getSearchParams(): URLSearchParams {\n if (this._searchParams === null) {\n const url = this._request.url\n const queryStart = url.indexOf('?')\n if (queryStart === -1) {\n this._searchParams = new URLSearchParams()\n } else {\n const hashStart = url.indexOf('#', queryStart)\n const queryString =\n hashStart === -1 ? url.slice(queryStart + 1) : url.slice(queryStart + 1, hashStart)\n this._searchParams = new URLSearchParams(queryString)\n }\n }\n return this._searchParams\n }\n\n query(name: string): string | undefined {\n return this.getSearchParams().get(name) ?? undefined\n }\n\n queries(): Record<string, string | string[]> {\n // Cache the parsed queries object to avoid repeated parsing\n if (this._cachedQueries !== null) {\n return this._cachedQueries\n }\n\n const params = this.getSearchParams()\n const result: Record<string, string | string[]> = {}\n for (const [key, value] of params.entries()) {\n const existing = result[key]\n if (existing === undefined) {\n result[key] = value\n } else if (Array.isArray(existing)) {\n existing.push(value)\n } else {\n result[key] = [existing, value]\n }\n }\n this._cachedQueries = result\n return result\n }\n\n header(name: string): string | undefined {\n return this._request.headers.get(name) ?? undefined\n }\n\n headers(): Record<string, string> {\n const result: Record<string, string> = {}\n for (const [key, value] of this._request.headers.entries()) {\n result[key] = value\n }\n return result\n }\n\n async json<T = unknown>(): Promise<T> {\n // Cache the json promise to prevent \"Body has already been consumed\" errors\n // when multiple handlers or middleware try to read the body\n if (this._cachedJsonPromise === null) {\n this._cachedJsonPromise = this._request.json()\n }\n return this._cachedJsonPromise as Promise<T>\n }\n\n async text(): Promise<string> {\n // Cache the text promise to prevent \"Body has already been consumed\" errors\n if (this._cachedTextPromise === null) {\n this._cachedTextPromise = this._request.text()\n }\n return this._cachedTextPromise\n }\n\n async formData(): Promise<FormData> {\n // Cache the formData promise to prevent \"Body has already been consumed\" errors\n if (this._cachedFormDataPromise === null) {\n this._cachedFormDataPromise = this._request.formData()\n }\n return this._cachedFormDataPromise\n }\n\n get cookies(): Record<string, string> {\n // 1. Try Bun Native CookieMap (Injected in Bun.serve routes API)\n const nativeCookies = (this._request as any).cookies\n if (nativeCookies) {\n return nativeCookies\n }\n\n // 2. Fallback: Parse from Header manually\n const cookieHeader = this._request.headers.get('cookie')\n if (!cookieHeader) {\n return {}\n }\n\n // Manual parse implementation (optimized for speed)\n // Handles URL-encoded values and flexible separators ('; ' or ';')\n const cookies: Record<string, string> = {}\n const pairs = cookieHeader.split(/;\\s*/)\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i]!\n const idx = pair.indexOf('=')\n if (idx > 0) {\n const name = pair.substring(0, idx)\n const value = pair.substring(idx + 1)\n // Decode value if URL-encoded, fallback to raw value on decode error\n try {\n cookies[name] = decodeURIComponent(value)\n } catch {\n cookies[name] = value\n }\n }\n }\n return cookies\n }\n\n get raw(): Request {\n return this._request\n }\n}\n\n/**\n * MinimalContext - Optimized for simple, fast responses\n *\n * Use when:\n * - No middleware\n * - Static routes\n * - Simple JSON/text responses\n * - No custom headers needed\n */\nexport class MinimalContext implements IFastContext {\n public readonly req: MinimalRequest\n private _resHeaders: Record<string, string> = {}\n private _requestScope: RequestScopeManager\n\n constructor(\n request: Request,\n params: Record<string, string>,\n path: string,\n routePattern?: string\n ) {\n this.req = new MinimalRequest(request, params, path, routePattern)\n this._requestScope = new RequestScopeManager()\n }\n\n // get req(): FastRequest {\n // return this._req\n // }\n\n // Response helpers - merge custom headers with defaults\n // Optimized: use Object.assign instead of spread to avoid shallow copy overhead\n private getHeaders(contentType: string): Record<string, string> {\n const headers = Object.assign({ 'Content-Type': contentType }, this._resHeaders)\n return headers\n }\n\n json<T>(data: T, status = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: this.getHeaders('application/json; charset=utf-8'),\n })\n }\n\n text(text: string, status = 200): Response {\n return new Response(text, {\n status,\n headers: this.getHeaders('text/plain; charset=utf-8'),\n })\n }\n\n html(html: string, status = 200): Response {\n return new Response(html, {\n status,\n headers: this.getHeaders('text/html; charset=utf-8'),\n })\n }\n\n redirect(url: string, status: 301 | 302 | 303 | 307 | 308 = 302): Response {\n return new Response(null, {\n status,\n headers: { ...this._resHeaders, Location: url },\n })\n }\n\n body(data: BodyInit | null, status = 200): Response {\n return new Response(data, {\n status,\n headers: this._resHeaders,\n })\n }\n\n header(name: string): string | undefined\n header(name: string, value: string): void\n header(name: string, value?: string): string | undefined | undefined {\n if (value !== undefined) {\n this._resHeaders[name] = value\n return\n }\n return this.req.header(name)\n }\n\n status(_code: number): void {\n // Status is set per response helper call, not stored on context\n }\n\n stream(stream: ReadableStream, status = 200): Response {\n return new Response(stream, {\n status,\n headers: this.getHeaders('application/octet-stream'),\n })\n }\n\n notFound(message = 'Not Found'): Response {\n return this.text(message, 404)\n }\n\n forbidden(message = 'Forbidden'): Response {\n return this.text(message, 403)\n }\n\n unauthorized(message = 'Unauthorized'): Response {\n return this.text(message, 401)\n }\n\n badRequest(message = 'Bad Request'): Response {\n return this.text(message, 400)\n }\n\n async forward(target: string, _options: any = {}): Promise<Response> {\n const url = new URL(this.req.url)\n const targetUrl = new URL(\n target.startsWith('http') ? target : `${url.protocol}//${target}${this.req.path}`\n )\n return fetch(targetUrl.toString(), {\n method: this.req.method,\n headers: this.req.raw.headers,\n })\n }\n\n escape(html: string): string {\n return bunEscapeHTML(html)\n }\n\n get<T>(_key: string): T {\n return undefined as any\n }\n\n set(_key: string, _value: any): void {}\n\n /**\n * Get the request-scoped service manager for this request.\n *\n * @returns The RequestScopeManager for this request.\n */\n requestScope(): RequestScopeManager {\n return this._requestScope\n }\n\n /**\n * Resolve a request-scoped service (convenience method).\n *\n * @template T - The service type.\n * @param key - The service key for caching.\n * @param factory - Factory function to create the service.\n * @returns The cached or newly created service instance.\n */\n scoped<T>(key: string | symbol, factory: () => T): T {\n return this._requestScope.resolve(key, factory)\n }\n\n public route: (name: string, params?: any, query?: any) => string = () => ''\n\n get native(): this {\n return this\n }\n\n // Required for interface compatibility\n init(_request: Request, _params?: Record<string, string>, _path?: string): this {\n throw new Error('MinimalContext does not support init. Create a new instance instead.')\n }\n\n // Required for interface compatibility\n reset(): void {\n // MinimalContext is not pooled, so no-op\n }\n}\n",
67
- "/**\n * @fileoverview Lightweight Path Utilities\n *\n * High-performance path extraction without creating URL objects.\n * Performance critical - every optimization matters.\n *\n * @module @gravito/core/engine\n */\n\n/**\n * Extract pathname from URL string without creating URL object\n *\n * @param url - Full URL string (e.g., \"http://localhost:3000/api/users?id=1\")\n * @returns pathname (e.g., \"/api/users\")\n *\n * @example\n * ```typescript\n * extractPath(\"http://localhost:3000/api/users?id=1\") // \"/api/users\"\n * extractPath(\"https://example.com/\") // \"/\"\n * ```\n */\nexport function extractPath(url: string): string {\n // Optimization: use indexOf which is typically faster than JS loops\n // Find \"://\" to skip protocol\n const protocolEnd = url.indexOf('://')\n\n // Start searching after \"://\" (add 3)\n // If no \"://\", start from 0 (relative implementation or malformed)\n const searchStart = protocolEnd === -1 ? 0 : protocolEnd + 3\n\n const pathStart = url.indexOf('/', searchStart)\n\n // If no slash found after protocol, it's root \"/\" (e.g. http://localhost)\n if (pathStart === -1) {\n return '/'\n }\n\n const queryStart = url.indexOf('?', pathStart)\n\n if (queryStart === -1) {\n return url.slice(pathStart)\n }\n\n return url.slice(pathStart, queryStart)\n}\n\n/**\n * Extract pathname using simpler logic (alternative implementation)\n * Use this if the above doesn't cover edge cases\n */\nexport function extractPathSimple(url: string): string {\n // Find \"://\" then find next \"/\"\n const protocolEnd = url.indexOf('://')\n if (protocolEnd === -1) {\n // Relative URL or malformed\n const queryStart = url.indexOf('?')\n return queryStart === -1 ? url : url.slice(0, queryStart)\n }\n\n const pathStart = url.indexOf('/', protocolEnd + 3)\n if (pathStart === -1) {\n return '/'\n }\n\n const queryStart = url.indexOf('?', pathStart)\n return queryStart === -1 ? url.slice(pathStart) : url.slice(pathStart, queryStart)\n}\n",
68
- "/**\n * @fileoverview Generic Object Pool Implementation\n *\n * High-performance object pooling to reduce GC pressure.\n * Implements \"fixed pool + overflow fallback\" strategy.\n *\n * @module @gravito/core/engine\n */\n\n/**\n * Generic object pool with fixed size and overflow handling\n *\n * @typeParam T - Type of objects to pool\n *\n * @example\n * ```typescript\n * const pool = new ObjectPool(\n * () => new MyObject(),\n * (obj) => obj.reset(),\n * 256\n * )\n *\n * const obj = pool.acquire()\n * try {\n * // Use object\n * } finally {\n * pool.release(obj)\n * }\n * ```\n */\nexport class ObjectPool<T> {\n private pool: T[] = []\n private readonly factory: () => T\n private readonly reset: (obj: T) => void\n private readonly maxSize: number\n\n /**\n * Create a new object pool\n *\n * @param factory - Function to create new objects\n * @param reset - Function to reset objects before reuse\n * @param maxSize - Maximum pool size (default: 256)\n */\n constructor(factory: () => T, reset: (obj: T) => void, maxSize = 256) {\n this.factory = factory\n this.reset = reset\n this.maxSize = maxSize\n }\n\n /**\n * Acquire an object from the pool\n *\n * If the pool is empty, creates a new object (overflow strategy).\n * This ensures the pool never blocks under high load.\n *\n * @returns Object from pool or newly created\n */\n acquire(): T {\n const obj = this.pool.pop()\n if (obj !== undefined) {\n return obj\n }\n\n // Pool exhausted - create new object (overflow)\n return this.factory()\n }\n\n /**\n * Release an object back to the pool\n *\n * If the pool is full, the object is discarded (will be GC'd).\n * This prevents unbounded memory growth.\n *\n * @param obj - Object to release\n */\n release(obj: T): void {\n if (this.pool.length < this.maxSize) {\n this.reset(obj)\n this.pool.push(obj)\n }\n // else: pool is full, let object be GC'd\n }\n\n /**\n * Clear all objects from the pool\n *\n * Useful for testing or when you need to force a clean slate.\n */\n clear(): void {\n this.pool = []\n }\n\n /**\n * Get current pool size\n */\n get size(): number {\n return this.pool.length\n }\n\n /**\n * Get maximum pool size\n */\n get capacity(): number {\n return this.maxSize\n }\n\n /**\n * Pre-warm the pool by creating objects in advance\n *\n * This can reduce latency for the first N requests.\n *\n * @param count - Number of objects to pre-create\n */\n prewarm(count: number): void {\n const targetSize = Math.min(count, this.maxSize)\n while (this.pool.length < targetSize) {\n const obj = this.factory()\n this.reset(obj)\n this.pool.push(obj)\n }\n }\n}\n",
69
- "/**\n * @fileoverview Gravito - High-Performance Web Engine for Bun\n *\n * The standalone engine optimized exclusively for Bun runtime.\n * 99% API-compatible with Hono, but faster through Bun-specific optimizations.\n *\n * Key optimizations:\n * 1. Object pooling for zero-allocation request handling\n * 2. AOT router with O(1) static route lookup\n * 3. Lazy parsing - only parse what's accessed\n * 4. Direct Bun.serve integration without wrapper layers\n *\n * @module @gravito/core/engine\n */\n\nimport type { HttpMethod } from '../http/types'\nimport { AOTRouter } from './AOTRouter'\nimport { analyzeHandler, getOptimalContextType } from './analyzer'\nimport { CACHED_RESPONSES, HEADERS } from './constants'\nimport { FastContext as FastContextImpl } from './FastContext'\nimport { MinimalContext } from './MinimalContext'\nimport { extractPath } from './path'\nimport { ObjectPool } from './pool'\nimport type {\n CompiledHandler,\n EngineOptions,\n ErrorHandler,\n Handler,\n Middleware,\n NotFoundHandler,\n RouteMetadata,\n} from './types'\n\n// Bun runtime optimization: cache frequently used functions\nconst bunPeek = require('bun').peek\n\n/**\n * Precompile middleware chain into a single function\n */\nfunction compileMiddlewareChain(middleware: Middleware[], handler: Handler): CompiledHandler {\n // Fast path: no middleware\n if (middleware.length === 0) {\n return handler as CompiledHandler\n }\n\n // Single middleware optimization - avoid wrapping overhead\n if (middleware.length === 1) {\n const mw = middleware[0]!\n return async (ctx) => {\n let nextCalled = false\n const result = mw(ctx, async () => {\n nextCalled = true\n return undefined\n })\n\n // Optimization: Only use peek/await if result is truly a Promise\n let finalResult: any\n if (result instanceof Promise) {\n const peeked = bunPeek(result)\n finalResult = peeked === result ? await result : peeked\n } else {\n finalResult = result\n }\n\n if (finalResult instanceof Response) {\n return finalResult\n }\n\n if (nextCalled) {\n const hResult = handler(ctx)\n if (hResult instanceof Promise) {\n const p = bunPeek(hResult)\n return p === hResult ? await hResult : p\n }\n return hResult\n }\n return ctx.json({ error: 'Middleware did not call next or return response' }, 500)\n }\n }\n\n // Multiple middleware: compile right-to-left into a chain\n let compiled: CompiledHandler = handler as CompiledHandler\n\n for (let i = middleware.length - 1; i >= 0; i--) {\n const mw = middleware[i]!\n const nextHandler = compiled\n compiled = async (ctx) => {\n let nextCalled = false\n const result = mw(ctx, async () => {\n nextCalled = true\n return undefined\n })\n\n // Optimization: Only use peek/await if result is truly a Promise\n let finalResult: any\n if (result instanceof Promise) {\n const peeked = bunPeek(result)\n finalResult = peeked === result ? await result : peeked\n } else {\n finalResult = result\n }\n\n if (finalResult instanceof Response) {\n return finalResult\n }\n\n if (nextCalled) {\n const nextResult = nextHandler(ctx)\n if (nextResult instanceof Promise) {\n const p = bunPeek(nextResult)\n return p === nextResult ? await nextResult : p\n }\n return nextResult\n }\n\n return ctx.json({ error: 'Middleware did not call next or return response' }, 500)\n }\n }\n\n return compiled\n}\n\n/**\n * Gravito - The High-Performance Web Engine\n */\nexport class Gravito {\n private router = new AOTRouter()\n private contextPool: ObjectPool<FastContextImpl>\n private errorHandler?: ErrorHandler\n private notFoundHandler?: NotFoundHandler\n\n // Direct reference to static routes Map (O(1) access)\n /** @internal */\n public staticRoutes!: Map<string, RouteMetadata>\n // Flag: pure static app (no middleware at all) allows ultra-fast path\n private isPureStaticApp = true\n\n // Cache for precompiled dynamic routes\n private compiledDynamicRoutes = new Map<string, { compiled: CompiledHandler; version: number }>()\n\n /**\n * Create a new Gravito instance\n *\n * @param options - Engine configuration options\n */\n constructor(options: EngineOptions = {}) {\n const poolSize = options.poolSize ?? 256\n\n // Initialize context pool\n this.contextPool = new ObjectPool(\n () => new FastContextImpl(),\n (ctx) => ctx.reset(),\n poolSize\n )\n\n // Pre-warm pool for lower first-request latency\n this.contextPool.prewarm(Math.min(32, poolSize))\n\n // Set custom handlers if provided\n if (options.onError) {\n this.errorHandler = options.onError\n }\n if (options.onNotFound) {\n this.notFoundHandler = options.onNotFound\n }\n\n // Initialize route compilation\n this.compileRoutes()\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // HTTP Method Registration\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Register a GET route\n */\n get(path: string, ...handlers: Handler[]): this {\n return this.addRoute('get', path, handlers)\n }\n\n /**\n * Register a POST route\n */\n post(path: string, ...handlers: Handler[]): this {\n return this.addRoute('post', path, handlers)\n }\n\n /**\n * Register a PUT route\n */\n put(path: string, ...handlers: Handler[]): this {\n return this.addRoute('put', path, handlers)\n }\n\n /**\n * Register a DELETE route\n */\n delete(path: string, ...handlers: Handler[]): this {\n return this.addRoute('delete', path, handlers)\n }\n\n /**\n * Register a PATCH route\n */\n patch(path: string, ...handlers: Handler[]): this {\n return this.addRoute('patch', path, handlers)\n }\n\n /**\n * Register an OPTIONS route\n */\n options(path: string, ...handlers: Handler[]): this {\n return this.addRoute('options', path, handlers)\n }\n\n /**\n * Register a HEAD route\n */\n head(path: string, ...handlers: Handler[]): this {\n return this.addRoute('head', path, handlers)\n }\n\n /**\n * Register a route for all HTTP methods\n */\n all(path: string, ...handlers: Handler[]): this {\n const methods: HttpMethod[] = ['get', 'post', 'put', 'delete', 'patch', 'options', 'head']\n for (const method of methods) {\n this.addRoute(method, path, handlers)\n }\n return this\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Middleware Registration\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Register global or path-based middleware\n */\n use(path: string, ...middleware: Middleware[]): this\n use(...middleware: Middleware[]): this\n use(pathOrMiddleware: string | Middleware, ...middleware: Middleware[]): this {\n // Mark as not pure static since we have middleware\n this.isPureStaticApp = false\n\n if (typeof pathOrMiddleware === 'string') {\n // Path-based middleware\n this.router.usePattern(pathOrMiddleware, ...middleware)\n } else {\n // Global middleware\n this.router.use(pathOrMiddleware, ...middleware)\n }\n\n this.compileRoutes()\n return this\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Route Grouping\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Mount a sub-application at a path prefix\n */\n route(path: string, app: Gravito): this {\n // Mount the sub-application's router using the AOTRouter optimization\n this.router.mount(path, app.router)\n\n // Re-compile routes to update the static route map and optimizations\n this.compileRoutes()\n\n return this\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Error Handling\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Set custom error handler\n */\n onError(handler: ErrorHandler): this {\n this.errorHandler = handler\n return this\n }\n\n /**\n * Set custom 404 handler\n */\n notFound(handler: NotFoundHandler): this {\n this.notFoundHandler = handler\n return this\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Request Handling (Bun.serve integration)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Predictive Route Warming (JIT Optimization)\n *\n * Simulates requests to specified routes to trigger JIT compilation (FTL)\n * before real traffic arrives.\n *\n * @param paths List of paths to warm up (e.g. ['/api/users', '/health'])\n */\n async warmup(paths: string[]): Promise<void> {\n const dummyReqOpts = { headers: { 'User-Agent': 'Gravito-Warmup/1.0' } }\n\n for (const path of paths) {\n const req = new Request(`http://localhost${path}`, dummyReqOpts)\n await this.fetch(req)\n }\n }\n\n /**\n * Generate Native Bun.serve Configuration\n *\n * Offloads static routes to Bun's SIMD-accelerated native router.\n * Supports pre-compiled middleware chains for zero runtime lookup.\n */\n serveConfig(baseConfig: Record<string, unknown> = {}): Record<string, unknown> {\n // 1. Extract and pre-compile routes for Bun's native router\n const nativeRoutes = this.router.getNativeRoutes((handler, middleware, path) => {\n // Pre-compile the middleware chain for this specific static route\n const compiled = compileMiddlewareChain(middleware, handler)\n\n // Create a native request handler that uses our pooling\n return async (req: Request) => {\n const ctx = this.contextPool.acquire()\n ctx.init(req, {}, path, path)\n\n try {\n const result = compiled(ctx)\n\n // Pro-level optimization: skip await if synchronous\n let response: Response\n if (result instanceof Promise) {\n const peeked = bunPeek(result)\n response = peeked === result ? await result : peeked\n } else {\n response = result\n }\n\n // Cleanup and release\n const cleanup = ctx.requestScope().cleanup()\n if (cleanup instanceof Promise) await cleanup\n this.contextPool.release(ctx)\n return response\n } catch (error) {\n // Cleanup even on error\n const cleanup = ctx.requestScope().cleanup()\n if (cleanup instanceof Promise) await cleanup\n this.contextPool.release(ctx)\n return this.handleErrorSync(error as Error, req, path)\n }\n }\n })\n\n return {\n ...baseConfig,\n routes: nativeRoutes,\n fetch: this.fetch, // Fallback for dynamic routes\n // Optimize TLS if provided in baseConfig\n tls: baseConfig.tls ? this.optimizeTLS(baseConfig.tls) : undefined,\n error: (error: Error) => {\n console.error('Native route error:', error)\n return new Response(CACHED_RESPONSES.INTERNAL_ERROR, {\n status: 500,\n headers: HEADERS.JSON,\n })\n },\n }\n }\n\n /**\n * Optimize TLS Configuration for Bun 1.39+\n */\n private optimizeTLS(tls: any): any {\n const isProd = process.env.NODE_ENV === 'production'\n\n const optimizeEntry = (entry: any) => {\n const optimized = { ...entry }\n if (typeof optimized.key === 'string' && !optimized.key.startsWith('-----BEGIN')) {\n optimized.key = require('bun').file(optimized.key)\n }\n if (typeof optimized.cert === 'string' && !optimized.cert.startsWith('-----BEGIN')) {\n optimized.cert = require('bun').file(optimized.cert)\n }\n if (isProd && optimized.lowMemoryMode === undefined) {\n optimized.lowMemoryMode = true\n }\n return optimized\n }\n\n return Array.isArray(tls) ? tls.map(optimizeEntry) : optimizeEntry(tls)\n }\n\n /**\n * Handle an incoming request\n */\n fetch = async (request: Request): Promise<Response> => {\n // Fast path: extract pathname without creating URL object\n const path = extractPath(request.url)\n const method = request.method.toLowerCase()\n\n // Try static route first (O(1) lookup, inlined for performance)\n const staticKey = `${method}:${path}`\n const staticRoute = this.staticRoutes.get(staticKey)\n\n if (staticRoute) {\n const ctx = this.contextPool.acquire()\n ctx.init(request, {}, path, path)\n\n try {\n const compiled =\n staticRoute.compiled ||\n compileMiddlewareChain(staticRoute.middleware, staticRoute.handler)\n const result = compiled(ctx)\n\n let response: Response\n if (result instanceof Promise) {\n const peeked = bunPeek(result)\n response = peeked === result ? await result : peeked\n } else {\n response = result\n }\n\n const cleanup = ctx.requestScope().cleanup()\n if (cleanup instanceof Promise) await cleanup\n this.contextPool.release(ctx)\n return response\n } catch (error) {\n const cleanup = ctx.requestScope().cleanup()\n if (cleanup instanceof Promise) await cleanup\n this.contextPool.release(ctx)\n return this.handleErrorSync(error as Error, request, path)\n }\n }\n\n // Dynamic route: use Radix Tree\n return await this.handleDynamicRoute(request, method, path)\n }\n\n /**\n * Handle dynamic routes with Radix Tree\n */\n private async handleDynamicRoute(\n request: Request,\n method: string,\n path: string\n ): Promise<Response> {\n const match = this.router.match(method, path)\n\n if (match.handler) {\n const ctx = this.contextPool.acquire()\n ctx.init(request, match.params, path, match.routePattern)\n\n try {\n // Use cached compilation if available\n const routeKey = `${method}:${match.routePattern}`\n let compiledObj = this.compiledDynamicRoutes.get(routeKey)\n\n if (!compiledObj || compiledObj.version !== this.router.version) {\n const compiled = compileMiddlewareChain(match.middleware, match.handler)\n compiledObj = { compiled, version: this.router.version }\n this.compiledDynamicRoutes.set(routeKey, compiledObj)\n }\n\n const result = compiledObj.compiled(ctx)\n\n let response: Response\n if (result instanceof Promise) {\n const peeked = bunPeek(result)\n response = peeked === result ? await result : peeked\n } else {\n response = result\n }\n\n const cleanup = ctx.requestScope().cleanup()\n if (cleanup instanceof Promise) await cleanup\n this.contextPool.release(ctx)\n return response\n } catch (error) {\n const cleanup = ctx.requestScope().cleanup()\n if (cleanup instanceof Promise) await cleanup\n this.contextPool.release(ctx)\n return this.handleErrorSync(error as Error, request, path)\n }\n }\n\n // 404\n return this.handleNotFoundSync(request, path)\n }\n\n /**\n * Sync error handler (for ultra-fast path)\n */\n private handleErrorSync(\n error: Error,\n request: Request,\n path: string\n ): Response | Promise<Response> {\n if (this.errorHandler) {\n const ctx = new MinimalContext(request, {}, path)\n const result = this.errorHandler(error, ctx)\n if (result instanceof Response) {\n return result\n }\n return result as Promise<Response>\n }\n\n console.error('Unhandled error:', error)\n return new Response(CACHED_RESPONSES.INTERNAL_ERROR, {\n status: 500,\n headers: HEADERS.JSON,\n })\n }\n\n /**\n * Sync 404 handler (for ultra-fast path)\n */\n private handleNotFoundSync(request: Request, path: string): Response | Promise<Response> {\n if (this.notFoundHandler) {\n const ctx = new MinimalContext(request, {}, path)\n const result = this.notFoundHandler(ctx)\n if (result instanceof Response) {\n return result\n }\n return result as Promise<Response>\n }\n\n return new Response(CACHED_RESPONSES.NOT_FOUND, {\n status: 404,\n headers: HEADERS.JSON,\n })\n }\n\n /**\n * Collect middleware for a specific path\n */\n private collectMiddlewareForPath(path: string, routeMiddleware: Middleware[]): Middleware[] {\n if (this.router.globalMiddleware.length === 0 && this.router.pathMiddleware.size === 0) {\n return routeMiddleware\n }\n\n return this.router.collectMiddlewarePublic(path, routeMiddleware)\n }\n\n /**\n * Compile routes for optimization\n */\n private compileRoutes(): void {\n this.staticRoutes = this.router.staticRoutes\n\n // Check if pure static app\n const hasGlobalMiddleware = this.router.globalMiddleware.length > 0\n const hasPathMiddleware = this.router.pathMiddleware.size > 0\n\n this.isPureStaticApp = !hasGlobalMiddleware && !hasPathMiddleware\n\n // Pre-mark routes\n for (const [key, route] of this.staticRoutes) {\n // Skip if already compiled for this version\n if (route.compiledVersion === this.router.version) {\n continue\n }\n\n const analysis = analyzeHandler(route.handler)\n const optimalType = getOptimalContextType(analysis)\n\n route.useMinimal =\n this.isPureStaticApp && route.middleware.length === 0 && optimalType === 'minimal'\n\n // Precompile middleware chain\n if (!route.useMinimal) {\n const allMiddleware = this.collectMiddlewareForPath(key.split(':')[1]!, route.middleware)\n route.compiled = compileMiddlewareChain(allMiddleware, route.handler)\n }\n\n route.compiledVersion = this.router.version\n }\n }\n\n /**\n * Add a route to the router\n */\n private addRoute(method: string, path: string, handlers: Handler[]): this {\n if (handlers.length === 0) {\n throw new Error(`No handler provided for ${method.toUpperCase()} ${path}`)\n }\n\n const handler = handlers[handlers.length - 1]!\n const middleware = handlers.slice(0, -1) as unknown as Middleware[]\n\n this.router.add(method as HttpMethod, path, handler, middleware)\n\n // Re-compile routes when new ones are added\n this.compileRoutes()\n\n return this\n }\n}\n",
70
- "import { Gravito } from '../engine/Gravito'\nimport type {\n GravitoContext,\n GravitoErrorHandler,\n GravitoHandler,\n GravitoMiddleware,\n GravitoNotFoundHandler,\n GravitoVariables,\n HttpMethod,\n} from '../http/types'\nimport type { AdapterConfig, HttpAdapter, RouteDefinition } from './types'\n\n/**\n * GravitoEngineAdapter - Optimized adapter using the Standalone Gravito Engine\n *\n * This adapter is exclusively for Bun and provides the best performance\n * by using the specialized Gravito engine with object pooling and AOT routing.\n */\nexport class GravitoEngineAdapter<V extends GravitoVariables = GravitoVariables>\n implements HttpAdapter<V>\n{\n readonly name = 'gravito-engine'\n readonly version = '1.0.0'\n\n private engine: Gravito\n\n constructor(config: AdapterConfig = {}) {\n this.engine = new Gravito(config.engineOptions)\n }\n\n get native(): Gravito {\n return this.engine\n }\n\n route(\n method: HttpMethod,\n path: string,\n ...handlers: (GravitoHandler<V> | GravitoMiddleware<V>)[]\n ): void {\n // Gravito engine uses Hono-like API for methods\n const methodFn = (this.engine as any)[method.toLowerCase()]\n if (typeof methodFn !== 'function') {\n throw new Error(`Unsupported HTTP method: ${method}`)\n }\n methodFn.call(this.engine, path, ...handlers)\n }\n\n routes(routes: RouteDefinition[]): void {\n for (const route of routes) {\n this.route(route.method, route.path, ...(route.handlers as any[]))\n }\n }\n\n use(path: string, ...middleware: GravitoMiddleware<V>[]): void {\n this.engine.use(path, ...(middleware as any))\n }\n\n useGlobal(...middleware: GravitoMiddleware<V>[]): void {\n this.engine.use(...(middleware as any))\n }\n\n mount(path: string, subAdapter: HttpAdapter<V>): void {\n // For now, simple relay\n this.use(`${path}/*`, async (ctx) => {\n return await subAdapter.fetch(ctx.req.raw)\n })\n }\n\n onError(handler: GravitoErrorHandler<V>): void {\n this.engine.onError(handler as any)\n }\n\n onNotFound(handler: GravitoNotFoundHandler<V>): void {\n this.engine.notFound(handler as any)\n }\n\n fetch = (request: Request, _server?: unknown): Response | Promise<Response> => {\n return this.engine.fetch(request)\n }\n\n async warmup(paths: string[]): Promise<void> {\n await this.engine.warmup(paths)\n }\n\n createContext(_request: Request): GravitoContext<V> {\n // Gravito engine has its own internal context management\n throw new Error('GravitoEngineAdapter manages context internally through pooling.')\n }\n\n useScoped(scope: string, path: string, ...middleware: GravitoMiddleware<V>[]): void {\n if (path === '*' || path === '*/*') {\n throw new Error(\n `useScoped(): Cannot use wildcard path '*' in Orbit-scoped middleware. ` +\n `Use regular use('*') for global middleware, or specify explicit paths like '${scope}/*'`\n )\n }\n\n const normalizedScope = scope.startsWith('/') ? scope : `/${scope}`\n const fullPath = normalizedScope + (path.startsWith('/') ? '' : '/') + path\n\n this.use(fullPath, ...middleware)\n }\n}\n",
71
- "/**\n * @fileoverview HTTP Adapter Interface for Gravito Framework\n *\n * This module defines the contract that all HTTP adapters must implement.\n * By programming to this interface, Gravito can swap out the underlying\n * HTTP engine without changing application code.\n *\n * @module @gravito/core/adapters\n * @since 2.0.0\n */\n\nimport type {\n GravitoContext,\n GravitoErrorHandler,\n GravitoHandler,\n GravitoMiddleware,\n GravitoNotFoundHandler,\n GravitoVariables,\n HttpMethod,\n} from '../http/types'\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Adapter Configuration\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Configuration options for HTTP adapters\n */\nexport interface AdapterConfig {\n /**\n * Base path prefix for all routes\n * @default ''\n */\n basePath?: string\n\n /**\n * Whether to enable strict routing (trailing slashes matter)\n * @default false\n */\n strictRouting?: boolean\n\n /**\n * Custom options passed to the underlying HTTP engine\n */\n engineOptions?: Record<string, unknown>\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Route Definition\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Route definition structure\n */\nexport interface RouteDefinition {\n method: HttpMethod\n path: string\n handlers: (GravitoHandler | GravitoMiddleware)[]\n name?: string\n middleware?: GravitoMiddleware[]\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// HTTP Adapter Interface\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * HttpAdapter - The core interface for HTTP engine abstraction\n *\n * Any HTTP engine (Photon, Express, Fastify, custom Bun implementation)\n * must implement this interface to be usable with Gravito.\n *\n * @typeParam V - Context variables type\n *\n * @example\n * ```typescript\n * // Using the default Photon adapter\n * import { PhotonAdapter } from '@gravito/core/adapters'\n *\n * const core = new PlanetCore({\n * adapter: new PhotonAdapter()\n * })\n *\n * // Using a custom adapter\n * import { BunNativeAdapter } from '@gravito/adapter-bun'\n *\n * const core = new PlanetCore({\n * adapter: new BunNativeAdapter()\n * })\n * ```\n */\nexport interface HttpAdapter<V extends GravitoVariables = GravitoVariables> {\n // ─────────────────────────────────────────────\n // Identity\n // ─────────────────────────────────────────────\n\n /**\n * Adapter name for identification\n * @example 'photon', 'bun-native', 'express'\n */\n readonly name: string\n\n /**\n * Adapter version\n */\n readonly version: string\n\n // ─────────────────────────────────────────────\n // Native Access\n // ─────────────────────────────────────────────\n\n /**\n * Access the underlying native HTTP engine instance.\n *\n * ⚠️ WARNING: Using this ties your code to a specific adapter.\n *\n * @example\n * ```typescript\n * // For Photon adapter\n * const photonApp = adapter.native as Photon\n *\n * // For custom Bun adapter\n * const bunApp = adapter.native as BunApp\n * ```\n */\n readonly native: unknown\n\n // ─────────────────────────────────────────────\n // Routing\n // ─────────────────────────────────────────────\n\n /**\n * Register a route with the adapter\n *\n * @param method - HTTP method\n * @param path - Route path (may include parameters like ':id')\n * @param handlers - One or more handlers for this route (handlers or middleware)\n */\n route(\n method: HttpMethod,\n path: string,\n ...handlers: (GravitoHandler<V> | GravitoMiddleware<V>)[]\n ): void\n\n /**\n * Register multiple routes at once\n *\n * @param routes - Array of route definitions\n */\n routes(routes: RouteDefinition[]): void\n\n /**\n * Register a middleware for a path\n *\n * @param path - Path pattern to match\n * @param middleware - One or more middleware functions\n */\n use(path: string, ...middleware: GravitoMiddleware<V>[]): void\n\n /**\n * Register a global middleware (applied to all routes)\n *\n * @param middleware - Middleware function\n */\n useGlobal(...middleware: GravitoMiddleware<V>[]): void\n\n /**\n * Register a scoped middleware for Orbit-level isolation\n *\n * Unlike regular `use()`, this method enforces stricter scoping rules:\n * - REJECTS '*' wildcard paths (prevents global middleware in Orbits)\n * - ENFORCES that all middleware paths must include the scope prefix\n * - Throws error if attempting to register global middleware within an Orbit scope\n *\n * This is designed to prevent accidental middleware cross-contamination\n * when multiple Orbits are mounted to a single PlanetCore instance.\n *\n * @param scope - The scope/path prefix (e.g., '/api', '/blog')\n * @param path - Path pattern to match (cannot be '*')\n * @param middleware - One or more middleware functions\n * @throws {Error} If path is '*' when in Orbit scope\n * @since 2.3.0\n *\n * @example\n * ```typescript\n * // Correct: Scoped to specific path\n * adapter.useScoped('/api', '/users/*', authMiddleware)\n *\n * // Error: Cannot use wildcard in Orbit scope\n * adapter.useScoped('/api', '*', loggerMiddleware)\n * ```\n */\n useScoped(scope: string, path: string, ...middleware: GravitoMiddleware<V>[]): void\n\n /**\n * Mount a sub-adapter at a path\n *\n * @param path - Mount path\n * @param subAdapter - The adapter to mount\n */\n mount(path: string, subAdapter: HttpAdapter<V>): void\n\n // ─────────────────────────────────────────────\n // Error Handling\n // ─────────────────────────────────────────────\n\n /**\n * Set the error handler\n *\n * @param handler - Error handler function\n */\n onError(handler: GravitoErrorHandler<V>): void\n\n /**\n * Set the not-found handler\n *\n * @param handler - Not-found handler function\n */\n onNotFound(handler: GravitoNotFoundHandler<V>): void\n\n // ─────────────────────────────────────────────\n // Request Handling\n // ─────────────────────────────────────────────\n\n /**\n * The main fetch handler for serving requests.\n *\n * This is compatible with `Bun.serve()`, Cloudflare Workers,\n * and other fetch-based runtimes.\n *\n * @param request - Incoming HTTP request\n * @param server - Optional server context (Bun.Server, etc.)\n * @returns HTTP response\n *\n * @example\n * ```typescript\n * // With Bun.serve\n * Bun.serve({\n * port: 3000,\n * fetch: adapter.fetch\n * })\n * ```\n */\n fetch(request: Request, server?: unknown): Response | Promise<Response>\n\n /**\n * Predictive Route Warming (JIT Optimization)\n *\n * Simulates requests to specified routes to trigger JIT compilation (FTL)\n * before real traffic arrives.\n *\n * @param paths List of paths to warm up (e.g. ['/api/users', '/health'])\n * @since 2.1.0\n */\n warmup?(paths: string[]): Promise<void>\n\n /**\n * WebSocket Handler for Bun.serve\n *\n * @since 2.2.0\n */\n websocket?: {\n open?(ws: unknown): void | Promise<void>\n message?(ws: unknown, message: string | Buffer | Uint8Array): void | Promise<void>\n close?(ws: unknown, code: number, message: string): void | Promise<void>\n drain?(ws: unknown): void | Promise<void>\n // Allow any other Bun websocket properties\n [key: string]: unknown\n }\n\n // ─────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────\n\n /**\n * Initialize the adapter\n *\n * Called during PlanetCore.boot()\n */\n init?(): void | Promise<void>\n\n /**\n * Cleanup resources\n *\n * Called during graceful shutdown\n */\n shutdown?(): void | Promise<void>\n\n // ─────────────────────────────────────────────\n // Context Factory\n // ─────────────────────────────────────────────\n\n /**\n * Create a GravitoContext from a raw request.\n *\n * This is used internally for testing and advanced scenarios.\n *\n * @param request - Raw HTTP request\n * @returns Gravito context\n */\n createContext(request: Request): GravitoContext<V>\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Adapter Factory\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Factory function type for creating adapters\n */\nexport type AdapterFactory<V extends GravitoVariables = GravitoVariables> = (\n config?: AdapterConfig\n) => HttpAdapter<V>\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Type Guards\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Check if a value is an HttpAdapter\n */\nexport function isHttpAdapter(value: unknown): value is HttpAdapter {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'name' in value &&\n 'fetch' in value &&\n typeof (value as HttpAdapter).fetch === 'function' &&\n 'route' in value &&\n typeof (value as HttpAdapter).route === 'function'\n )\n}\n",
72
- "/**\n * @fileoverview Application - Enterprise Application Container\n *\n * A high-level application class that orchestrates the entire framework.\n * Provides a centralized entry point for enterprise applications with\n * auto-discovery of providers, config loading, and lifecycle management.\n *\n * Phase 4 優化:Provider 預掃描 + 平行載入\n * - Phase 1:預掃描所有 Provider 文件(語法驗證)\n * - Phase 2:篩選有效 Provider(跳過無效的)\n * - Phase 3:平行 import 所有有效 Provider\n * - Phase 4:註冊到容器\n *\n * @module @gravito/core\n * @since 2.0.0\n */\n\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { ConfigManager } from './ConfigManager'\nimport { Container } from './Container'\nimport type { EventManager } from './EventManager'\nimport type { Logger } from './Logger'\nimport { ConsoleLogger } from './Logger'\nimport { PlanetCore } from './PlanetCore'\nimport type { ServiceProvider } from './ServiceProvider'\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 內部型別定義\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Provider 檔案掃描結果\n * 預掃描 Phase 的輸出,紀錄每個檔案的基本語法驗證結果\n */\ninterface ProviderScanResult {\n /** 檔案絕對路徑 */\n filePath: string\n /** 檔案名稱(含副檔名) */\n fileName: string\n /** 是否通過語法驗證 */\n valid: boolean\n /** 失敗原因(僅在 valid === false 時有值) */\n error?: string\n}\n\n/**\n * Provider 模組載入結果\n * 平行 import Phase 的輸出\n */\ninterface ProviderLoadResult {\n /** 檔案名稱(供日誌參考) */\n fileName: string\n /** 已解析的 Provider class(若載入成功) */\n // biome-ignore lint/complexity/noBannedTypes: 需要接受任意建構子函式\n ProviderClass?: Function\n /** 是否成功 */\n success: boolean\n /** 失敗原因 */\n error?: string\n}\n\n/**\n * Application Config options for the Application class.\n * @public\n */\nexport interface ApplicationConfig {\n /**\n * Base path of the application\n */\n basePath: string\n\n /**\n * Path to the config directory (relative to basePath)\n * @default 'config'\n */\n configPath?: string\n\n /**\n * Path to the providers directory (relative to basePath)\n * @default 'src/Providers'\n */\n providersPath?: string\n\n /**\n * Environment (development, production, testing)\n */\n env?: 'development' | 'production' | 'testing'\n\n /**\n * Logger instance\n */\n logger?: Logger\n\n /**\n * Initial configuration values\n */\n config?: Record<string, unknown>\n\n /**\n * Service providers to register\n */\n providers?: ServiceProvider[]\n\n /**\n * Whether to auto-discover providers from providersPath\n * @default true\n */\n autoDiscoverProviders?: boolean\n}\n\n/**\n * Application - Enterprise-grade application container.\n *\n * Provides a higher-level abstraction over PlanetCore for building\n * enterprise applications with convention-over-configuration patterns.\n *\n * @example\n * ```typescript\n * // Create application\n * const app = new Application({\n * basePath: import.meta.dir,\n * env: process.env.NODE_ENV as 'development' | 'production',\n * });\n *\n * // Boot the application\n * await app.boot();\n *\n * // Access core\n * export default app.core.liftoff();\n * ```\n */\nexport class Application {\n /**\n * The underlying PlanetCore instance.\n */\n public readonly core: PlanetCore\n\n /**\n * The IoC container.\n */\n public readonly container: Container\n\n /**\n * The configuration manager.\n */\n public readonly config: ConfigManager\n\n /**\n * The event manager.\n */\n public readonly events: EventManager\n\n /**\n * The logger instance.\n */\n public readonly logger: Logger\n\n /**\n * Application base path.\n */\n public readonly basePath: string\n\n /**\n * Environment mode.\n */\n public readonly env: 'development' | 'production' | 'testing'\n\n /**\n * Configuration options.\n */\n private readonly options: ApplicationConfig\n\n /**\n * Whether the application has been booted.\n */\n private booted = false\n\n constructor(options: ApplicationConfig) {\n this.options = options\n this.basePath = options.basePath\n this.env =\n options.env ??\n (process.env.NODE_ENV as 'development' | 'production' | 'testing') ??\n 'development'\n this.logger = options.logger ?? new ConsoleLogger()\n\n // Initialize container and config\n this.container = new Container()\n this.config = new ConfigManager(options.config ?? {})\n\n // Initialize core with shared container\n // Now PlanetCore uses the same container instance as Application\n this.core = new PlanetCore({\n logger: this.logger,\n config: options.config,\n container: this.container,\n })\n\n this.events = this.core.events\n\n // Register self in container\n this.container.instance('app', this)\n this.container.instance('config', this.config)\n this.container.instance('logger', this.logger)\n this.container.instance('events', this.events)\n }\n\n /**\n * Boot the application and its dependencies.\n *\n * This method orchestrates the full application lifecycle:\n * 1. Configuration: Loads all config files from the config directory.\n * 2. Discovery: Auto-discovers ServiceProviders from the providers directory.\n * 3. Registration: Registers all discovered and explicit providers.\n * 4. Bootstrapping: Triggers the PlanetCore bootstrap sequence.\n *\n * @returns Promise that resolves to the application instance for chaining.\n *\n * @example\n * ```typescript\n * const app = new Application({ basePath: import.meta.dir });\n * await app.boot();\n * ```\n */\n async boot(): Promise<this> {\n if (this.booted) {\n return this\n }\n\n this.logger.info(`🚀 Booting application in ${this.env} mode...`)\n\n // 1. Load configuration\n await this.loadConfiguration()\n\n // 2. Auto-discover and register providers\n if (this.options.autoDiscoverProviders !== false) {\n await this.discoverProviders()\n }\n\n // 4. Register explicit providers\n if (this.options.providers) {\n for (const provider of this.options.providers) {\n this.core.register(provider)\n }\n }\n\n // 5. Bootstrap core (register + boot all providers)\n await this.core.bootstrap()\n\n this.booted = true\n this.logger.info('✅ Application booted successfully')\n\n return this\n }\n\n /**\n * Load configuration files from the config directory.\n *\n * @internal\n */\n private async loadConfiguration(): Promise<void> {\n const configPath = path.resolve(this.basePath, this.options.configPath ?? 'config')\n\n try {\n const stat = await fs.stat(configPath)\n if (!stat.isDirectory()) {\n return\n }\n\n const files = await fs.readdir(configPath)\n\n for (const file of files) {\n if (!file.endsWith('.ts') && !file.endsWith('.js')) {\n continue\n }\n\n const key = path.basename(file, path.extname(file))\n const filePath = path.resolve(configPath, file)\n\n try {\n const module = await import(pathToFileURL(filePath).href)\n const value = module.default ?? module\n\n this.config.set(key, value)\n this.logger.info(`📋 Loaded config: ${key}`)\n } catch (error) {\n // Enhanced error handling with type guards\n if (error instanceof SyntaxError) {\n this.logger.error(`Syntax error in config file ${file}:`, error.message)\n } else if (error instanceof Error) {\n this.logger.warn(`Failed to load config ${file}: ${error.message}`, {\n stack: error.stack,\n })\n } else {\n this.logger.warn(`Failed to load config ${file}:`, error)\n }\n }\n }\n } catch {\n // Config directory doesn't exist, that's fine\n this.logger.info('No config directory found, skipping config loading')\n }\n }\n\n /**\n * Discover and register providers from the providers directory.\n *\n * Phase 4 優化版本:採用 4-Phase 載入策略\n * - Phase 1:預掃描所有候選 Provider 檔案(語法驗證)\n * - Phase 2:篩選有效 Provider 檔案(跳過語法錯誤的)\n * - Phase 3:平行 import 所有有效 Provider(從循序 → 並行)\n * - Phase 4:逐一註冊到容器\n *\n * 效能改進:N 個 Provider 從 O(N * importTime) 降至 O(importTime + overhead)\n *\n * @internal\n */\n private async discoverProviders(): Promise<void> {\n const providersPath = path.resolve(this.basePath, this.options.providersPath ?? 'src/Providers')\n\n try {\n const stat = await fs.stat(providersPath)\n if (!stat.isDirectory()) {\n return\n }\n\n const startTime = Date.now()\n\n // Phase 1:取得候選 Provider 檔案清單並預掃描\n const scanResults = await this.prescribeProviders(providersPath)\n const scanMs = Date.now() - startTime\n\n if (scanResults.length === 0) {\n return\n }\n\n // Phase 2:篩選有效檔案(排除語法錯誤的)\n const validProviders = scanResults.filter((r) => r.valid)\n const invalidCount = scanResults.length - validProviders.length\n\n this.logger.info(\n `🔍 Prescanned ${scanResults.length} files (${scanMs}ms) - valid: ${validProviders.length}, invalid: ${invalidCount}`\n )\n\n if (validProviders.length === 0) {\n return\n }\n\n // Phase 3:平行 import 所有有效 Provider\n this.logger.info('⚙️ Loading providers in parallel...')\n const loadResults = await this.loadProvidersInParallel(validProviders)\n\n // Phase 4:逐一註冊到容器\n const registerStart = Date.now()\n let registeredCount = 0\n\n for (const result of loadResults) {\n if (!result.success || !result.ProviderClass) {\n continue\n }\n\n try {\n const provider = new (result.ProviderClass as new () => ServiceProvider)()\n this.core.register(provider)\n this.logger.info(`🔌 Registered provider: ${result.ProviderClass.name}`)\n registeredCount++\n } catch (error) {\n if (error instanceof Error) {\n this.logger.warn(\n `Failed to instantiate provider from ${result.fileName}: ${error.message}`\n )\n } else {\n this.logger.warn(`Failed to instantiate provider from ${result.fileName}:`, error)\n }\n }\n }\n\n const totalMs = Date.now() - startTime\n this.logger.info(\n `🔌 Registered ${registeredCount} providers in ${Date.now() - registerStart}ms (total: ${totalMs}ms)`\n )\n } catch {\n // Providers directory doesn't exist, that's fine\n }\n }\n\n /**\n * Phase 1+2:預掃描 Provider 目錄中的所有候選檔案。\n *\n * 使用輕量語法驗證(嘗試讀取 + 基本結構檢查)篩選有效的 Provider 檔案,\n * 讓語法錯誤在 import 之前被發現,提供更清晰的錯誤訊息。\n *\n * 策略:\n * 1. 使用 Bun.Transpiler 進行 import 掃描(在 Bun 環境下)\n * 2. Fallback 至基本檔案讀取驗證(在 Node/Deno 環境下)\n *\n * @param providersPath - Provider 目錄絕對路徑\n * @returns 掃描結果陣列(含有效/無效標記)\n * @internal\n */\n private async prescribeProviders(providersPath: string): Promise<ProviderScanResult[]> {\n const files = await fs.readdir(providersPath)\n const candidateFiles = files.filter(\n (file) =>\n (file.endsWith('Provider.ts') || file.endsWith('Provider.js')) && !file.endsWith('.d.ts')\n )\n\n if (candidateFiles.length === 0) {\n return []\n }\n\n // 平行執行預掃描(IO 操作可並行)\n const scanPromises = candidateFiles.map(async (file): Promise<ProviderScanResult> => {\n const filePath = path.resolve(providersPath, file)\n\n try {\n // 嘗試讀取檔案內容以驗證可存取性\n const content = await fs.readFile(filePath, 'utf-8')\n\n // 基本結構驗證:確認檔案包含 Provider 相關關鍵字\n // 此驗證為輕量快速篩選,不取代完整的 import 驗證\n const hasProviderPattern =\n content.includes('ServiceProvider') ||\n content.includes('register(') ||\n content.includes('class ') ||\n content.includes('export default') ||\n content.includes('export {')\n\n if (!hasProviderPattern) {\n return {\n filePath,\n fileName: file,\n valid: false,\n error: 'File does not appear to contain a valid ServiceProvider export',\n }\n }\n\n return { filePath, fileName: file, valid: true }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n this.logger.warn(`❌ Cannot access provider file ${file}: ${message}`)\n return { filePath, fileName: file, valid: false, error: message }\n }\n })\n\n return Promise.all(scanPromises)\n }\n\n /**\n * Phase 3:平行 import 所有有效的 Provider 檔案。\n *\n * 使用 Promise.all() 同時 import 所有通過預掃描的 Provider 檔案,\n * 從循序載入(O(N))改善為平行載入(O(1) 理論上),\n * 實際效能受 I/O、CPU 和 V8 模組解析限制。\n *\n * @param validProviders - 通過預掃描的 Provider 掃描結果\n * @returns 模組載入結果陣列\n * @internal\n */\n private async loadProvidersInParallel(\n validProviders: ProviderScanResult[]\n ): Promise<ProviderLoadResult[]> {\n const loadPromises = validProviders.map(\n async ({ filePath, fileName }): Promise<ProviderLoadResult> => {\n try {\n const module = await import(pathToFileURL(filePath).href)\n\n // 尋找 default export 或含 register() 方法的 class\n const ProviderClass =\n module.default ??\n Object.values(module).find(\n (exp): exp is new () => ServiceProvider =>\n // biome-ignore lint/suspicious/noExplicitAny: 需要檢查動態模組的 prototype\n typeof exp === 'function' && (exp as any).prototype?.register\n )\n\n if (ProviderClass && typeof ProviderClass === 'function') {\n return { fileName, ProviderClass, success: true }\n }\n\n return {\n fileName,\n success: false,\n error: 'No valid ServiceProvider class found in module exports',\n }\n } catch (error) {\n // 詳細的錯誤分類,方便診斷\n let errorMessage: string\n if (error instanceof SyntaxError) {\n errorMessage = `Syntax error: ${error.message}`\n this.logger.error(`Syntax error in provider file ${fileName}:`, error.message)\n } else if (error instanceof TypeError) {\n errorMessage = `Type error: ${error.message}`\n this.logger.warn(`Invalid provider class in ${fileName}: ${error.message}`)\n } else if (error instanceof Error) {\n errorMessage = error.message\n this.logger.warn(`Failed to load provider ${fileName}: ${error.message}`, {\n stack: error.stack,\n })\n } else {\n errorMessage = String(error)\n this.logger.warn(`Failed to load provider ${fileName}:`, error)\n }\n\n return { fileName, success: false, error: errorMessage }\n }\n }\n )\n\n return Promise.all(loadPromises)\n }\n\n /**\n * Resolve a service instance from the IoC container.\n *\n * This is a convenience wrapper around `container.make()`.\n *\n * @template T - The expected type of the service.\n * @param key - The unique identifier or class name of the service.\n * @returns The resolved service instance.\n * @throws Error if the service is not bound in the container.\n *\n * @example\n * ```typescript\n * const db = app.make<Database>('db');\n * ```\n */\n make<T>(key: string): T {\n // Now uses the shared container instance\n return this.container.make<T>(key)\n }\n\n /**\n * Check if a service is bound.\n *\n * @param key - The service key\n * @returns True if bound\n */\n has(key: string): boolean {\n // Now uses the shared container instance\n return this.container.has(key)\n }\n\n /**\n * Retrieve a configuration value using dot notation.\n *\n * @template T - The expected type of the configuration value.\n * @param key - The configuration key (e.g., 'app.name', 'database.connections.mysql').\n * @param defaultValue - Optional value to return if the key is not found.\n * @returns The configuration value or the default value.\n *\n * @example\n * ```typescript\n * const port = app.getConfig<number>('app.port', 3000);\n * ```\n */\n getConfig<T>(key: string, defaultValue?: T): T {\n return this.config.get<T>(key, defaultValue)\n }\n\n /**\n * Resolve an absolute path relative to the application base path.\n *\n * @param segments - Path segments to join with the base path.\n * @returns The absolute path string.\n *\n * @example\n * ```typescript\n * const storagePath = app.path('storage', 'logs');\n * ```\n */\n path(...segments: string[]): string {\n return path.resolve(this.basePath, ...segments)\n }\n\n /**\n * Get the config path.\n *\n * @param segments - Additional path segments\n * @returns Absolute path to config directory\n */\n configPath(...segments: string[]): string {\n return this.path(this.options.configPath ?? 'config', ...segments)\n }\n\n /**\n * Check if running in production.\n */\n isProduction(): boolean {\n return this.env === 'production'\n }\n\n /**\n * Check if running in development.\n */\n isDevelopment(): boolean {\n return this.env === 'development'\n }\n\n /**\n * Check if running in testing.\n */\n isTesting(): boolean {\n return this.env === 'testing'\n }\n}\n",
73
- "/**\n * Bun runtime adapter implementation.\n *\n * @module runtime/adapter-bun\n * @since 3.2.0\n */\n\nimport type { RuntimeAdapter, RuntimeSpawnOptions } from './types'\n\n/**\n * Create a RuntimeAdapter for the Bun runtime.\n * @internal\n */\nexport function createBunAdapter(): RuntimeAdapter {\n return {\n kind: 'bun',\n spawn(command, options = {}) {\n const [cmd, ...args] = command\n if (!cmd) {\n throw new Error('[RuntimeAdapter] spawn() requires a command')\n }\n const proc = Bun.spawn([cmd, ...args], {\n cwd: options.cwd,\n env: options.env,\n stdin: options.stdin,\n stdout: options.stdout ?? 'pipe',\n stderr: options.stderr ?? 'pipe',\n })\n\n let timeoutHandle: Timer | undefined\n let abortListener: (() => void) | undefined\n\n const exitedWithTimeout = new Promise<number>((resolve, reject) => {\n if (options.timeout) {\n timeoutHandle = setTimeout(() => {\n proc.kill('SIGTERM')\n reject(new Error('[RuntimeAdapter] Process timeout'))\n }, options.timeout)\n }\n\n if (options.signal) {\n abortListener = () => {\n proc.kill('SIGTERM')\n reject(new DOMException('Aborted', 'AbortError'))\n }\n options.signal.addEventListener('abort', abortListener)\n }\n\n proc.exited\n .then(resolve)\n .catch(reject)\n .finally(() => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle)\n }\n if (abortListener && options.signal) {\n options.signal.removeEventListener('abort', abortListener)\n }\n })\n })\n\n return {\n exited: exitedWithTimeout,\n stdout: proc.stdout ?? null,\n stderr: proc.stderr ?? null,\n kill: (signal?: string | number) => {\n const bunSignal =\n typeof signal === 'number' ? signal : (signal as NodeJS.Signals | undefined)\n proc.kill(bunSignal)\n },\n unref: () => {\n // Bun.spawn doesn't have unref\n },\n resourceUsage: async () => {\n // Bun doesn't expose resource usage through spawn API\n return undefined\n },\n }\n },\n async spawnAndCollect(command, options = {}) {\n const [cmd, ...args] = command\n if (!cmd) {\n throw new Error('[RuntimeAdapter] spawn() requires a command')\n }\n\n const proc = Bun.spawn([cmd, ...args], {\n cwd: options.cwd,\n env: options.env,\n stdin: options.stdin,\n stdout: 'pipe',\n stderr: 'pipe',\n })\n\n let timedOut = false\n let timeoutHandle: Timer | undefined\n\n const exitPromise = proc.exited\n .then((code: number) => ({ code, timedOut }))\n .catch(() => ({\n code: -1,\n timedOut: true,\n }))\n\n if (options.timeout) {\n const timeoutPromise = new Promise<{\n code: number\n timedOut: boolean\n }>((resolve) => {\n timeoutHandle = setTimeout(() => {\n timedOut = true\n proc.kill('SIGTERM')\n resolve({ code: -1, timedOut: true })\n }, options.timeout)\n })\n\n const result = await Promise.race([exitPromise, timeoutPromise])\n\n if (timeoutHandle) {\n clearTimeout(timeoutHandle)\n }\n\n const [stdoutText, stderrText] = await Promise.all([\n new Response(proc.stdout ?? null).text(),\n new Response(proc.stderr ?? null).text(),\n ])\n\n return {\n exitCode: result.code,\n stdout: stdoutText,\n stderr: stderrText,\n success: result.code === 0 && !result.timedOut,\n timedOut: result.timedOut,\n }\n }\n\n let abortListener: (() => void) | undefined\n if (options.signal) {\n abortListener = () => {\n proc.kill('SIGTERM')\n }\n options.signal.addEventListener('abort', abortListener)\n }\n\n const { code, timedOut: timeout } = await exitPromise\n\n if (abortListener && options.signal) {\n options.signal.removeEventListener('abort', abortListener)\n }\n\n const [stdoutText, stderrText] = await Promise.all([\n new Response(proc.stdout ?? null).text(),\n new Response(proc.stderr ?? null).text(),\n ])\n\n return {\n exitCode: code,\n stdout: stdoutText,\n stderr: stderrText,\n success: code === 0 && !timeout,\n timedOut: timeout,\n }\n },\n spawnSync(command, options: Omit<RuntimeSpawnOptions, 'signal'> = {}) {\n const [cmd, ...args] = command\n if (!cmd) {\n throw new Error('[RuntimeAdapter] spawn() requires a command')\n }\n\n const timedOut = false\n const proc = Bun.spawnSync([cmd, ...args], {\n cwd: options.cwd,\n env: options.env,\n stdin: options.stdin,\n stdout: 'pipe',\n stderr: 'pipe',\n })\n\n const decoder = new TextDecoder('utf-8', {\n fatal: false,\n })\n const stdoutText = decoder.decode(proc.stdout ?? new Uint8Array())\n const stderrText = decoder.decode(proc.stderr ?? new Uint8Array())\n\n return {\n exitCode: proc.exitCode ?? 0,\n stdout: stdoutText,\n stderr: stderrText,\n success: (proc.exitCode ?? 0) === 0 && !timedOut,\n timedOut,\n }\n },\n async writeFile(path, data) {\n await Bun.write(path, data)\n },\n async readFile(path) {\n const file = Bun.file(path)\n const buffer = await file.arrayBuffer()\n return new Uint8Array(buffer)\n },\n async readFileAsBlob(path) {\n return Bun.file(path)\n },\n async exists(path) {\n return await Bun.file(path).exists()\n },\n async stat(path) {\n const stats = await Bun.file(path).stat()\n return { size: stats.size }\n },\n async deleteFile(path) {\n const fs = await import('node:fs/promises')\n try {\n await fs.unlink(path)\n } catch {\n // Ignore if not found\n }\n },\n serve(config) {\n return Bun.serve({\n port: config.port,\n fetch: config.fetch,\n websocket: config.websocket as any,\n })\n },\n }\n}\n",
74
- "/**\n * Runtime detection utilities.\n *\n * @module runtime/detection\n * @since 3.2.0\n */\n\nimport type { RuntimeKind } from './types'\n\n/**\n * Detect the current JavaScript runtime environment.\n * @internal\n */\nexport function getRuntimeKind(): RuntimeKind {\n if (typeof Bun !== 'undefined' && typeof Bun.spawn === 'function') {\n return 'bun'\n }\n const denoRuntime = (globalThis as any).Deno\n if (typeof denoRuntime !== 'undefined' && typeof denoRuntime?.version?.deno === 'string') {\n return 'deno'\n }\n if (typeof process !== 'undefined' && process.versions?.node) {\n return 'node'\n }\n return 'unknown'\n}\n\n/**\n * Get environment variables from the current runtime.\n * @public\n */\nexport function getRuntimeEnv(): Record<string, string | undefined> {\n const kind = getRuntimeKind()\n if (kind === 'bun' && typeof Bun !== 'undefined') {\n return Bun.env\n }\n if (kind === 'deno') {\n const deno = (globalThis as any).Deno\n if (deno?.env?.toObject) {\n return deno.env.toObject()\n }\n }\n if (typeof process !== 'undefined' && process.env) {\n return process.env\n }\n return {}\n}\n\n/**\n * Convert various data types to Uint8Array.\n * @internal\n */\nexport async function toUint8Array(\n data: Blob | Buffer | string | ArrayBuffer | Uint8Array\n): Promise<Uint8Array> {\n if (data instanceof Uint8Array) {\n return data\n }\n if (typeof data === 'string') {\n return new TextEncoder().encode(data)\n }\n if (data instanceof ArrayBuffer) {\n return new Uint8Array(data)\n }\n if (typeof Buffer !== 'undefined' && data instanceof Buffer) {\n return new Uint8Array(data)\n }\n if (data instanceof Blob) {\n return new Uint8Array(await data.arrayBuffer())\n }\n return new Uint8Array()\n}\n",
75
- "/**\n * Deno runtime adapter implementation.\n *\n * @module runtime/adapter-deno\n * @since 3.2.0\n */\n\nimport { toUint8Array } from './detection'\nimport type { RuntimeAdapter, RuntimeSpawnOptions } from './types'\n\n/**\n * Map stdio option to Deno-compatible value.\n * @internal\n */\nfunction mapDenoStdio(\n value: RuntimeSpawnOptions['stdout'] | undefined,\n defaultValue: 'piped' | 'null'\n): 'inherit' | 'piped' | 'null' {\n if (value === 'inherit') {\n return 'inherit'\n }\n if (value === 'ignore') {\n return 'null'\n }\n return defaultValue\n}\n\n/**\n * Create a RuntimeAdapter for the Deno runtime.\n * @internal\n */\nexport function createDenoAdapter(): RuntimeAdapter {\n return {\n kind: 'deno',\n spawn(command, options = {}) {\n const [cmd, ...args] = command\n if (!cmd) {\n throw new Error('[RuntimeAdapter] spawn() requires a command')\n }\n const deno = (globalThis as any).Deno\n if (!deno?.Command) {\n throw new Error('[RuntimeAdapter] Deno runtime is required for spawn()')\n }\n\n const proc = new deno.Command(cmd, {\n args,\n cwd: options.cwd,\n env: options.env,\n stdin: mapDenoStdio(options.stdin, 'piped'),\n stdout: mapDenoStdio(options.stdout, 'piped'),\n stderr: mapDenoStdio(options.stderr, 'piped'),\n }).spawn()\n\n let timeoutHandle: number | undefined\n let abortListener: (() => void) | undefined\n\n const exitedWithTimeout = new Promise<number>((resolve, reject) => {\n if (options.timeout) {\n timeoutHandle = setTimeout(() => {\n proc.kill('SIGTERM')\n reject(new Error('[RuntimeAdapter] Process timeout'))\n }, options.timeout) as unknown as number\n }\n\n if (options.signal) {\n abortListener = () => {\n proc.kill('SIGTERM')\n reject(new DOMException('Aborted', 'AbortError'))\n }\n options.signal.addEventListener('abort', abortListener)\n }\n\n proc.status\n .then((status: { code: number }) => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle)\n }\n if (abortListener && options.signal) {\n options.signal.removeEventListener('abort', abortListener)\n }\n resolve(status.code ?? 0)\n })\n .catch(reject)\n })\n\n return {\n exited: exitedWithTimeout,\n stdout: (proc.stdout as unknown as ReadableStream<Uint8Array>) ?? null,\n stderr: (proc.stderr as unknown as ReadableStream<Uint8Array>) ?? null,\n kill: (signal?: string | number) => {\n const killSignal = typeof signal === 'string' ? signal : 'SIGTERM'\n proc.kill(killSignal)\n },\n }\n },\n async spawnAndCollect(command, options = {}) {\n const [cmd, ...args] = command\n if (!cmd) {\n throw new Error('[RuntimeAdapter] spawn() requires a command')\n }\n const deno = (globalThis as any).Deno\n if (!deno?.Command) {\n throw new Error('[RuntimeAdapter] Deno runtime is required for spawn()')\n }\n\n const proc = new deno.Command(cmd, {\n args,\n cwd: options.cwd,\n env: options.env,\n stdout: 'piped',\n stderr: 'piped',\n stdin: mapDenoStdio(options.stdin, 'null'),\n }).spawn()\n\n let timedOut = false\n let timeoutHandle: number | undefined\n let abortListener: (() => void) | undefined\n\n const statusPromise = proc.status.then((status: { code: number; success: boolean }) => ({\n code: status.code ?? 0,\n timedOut,\n }))\n\n if (options.timeout) {\n const timeoutPromise = new Promise<{\n code: number\n timedOut: boolean\n }>((resolve) => {\n timeoutHandle = setTimeout(() => {\n timedOut = true\n proc.kill('SIGTERM')\n resolve({ code: -1, timedOut: true })\n }, options.timeout) as unknown as number\n })\n\n const raceResult = await Promise.race([statusPromise, timeoutPromise])\n\n if (timeoutHandle) {\n clearTimeout(timeoutHandle)\n }\n\n const [stdoutText, stderrText] = await Promise.all([\n new Response(proc.stdout ?? null).text(),\n new Response(proc.stderr ?? null).text(),\n ])\n\n return {\n exitCode: raceResult.code,\n stdout: stdoutText,\n stderr: stderrText,\n success: raceResult.code === 0 && !raceResult.timedOut,\n timedOut: raceResult.timedOut,\n }\n }\n\n if (options.signal) {\n abortListener = () => {\n proc.kill('SIGTERM')\n }\n options.signal.addEventListener('abort', abortListener)\n }\n\n const { code, timedOut: timeout } = await statusPromise\n\n if (abortListener && options.signal) {\n options.signal.removeEventListener('abort', abortListener)\n }\n\n const [stdoutText, stderrText] = await Promise.all([\n new Response(proc.stdout ?? null).text(),\n new Response(proc.stderr ?? null).text(),\n ])\n\n return {\n exitCode: code,\n stdout: stdoutText,\n stderr: stderrText,\n success: code === 0 && !timeout,\n timedOut: timeout,\n }\n },\n spawnSync(command, options = {}) {\n const [cmd, ...args] = command\n if (!cmd) {\n throw new Error('[RuntimeAdapter] spawn() requires a command')\n }\n const deno = (globalThis as any).Deno\n if (!deno?.Command) {\n throw new Error('[RuntimeAdapter] Deno runtime is required for spawnSync()')\n }\n\n const result = new deno.Command(cmd, {\n args,\n cwd: options.cwd,\n env: options.env,\n stdin: mapDenoStdio(options.stdin, 'null'),\n }).outputSync()\n\n const decoder = new TextDecoder('utf-8', {\n fatal: false,\n })\n const stdoutText = decoder.decode(result.stdout ?? new Uint8Array())\n const stderrText = decoder.decode(result.stderr ?? new Uint8Array())\n\n return {\n exitCode: result.code ?? 0,\n stdout: stdoutText,\n stderr: stderrText,\n success: (result.code ?? 0) === 0,\n timedOut: false,\n }\n },\n async writeFile(path, data) {\n const deno = (globalThis as any).Deno\n if (!deno?.writeFile) {\n throw new Error('[RuntimeAdapter] Deno runtime is required for writeFile()')\n }\n const payload = await toUint8Array(data)\n await deno.writeFile(path, payload)\n },\n async readFile(path) {\n const deno = (globalThis as any).Deno\n if (!deno?.readFile) {\n throw new Error('[RuntimeAdapter] Deno runtime is required for readFile()')\n }\n return await deno.readFile(path)\n },\n async readFileAsBlob(path) {\n const buffer = await this.readFile(path)\n return new Blob([buffer as unknown as BlobPart])\n },\n async exists(path) {\n const deno = (globalThis as any).Deno\n if (!deno?.stat) {\n throw new Error('[RuntimeAdapter] Deno runtime is required for exists()')\n }\n try {\n await deno.stat(path)\n return true\n } catch {\n return false\n }\n },\n async stat(path) {\n const deno = (globalThis as any).Deno\n if (!deno?.stat) {\n throw new Error('[RuntimeAdapter] Deno runtime is required for stat()')\n }\n const stats = await deno.stat(path)\n return { size: stats.size }\n },\n async deleteFile(path) {\n const deno = (globalThis as any).Deno\n if (!deno?.remove) {\n throw new Error('[RuntimeAdapter] Deno runtime is required for deleteFile()')\n }\n try {\n await deno.remove(path)\n } catch {\n // Ignore if not found\n }\n },\n serve(_config) {\n throw new Error('[RuntimeAdapter] Bun runtime is required for Bun.serve()')\n },\n }\n}\n",
76
- "/**\n * Node.js runtime adapter implementation.\n *\n * @module runtime/adapter-node\n * @since 3.2.0\n */\n\nimport { toUint8Array } from './detection'\nimport type { RuntimeAdapter, RuntimeSpawnOptions } from './types'\n\n/**\n * Create a RuntimeAdapter for the Node.js runtime.\n * @internal\n */\nexport function createNodeAdapter(): RuntimeAdapter {\n return {\n kind: 'node',\n spawn(command, options = {}) {\n const [cmd, ...args] = command\n if (!cmd) {\n throw new Error('[RuntimeAdapter] spawn() requires a command')\n }\n\n // biome-ignore lint: node context\n const childProcess = require('node:child_process')\n // biome-ignore lint: node context\n const stream = require('node:stream')\n\n const stdioMap = (value: RuntimeSpawnOptions['stdout']) => {\n if (value === 'inherit') return 'inherit'\n if (value === 'ignore') return 'ignore'\n return 'pipe'\n }\n const stdinMap = (value: RuntimeSpawnOptions['stdin']) => {\n if (value === 'inherit') return 'inherit'\n if (value === 'ignore') return 'ignore'\n return 'pipe'\n }\n\n const child = childProcess.spawn(cmd, args, {\n cwd: options.cwd,\n env: options.env as Record<string, string>,\n stdio: [stdinMap(options.stdin), stdioMap(options.stdout), stdioMap(options.stderr)],\n }) as import('node:child_process').ChildProcess\n\n const toWeb = (streamReadable: NodeJS.ReadableStream | null) => {\n if (!streamReadable) return null\n const maybeWeb = streamReadable as unknown as ReadableStream<Uint8Array>\n if (typeof (maybeWeb as any).getReader === 'function') return maybeWeb\n return stream.Readable.toWeb(streamReadable as any) as unknown as ReadableStream<Uint8Array>\n }\n\n let timeoutHandle: NodeJS.Timeout | undefined\n let abortListener: (() => void) | undefined\n\n const exitedWithTimeout = new Promise<number>((resolve, reject) => {\n if (options.timeout) {\n timeoutHandle = setTimeout(() => {\n child.kill('SIGTERM')\n reject(new Error('[RuntimeAdapter] Process timeout'))\n }, options.timeout)\n }\n\n if (options.signal) {\n abortListener = () => {\n child.kill('SIGTERM')\n reject(new DOMException('Aborted', 'AbortError'))\n }\n options.signal.addEventListener('abort', abortListener)\n }\n\n child.on('error', reject)\n child.on('exit', (code) => {\n if (timeoutHandle) clearTimeout(timeoutHandle)\n if (abortListener && options.signal)\n options.signal.removeEventListener('abort', abortListener)\n resolve(code ?? 0)\n })\n })\n\n return {\n exited: exitedWithTimeout,\n stdout: toWeb(child.stdout),\n stderr: toWeb(child.stderr),\n kill: (signal?: string | number) => child.kill(signal as NodeJS.Signals | number),\n unref: () => {\n child.unref()\n },\n resourceUsage: async () => {\n try {\n const usage = (child as any).resourceUsage?.()\n if (!usage) return undefined\n return {\n cpuTime:\n usage.user && usage.system ? { user: usage.user, system: usage.system } : undefined,\n maxRSS: usage.maxRss,\n }\n } catch {\n return undefined\n }\n },\n }\n },\n async spawnAndCollect(command, options = {}) {\n const [cmd, ...args] = command\n if (!cmd) throw new Error('[RuntimeAdapter] spawn() requires a command')\n\n // biome-ignore lint: node context\n const childProcess = require('node:child_process')\n\n return new Promise((resolve, reject) => {\n let timedOut = false\n let timeoutHandle: NodeJS.Timeout | undefined\n let abortListener: (() => void) | undefined\n\n const child = childProcess.spawn(cmd, args, {\n cwd: options.cwd,\n env: options.env as Record<string, string>,\n stdio: ['pipe', 'pipe', 'pipe'],\n }) as import('node:child_process').ChildProcess\n\n const stdoutChunks: Buffer[] = []\n const stderrChunks: Buffer[] = []\n\n child.stdout?.on('data', (chunk) => stdoutChunks.push(chunk))\n child.stderr?.on('data', (chunk) => stderrChunks.push(chunk))\n\n if (options.timeout) {\n timeoutHandle = setTimeout(() => {\n timedOut = true\n child.kill('SIGTERM')\n }, options.timeout)\n }\n\n if (options.signal) {\n abortListener = () => {\n child.kill('SIGTERM')\n }\n options.signal.addEventListener('abort', abortListener)\n }\n\n child.on('error', reject)\n child.on('exit', (code) => {\n if (timeoutHandle) clearTimeout(timeoutHandle)\n if (abortListener && options.signal)\n options.signal.removeEventListener('abort', abortListener)\n\n const stdout = Buffer.concat(stdoutChunks).toString('utf-8')\n const stderr = Buffer.concat(stderrChunks).toString('utf-8')\n\n resolve({\n exitCode: code ?? 0,\n stdout,\n stderr,\n success: (code ?? 0) === 0 && !timedOut,\n timedOut,\n })\n })\n })\n },\n spawnSync(command, options = {}) {\n const [cmd, ...args] = command\n if (!cmd) throw new Error('[RuntimeAdapter] spawn() requires a command')\n\n // biome-ignore lint: node context\n const childProcess = require('node:child_process')\n\n const result = childProcess.spawnSync(cmd, args, {\n cwd: options.cwd,\n env: options.env as Record<string, string>,\n encoding: 'utf-8',\n })\n\n return {\n exitCode: result.status ?? 0,\n stdout: (result.stdout ?? '') as string,\n stderr: (result.stderr ?? '') as string,\n success: (result.status ?? 0) === 0,\n timedOut: (result.error as any)?.code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER',\n }\n },\n async writeFile(path, data) {\n const fs = await import('node:fs/promises')\n const payload = await toUint8Array(data)\n await fs.writeFile(path, payload)\n },\n async readFile(path) {\n const fs = await import('node:fs/promises')\n const buffer = await fs.readFile(path)\n return new Uint8Array(buffer)\n },\n async readFileAsBlob(path) {\n const buffer = await this.readFile(path)\n return new Blob([buffer as unknown as BlobPart])\n },\n async exists(path) {\n const fs = await import('node:fs/promises')\n try {\n await fs.access(path)\n return true\n } catch {\n return false\n }\n },\n async stat(path) {\n const fs = await import('node:fs/promises')\n const stats = await fs.stat(path)\n return { size: stats.size }\n },\n async deleteFile(path) {\n const fs = await import('node:fs/promises')\n try {\n await fs.unlink(path)\n } catch {\n // Ignore if not found\n }\n },\n serve(_config) {\n throw new Error('[RuntimeAdapter] Bun runtime is required for Bun.serve()')\n },\n }\n}\n",
77
- "/**\n * Unknown runtime adapter implementation (fallback).\n *\n * @module runtime/adapter-unknown\n * @since 3.2.0\n */\n\nimport type { RuntimeAdapter } from './types'\n\n/**\n * Create a RuntimeAdapter for unsupported runtimes.\n * All methods throw with descriptive error messages.\n * @internal\n */\nexport function createUnknownAdapter(): RuntimeAdapter {\n return {\n kind: 'unknown',\n spawn() {\n throw new Error('[RuntimeAdapter] Unsupported runtime for spawn()')\n },\n async spawnAndCollect() {\n throw new Error('[RuntimeAdapter] Unsupported runtime for spawnAndCollect()')\n },\n spawnSync() {\n throw new Error('[RuntimeAdapter] Unsupported runtime for spawnSync()')\n },\n async writeFile() {\n throw new Error('[RuntimeAdapter] Unsupported runtime for writeFile()')\n },\n async readFile() {\n throw new Error('[RuntimeAdapter] Unsupported runtime for readFile()')\n },\n async readFileAsBlob() {\n throw new Error('[RuntimeAdapter] Unsupported runtime for readFileAsBlob()')\n },\n async exists() {\n throw new Error('[RuntimeAdapter] Unsupported runtime for exists()')\n },\n async stat() {\n throw new Error('[RuntimeAdapter] Unsupported runtime for stat()')\n },\n async deleteFile() {\n throw new Error('[RuntimeAdapter] Unsupported runtime for deleteFile()')\n },\n serve() {\n throw new Error('[RuntimeAdapter] Unsupported runtime for serve()')\n },\n }\n}\n",
78
- "/**\n * Runtime archive adapter implementations.\n *\n * @module runtime/archive\n * @since 3.2.0\n */\n\nimport { getRuntimeKind } from './detection'\nimport type {\n ArchiveCreateOptions,\n ArchiveFromDirectoryOptions,\n RuntimeArchiveAdapter,\n} from './types'\n\n// ============ Bun Archive Adapter ============\n\n/**\n * 建立 Bun 原生封裝 adapter (使用 Bun.Tar)\n * @internal\n */\nfunction createBunArchiveAdapter(): RuntimeArchiveAdapter {\n return {\n async create(entries, _options = {}) {\n // Use globalThis to avoid Vite import errors\n const B = (globalThis as any).Bun\n if (!B) throw new Error('[RuntimeArchiveAdapter] Bun global not found')\n if (!B.Tar) throw new Error('[RuntimeArchiveAdapter] Bun.Tarball is not available')\n\n const tar = new B.Tar()\n for (const [path, data] of Object.entries(entries)) {\n // Handle different data types\n let content: Uint8Array\n if (data instanceof Uint8Array) {\n content = data\n } else if (typeof data === 'string') {\n content = new TextEncoder().encode(data)\n } else if (data instanceof ArrayBuffer) {\n content = new Uint8Array(data)\n } else if (data instanceof Blob) {\n content = new Uint8Array(await data.arrayBuffer())\n } else {\n throw new Error(`[RuntimeArchiveAdapter] Unsupported data type for path: ${path}`)\n }\n tar.append(path, content)\n }\n return new Uint8Array(await new Response(tar.out).arrayBuffer())\n },\n\n async extract(_data, _targetDir, _options = {}) {\n const B = (globalThis as any).Bun\n if (!B?.Tar) throw new Error('[RuntimeArchiveAdapter] Bun.Tarball is not available')\n throw new Error('[RuntimeArchiveAdapter] Tar extraction not yet implemented via Bun.Tar')\n },\n\n async list(_data, _glob?) {\n const B = (globalThis as any).Bun\n if (!B?.Tar) throw new Error('[RuntimeArchiveAdapter] Bun.Tarball is not available')\n throw new Error('[RuntimeArchiveAdapter] Tar listing not yet implemented via Bun.Tar')\n },\n\n async readFile(_data, _filePath) {\n const B = (globalThis as any).Bun\n if (!B?.Tar) throw new Error('[RuntimeArchiveAdapter] Bun.Tarball is not available')\n throw new Error('[RuntimeArchiveAdapter] Tar readFile not yet implemented via Bun.Tar')\n },\n }\n}\n\n// ============ Node.js Archive Adapter ============\n\n/**\n * 建立 Node.js 封裝 adapter\n * @internal\n */\nfunction createNodeArchiveAdapter(): RuntimeArchiveAdapter {\n return {\n async create(_entries, _options = {}) {\n throw new Error(\n '[RuntimeArchiveAdapter] Node.js archive creation requires external dependencies'\n )\n },\n async extract(_data, _targetDir, _options = {}) {\n throw new Error(\n '[RuntimeArchiveAdapter] Node.js archive extraction requires external dependencies'\n )\n },\n async list(_data, _glob?) {\n throw new Error(\n '[RuntimeArchiveAdapter] Node.js archive listing requires external dependencies'\n )\n },\n async readFile(_data, _filePath) {\n throw new Error(\n '[RuntimeArchiveAdapter] Node.js archive readFile requires external dependencies'\n )\n },\n }\n}\n\n// ============ Unsupported Archive Adapter ============\n\n/**\n * 建立不支援的封裝 adapter\n * @internal\n */\nfunction createUnsupportedArchiveAdapter(message: string): RuntimeArchiveAdapter {\n return {\n async create() {\n throw new Error(message)\n },\n async extract() {\n throw new Error(message)\n },\n async list() {\n throw new Error(message)\n },\n async readFile() {\n throw new Error(message)\n },\n }\n}\n\n// ============ Singleton ============\n\nlet archiveAdapter: RuntimeArchiveAdapter | null = null\n\n/**\n * 取得封裝操作 adapter\n * @public\n */\nexport function getArchiveAdapter(): RuntimeArchiveAdapter {\n if (archiveAdapter) {\n return archiveAdapter\n }\n const kind = getRuntimeKind()\n switch (kind) {\n case 'bun':\n archiveAdapter = createBunArchiveAdapter()\n break\n case 'node':\n archiveAdapter = createNodeArchiveAdapter()\n break\n default:\n archiveAdapter = createUnsupportedArchiveAdapter(\n `[RuntimeArchiveAdapter] Archive operations unavailable in unknown runtime: ${kind}`\n )\n }\n return archiveAdapter\n}\n\n/**\n * 使用 Node.js readdir 遞迴掃描目錄(Fallback 實作)\n * @internal\n */\nasync function scanDirectoryNode(dir: string): Promise<Record<string, Uint8Array>> {\n // biome-ignore lint/security/noGlobalEval: hide from Vite\n const fs = await eval('import(\"node:fs/promises\")')\n // biome-ignore lint/security/noGlobalEval: hide from Vite\n const path = await eval('import(\"node:path\")')\n\n const { readdir, readFile, stat } = fs\n const { join } = path\n const entries: Record<string, Uint8Array> = {}\n\n async function walk(currentDir: string, base: string) {\n const files = await readdir(currentDir)\n for (const file of files) {\n const fullPath = join(currentDir, file)\n const relativePath = join(base, file)\n const s = await stat(fullPath)\n\n if (s.isDirectory()) {\n await walk(fullPath, relativePath)\n } else {\n entries[relativePath] = new Uint8Array(await readFile(fullPath))\n }\n }\n }\n\n await walk(dir, '')\n return entries\n}\n\n/**\n * 將目錄封裝為歸檔檔案\n * @public\n */\nexport async function archiveFromDirectory(\n dirPath: string,\n archivePath: string,\n options: ArchiveFromDirectoryOptions = {}\n): Promise<Uint8Array> {\n // Validate archivePath\n if (!archivePath) {\n throw new Error('archivePath cannot be empty')\n }\n if (!archivePath.endsWith('.tar.gz') && !archivePath.endsWith('.tgz')) {\n throw new Error('archivePath must end with .tar.gz or .tgz')\n }\n\n const kind = getRuntimeKind()\n const createOptions: ArchiveCreateOptions = {\n compress: options.compress === 'gzip' ? 'gzip' : undefined,\n level: options.level,\n }\n\n let entries: Record<string, Uint8Array> = {}\n\n if (kind === 'bun') {\n const B = (globalThis as any).Bun\n const glob = new B.Glob(options.glob ?? '**/*')\n for await (const file of glob.scan(dirPath)) {\n // biome-ignore lint/security/noGlobalEval: hide from Vite\n const pathMod = await eval('import(\"node:path\")')\n const filePath = pathMod.join(dirPath, file)\n entries[file] = new Uint8Array(await B.file(filePath).arrayBuffer())\n }\n } else {\n entries = await scanDirectoryNode(dirPath)\n }\n\n const adapter = getArchiveAdapter()\n const archiveData = await adapter.create(entries, createOptions)\n\n // biome-ignore lint/security/noGlobalEval: hide from Vite\n const fs = await eval('import(\"node:fs/promises\")')\n await fs.writeFile(archivePath, archiveData)\n\n return archiveData\n}\n",
79
- "/**\n * Runtime compression adapter implementations.\n *\n * Provides unified gzip/deflate compression across Bun and Node.js runtimes.\n * Bun uses native C++ implementations (Bun.gzipSync etc.) for 2-5x better performance.\n * Node.js falls back to the standard node:zlib module.\n *\n * @module runtime/compression\n * @since 3.2.0\n */\n\nimport { getRuntimeKind } from './detection'\nimport type { RuntimeCompressionAdapter } from './types'\n\n// ============ Bun Compression Adapter ============\n\n/**\n * 建立 Bun 原生壓縮 adapter\n * 使用 Bun.gzipSync / Bun.gunzipSync / Bun.deflateSync / Bun.inflateSync\n * @internal\n */\nfunction createBunCompressionAdapter(): RuntimeCompressionAdapter {\n // Bun 壓縮等級型別\n type BunLevel = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -1\n\n // Bun API 要求 Uint8Array<ArrayBuffer>,確保型別相容\n function toBunBuffer(data: Uint8Array): Uint8Array<ArrayBuffer> {\n const buf = new ArrayBuffer(data.byteLength)\n const view = new Uint8Array(buf)\n view.set(data)\n return view\n }\n\n function toLevel(level: number): BunLevel {\n return Math.max(-1, Math.min(12, level)) as BunLevel\n }\n\n return {\n gzipSync(data, options = {}) {\n return Bun.gzipSync(toBunBuffer(data), {\n level: toLevel(options.level ?? 6),\n })\n },\n\n gunzipSync(data) {\n return Bun.gunzipSync(toBunBuffer(data))\n },\n\n deflateSync(data, options = {}) {\n return Bun.deflateSync(toBunBuffer(data), {\n level: toLevel(options.level ?? 6),\n })\n },\n\n inflateSync(data) {\n return Bun.inflateSync(toBunBuffer(data))\n },\n\n async gzip(data, options = {}) {\n return Bun.gzipSync(toBunBuffer(data), {\n level: toLevel(options.level ?? 6),\n })\n },\n\n async gunzip(data) {\n return Bun.gunzipSync(toBunBuffer(data))\n },\n }\n}\n\n// ============ Node.js Compression Adapter ============\n\n/**\n * 建立 Node.js 壓縮 adapter(使用 node:zlib)\n * @internal\n */\nfunction createNodeCompressionAdapter(): RuntimeCompressionAdapter {\n return {\n gzipSync(data, options = {}) {\n // biome-ignore lint: node context\n const zlib = require('node:zlib')\n const result = zlib.gzipSync(Buffer.from(data), {\n level: options.level ?? 6,\n })\n return new Uint8Array(result)\n },\n\n gunzipSync(data) {\n // biome-ignore lint: node context\n const zlib = require('node:zlib')\n const result = zlib.gunzipSync(Buffer.from(data))\n return new Uint8Array(result)\n },\n\n deflateSync(data, options = {}) {\n // biome-ignore lint: node context\n const zlib = require('node:zlib')\n const result = zlib.deflateSync(Buffer.from(data), {\n level: options.level ?? 6,\n })\n return new Uint8Array(result)\n },\n\n inflateSync(data) {\n // biome-ignore lint: node context\n const zlib = require('node:zlib')\n const result = zlib.inflateSync(Buffer.from(data))\n return new Uint8Array(result)\n },\n\n async gzip(data, options = {}) {\n const zlib = await import('node:zlib')\n const { promisify } = await import('node:util')\n const gzipAsync = promisify(zlib.gzip)\n const result = await gzipAsync(Buffer.from(data), {\n level: options.level ?? 6,\n })\n return new Uint8Array(result)\n },\n\n async gunzip(data) {\n const zlib = await import('node:zlib')\n const { promisify } = await import('node:util')\n const gunzipAsync = promisify(zlib.gunzip)\n const result = await gunzipAsync(Buffer.from(data))\n return new Uint8Array(result)\n },\n }\n}\n\n// ============ Unsupported Compression Adapter ============\n\n/**\n * 建立不支援的壓縮 adapter(Deno / Unknown runtime 共用)\n * @internal\n */\nfunction createUnsupportedCompressionAdapter(message: string): RuntimeCompressionAdapter {\n return {\n gzipSync() {\n throw new Error(message)\n },\n gunzipSync() {\n throw new Error(message)\n },\n deflateSync() {\n throw new Error(message)\n },\n inflateSync() {\n throw new Error(message)\n },\n async gzip() {\n throw new Error(message)\n },\n async gunzip() {\n throw new Error(message)\n },\n }\n}\n\n// ============ Singleton ============\n\nlet compressionAdapter: RuntimeCompressionAdapter | null = null\n\n/**\n * 取得壓縮操作 adapter(依運行時自動選擇最佳實作)\n *\n * - Bun: 使用原生 C++ 壓縮(2-5x 更快)\n * - Node.js: 使用 node:zlib\n * - Deno/Unknown: 拋出錯誤\n *\n * @public\n */\nexport function getCompressionAdapter(): RuntimeCompressionAdapter {\n if (compressionAdapter) {\n return compressionAdapter\n }\n const kind = getRuntimeKind()\n switch (kind) {\n case 'bun':\n compressionAdapter = createBunCompressionAdapter()\n break\n case 'node':\n compressionAdapter = createNodeCompressionAdapter()\n break\n case 'deno':\n compressionAdapter = createUnsupportedCompressionAdapter(\n '[RuntimeCompressionAdapter] Deno compression support not yet implemented'\n )\n break\n default:\n compressionAdapter = createUnsupportedCompressionAdapter(\n '[RuntimeCompressionAdapter] Compression unavailable in unknown runtime'\n )\n }\n return compressionAdapter\n}\n",
80
- "/**\n * Runtime markdown adapter implementations.\n *\n * Provides unified Markdown -> HTML rendering across Bun and Node.js runtimes.\n * Bun uses the native C++ Markdown parser (Bun.markdown) for 10-100x better performance.\n * Node.js falls back to the `marked` library (lazy-loaded optional dependency).\n *\n * @module runtime/markdown\n * @since 3.3.0\n */\n\nimport { getRuntimeKind } from './detection'\nimport type {\n MarkdownRenderCallbacks,\n MarkdownRenderOptions,\n RuntimeMarkdownAdapter,\n} from './types'\n\n// ============ Default HTML Render Callbacks ============\n\n/**\n * 建立預設的 HTML 渲染回調集合。\n *\n * 提供完整的 HTML 元素生成回調,產生與 `html()` 相同的 HTML 輸出。\n * 使用者可透過覆寫個別回調來自訂特定元素的渲染行為(例如 XSS 防護、\n * 自訂 CSS class 等),同時保留其他元素的預設 HTML 渲染。\n *\n * @param overrides - 要覆寫的回調。未指定的回調使用預設 HTML 渲染。\n * @returns 完整的 MarkdownRenderCallbacks 物件\n *\n * @example\n * ```typescript\n * // 自訂 link 和 html 渲染(XSS 防護)\n * const callbacks = createHtmlRenderCallbacks({\n * html: (raw) => escapeHtml(raw),\n * link: (content, { href }) => `<a href=\"${href}\" rel=\"noopener\">${content}</a>`,\n * })\n * const result = adapter.render(markdown, callbacks)\n * ```\n *\n * @public\n */\nexport function createHtmlRenderCallbacks(\n overrides: Partial<MarkdownRenderCallbacks> = {}\n): MarkdownRenderCallbacks {\n const defaults: MarkdownRenderCallbacks = {\n heading: (content, opts) => `<h${opts.level}>${content}</h${opts.level}>\\n`,\n paragraph: (content) => `<p>${content}</p>\\n`,\n code: (code, opts) => {\n const lang = opts.language ? ` class=\"language-${opts.language}\"` : ''\n return `<pre><code${lang}>${code}</code></pre>\\n`\n },\n codespan: (code) => `<code>${code}</code>`,\n strong: (content) => `<strong>${content}</strong>`,\n em: (content) => `<em>${content}</em>`,\n del: (content) => `<del>${content}</del>`,\n link: (content, opts) => {\n const titleAttr = opts.title ? ` title=\"${opts.title}\"` : ''\n return `<a href=\"${opts.href}\"${titleAttr}>${content}</a>`\n },\n image: (alt, opts) => {\n const titleAttr = opts.title ? ` title=\"${opts.title}\"` : ''\n return `<img src=\"${opts.src}\" alt=\"${alt}\"${titleAttr} />`\n },\n list: (content, opts) => {\n if (opts.ordered) {\n const start = opts.start && opts.start !== 1 ? ` start=\"${opts.start}\"` : ''\n return `<ol${start}>\\n${content}</ol>\\n`\n }\n return `<ul>\\n${content}</ul>\\n`\n },\n listItem: (content) => `<li>${content}</li>\\n`,\n blockquote: (content) => `<blockquote>\\n${content}</blockquote>\\n`,\n table: (content) => `<table>\\n${content}</table>\\n`,\n hr: () => '<hr />\\n',\n html: (rawHtml) => rawHtml,\n }\n\n return { ...defaults, ...overrides }\n}\n\n// ============ Callback Adapter ============\n\n/**\n * 將 MarkdownRenderCallbacks 轉換為 Bun.markdown.render 的 RenderCallbacks 格式。\n *\n * 我們的介面設計與 Bun 原生回調高度相似但有微小差異(如 code 的 meta 參數可選性),\n * 此函式負責建立轉接層以確保型別安全。\n *\n * @internal\n */\nfunction toBunRenderCallbacks(\n callbacks: MarkdownRenderCallbacks\n): Record<string, (...args: unknown[]) => string | null | undefined> {\n const result: Record<string, (...args: unknown[]) => string | null | undefined> = {}\n\n if (callbacks.heading) {\n const cb = callbacks.heading\n result.heading = (children: unknown, meta: unknown) => {\n const m = meta as { level: number }\n return cb(children as string, { level: m.level })\n }\n }\n\n if (callbacks.link) {\n const cb = callbacks.link\n result.link = (children: unknown, meta: unknown) => {\n const m = meta as { href: string; title?: string }\n return cb(children as string, { href: m.href, title: m.title })\n }\n }\n\n if (callbacks.code) {\n const cb = callbacks.code\n result.code = (children: unknown, meta?: unknown) => {\n const m = (meta as { language?: string } | undefined) ?? {}\n return cb(children as string, { language: m.language })\n }\n }\n\n if (callbacks.codespan) {\n const cb = callbacks.codespan\n result.codespan = (children: unknown) => cb(children as string)\n }\n\n if (callbacks.image) {\n const cb = callbacks.image\n result.image = (alt: unknown, meta: unknown) => {\n const m = meta as { src: string; title?: string }\n return cb(alt as string, { src: m.src, title: m.title })\n }\n }\n\n if (callbacks.html) {\n const cb = callbacks.html\n result.html = (rawHtml: unknown) => cb(rawHtml as string)\n }\n\n if (callbacks.paragraph) {\n const cb = callbacks.paragraph\n result.paragraph = (children: unknown) => cb(children as string)\n }\n\n if (callbacks.strong) {\n const cb = callbacks.strong\n result.strong = (children: unknown) => cb(children as string)\n }\n\n if (callbacks.em) {\n const cb = callbacks.em\n result.em = (children: unknown) => cb(children as string)\n }\n\n if (callbacks.del) {\n const cb = callbacks.del\n result.del = (children: unknown) => cb(children as string)\n }\n\n if (callbacks.list) {\n const cb = callbacks.list\n result.list = (children: unknown, meta: unknown) => {\n const m = meta as { ordered: boolean; start?: number }\n return cb(children as string, { ordered: m.ordered, start: m.start })\n }\n }\n\n if (callbacks.listItem) {\n const cb = callbacks.listItem\n result.listItem = (children: unknown) => cb(children as string)\n }\n\n if (callbacks.blockquote) {\n const cb = callbacks.blockquote\n result.blockquote = (children: unknown) => cb(children as string)\n }\n\n if (callbacks.table) {\n const cb = callbacks.table\n result.table = (children: unknown) => cb(children as string)\n }\n\n if (callbacks.hr) {\n const cb = callbacks.hr\n result.hr = () => cb()\n }\n\n return result\n}\n\n// ============ Bun Markdown Adapter ============\n\n/**\n * 建立 Bun 原生 Markdown adapter(使用 Bun.markdown API)\n * @internal\n */\nfunction createBunMarkdownAdapter(): RuntimeMarkdownAdapter {\n // 驗證 Bun.markdown 是否可用\n if (\n typeof Bun === 'undefined' ||\n typeof Bun.markdown !== 'object' ||\n typeof Bun.markdown.html !== 'function'\n ) {\n throw new Error('[RuntimeMarkdownAdapter] Bun.markdown is not available in this Bun version')\n }\n\n const bunMd = Bun.markdown\n\n return {\n html(markdown: string, _options?: MarkdownRenderOptions): string {\n if (!markdown) {\n return ''\n }\n return bunMd.html(markdown)\n },\n\n render(markdown: string, callbacks?: MarkdownRenderCallbacks): string {\n if (!markdown) {\n return ''\n }\n if (!callbacks) {\n return bunMd.render(markdown)\n }\n // 透過轉接層將我們的回調格式映射到 Bun 原生格式\n const bunCallbacks = toBunRenderCallbacks(callbacks)\n return bunMd.render(markdown, bunCallbacks as unknown as Parameters<typeof bunMd.render>[1])\n },\n\n react(markdown: string): unknown | null {\n if (!markdown) {\n return null\n }\n return bunMd.react(markdown)\n },\n\n get isNative() {\n return true\n },\n }\n}\n\n// ============ Fallback Markdown Adapter (Node.js) ============\n\n/**\n * 建立 Node.js Fallback Markdown adapter。\n * 使用 marked 函式庫進行延遲載入(optional dependency)。\n *\n * marked 不在 core 的硬性依賴中,僅在 Node.js 環境下需要。\n * 若 marked 不可用,html() 和 render() 會拋出錯誤。\n *\n * @internal\n */\nfunction createFallbackMarkdownAdapter(): RuntimeMarkdownAdapter {\n // 延遲載入 marked(避免型別依賴問題)\n // biome-ignore lint/suspicious/noExplicitAny: marked 為 optional dependency,無法保證型別\n let markedModule: any | null = null\n\n function loadMarkedSync(): {\n marked: { parse: (...args: unknown[]) => unknown }\n Renderer: new () => Record<string, unknown>\n } {\n if (!markedModule) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n markedModule = require('marked')\n } catch {\n throw new Error(\n '[RuntimeMarkdownAdapter] Node.js markdown support requires \"marked\" package. ' +\n 'Install: npm install --save marked'\n )\n }\n }\n return markedModule as {\n marked: { parse: (...args: unknown[]) => unknown }\n Renderer: new () => Record<string, unknown>\n }\n }\n\n return {\n html(markdown: string, _options?: MarkdownRenderOptions): string {\n if (!markdown) {\n return ''\n }\n const { marked } = loadMarkedSync()\n const result = marked.parse(markdown, { async: false })\n return result as string\n },\n\n render(markdown: string, callbacks?: MarkdownRenderCallbacks): string {\n if (!markdown) {\n return ''\n }\n const { marked, Renderer } = loadMarkedSync()\n\n if (!callbacks) {\n // 無回調時回傳純文字(去除 HTML 標籤)\n const html = marked.parse(markdown, { async: false }) as string\n return html.replace(/<[^>]*>/g, '')\n }\n\n // 建立自訂 Renderer 並映射回調\n // biome-ignore lint/suspicious/noExplicitAny: marked Renderer 型別為 dynamic\n const renderer = new Renderer() as any\n\n if (callbacks.heading) {\n const cb = callbacks.heading\n renderer.heading = (text: string, level: number) => cb(text, { level })\n }\n\n if (callbacks.link) {\n const cb = callbacks.link\n renderer.link = (href: string, title: string | null, text: string) =>\n cb(text, { href, title: title ?? undefined })\n }\n\n if (callbacks.code) {\n const cb = callbacks.code\n renderer.code = (code: string, language: string | undefined) => cb(code, { language })\n }\n\n if (callbacks.image) {\n const cb = callbacks.image\n renderer.image = (href: string, title: string | null, text: string) =>\n cb(text, { src: href, title: title ?? undefined })\n }\n\n if (callbacks.html) {\n const cb = callbacks.html\n renderer.html = (html: string) => cb(html)\n }\n\n if (callbacks.paragraph) {\n const cb = callbacks.paragraph\n renderer.paragraph = (text: string) => cb(text)\n }\n\n if (callbacks.strong) {\n const cb = callbacks.strong\n renderer.strong = (text: string) => cb(text)\n }\n\n if (callbacks.em) {\n const cb = callbacks.em\n renderer.em = (text: string) => cb(text)\n }\n\n const result = marked.parse(markdown, { renderer, async: false })\n return result as string\n },\n\n react(_markdown: string): unknown | null {\n // Fallback 環境不支援 react()\n return null\n },\n\n get isNative() {\n return false\n },\n }\n}\n\n// ============ Unsupported Markdown Adapter ============\n\n/**\n * 建立不支援的 Markdown adapter(Deno / Unknown runtime 共用)\n * @internal\n */\nfunction createUnsupportedMarkdownAdapter(message: string): RuntimeMarkdownAdapter {\n return {\n html() {\n throw new Error(message)\n },\n render() {\n throw new Error(message)\n },\n react() {\n throw new Error(message)\n },\n get isNative() {\n return false\n },\n }\n}\n\n// ============ Singleton ============\n\nlet markdownAdapter: RuntimeMarkdownAdapter | null = null\n\n/**\n * 取得 Markdown 操作 adapter(依運行時自動選擇最佳實作)\n *\n * - Bun: 使用原生 C++ Markdown 解析器(10-100x 更快)\n * - Node.js: 使用 marked 函式庫(延遲載入 optional dependency)\n * - Deno/Unknown: 拋出錯誤\n *\n * @public\n */\nexport function getMarkdownAdapter(): RuntimeMarkdownAdapter {\n if (markdownAdapter) {\n return markdownAdapter\n }\n const kind = getRuntimeKind()\n switch (kind) {\n case 'bun':\n markdownAdapter = createBunMarkdownAdapter()\n break\n case 'node':\n markdownAdapter = createFallbackMarkdownAdapter()\n break\n case 'deno':\n markdownAdapter = createUnsupportedMarkdownAdapter(\n '[RuntimeMarkdownAdapter] Deno markdown support not yet implemented. Use Bun or Node.js runtime.'\n )\n break\n default:\n markdownAdapter = createUnsupportedMarkdownAdapter(\n `[RuntimeMarkdownAdapter] Markdown support unavailable in unknown runtime. Detected: ${kind}`\n )\n }\n return markdownAdapter\n}\n",
81
- "/**\n * Deep equality comparison abstraction.\n *\n * Provides unified deep equality checking across Bun, Node.js, and Deno runtimes.\n * Uses Bun.deepEquals() when available, falls back to recursive comparison.\n *\n * @module runtime/deep-equals\n * @since 3.2.0\n */\n\nimport { getRuntimeKind } from './detection'\n\n/**\n * Options for deep equality comparison.\n * @public\n */\nexport interface DeepEqualsOptions {\n /**\n * When true, uses strict equality semantics:\n * - NaN !== NaN\n * - +0 !== -0\n *\n * When false (default), uses lenient semantics:\n * - NaN === NaN\n * - +0 === -0\n */\n strict?: boolean\n}\n\n/**\n * Function signature for deep equality comparison.\n * @public\n */\nexport type DeepEqualsFn = (a: unknown, b: unknown, options?: DeepEqualsOptions) => boolean\n\n/**\n * Creates a fallback deep equality function with cycle detection.\n *\n * Recursively compares objects, arrays, maps, sets, dates, and regexps.\n * Handles circular references using WeakSet tracking.\n *\n * @returns A deep equality comparison function.\n * @internal\n */\nfunction createFallbackDeepEquals(): DeepEqualsFn {\n return (a: unknown, b: unknown, options?: DeepEqualsOptions): boolean => {\n const visited = new WeakSet<object>()\n return deepEqualInternal(a, b, visited, options?.strict ?? false)\n }\n}\n\n/**\n * Internal recursive deep equality comparison.\n * @internal\n */\nfunction deepEqualInternal(\n a: unknown,\n b: unknown,\n visited: WeakSet<object>,\n strict: boolean\n): boolean {\n // 淺比較\n if (a === b) {\n return true\n }\n\n // null / undefined 檢查\n if (a == null || b == null) {\n return a === b\n }\n\n // 型別檢查\n const typeA = typeof a\n const typeB = typeof b\n if (typeA !== typeB) {\n return false\n }\n\n // 非物件型別(除了 object)\n if (typeA !== 'object') {\n // 特殊情況:NaN 比較\n // Bun.deepEquals 的行為:NaN === NaN 總是 true,無論嚴格模式\n if (Number.isNaN(a) && Number.isNaN(b)) {\n return true\n }\n // 其他情況:使用 === (包括 +0 !== -0)\n return a === b\n }\n\n // Date 比較\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime()\n }\n if (a instanceof Date || b instanceof Date) {\n return false\n }\n\n // RegExp 比較\n if (a instanceof RegExp && b instanceof RegExp) {\n return a.source === b.source && a.flags === b.flags\n }\n if (a instanceof RegExp || b instanceof RegExp) {\n return false\n }\n\n // 循環引用偵測\n const aObj = a as object\n const bObj = b as object\n if (visited.has(aObj) || visited.has(bObj)) {\n return a === b\n }\n visited.add(aObj)\n visited.add(bObj)\n\n // Array 比較\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false\n }\n return a.every((val, idx) => deepEqualInternal(val, b[idx], visited, strict))\n }\n if (Array.isArray(a) || Array.isArray(b)) {\n return false\n }\n\n // Map 比較\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) {\n return false\n }\n for (const [key, val] of a) {\n if (!b.has(key) || !deepEqualInternal(val, b.get(key), visited, strict)) {\n return false\n }\n }\n return true\n }\n if (a instanceof Map || b instanceof Map) {\n return false\n }\n\n // Set 比較\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) {\n return false\n }\n const arrA = Array.from(a)\n const arrB = Array.from(b)\n return arrA.every((val) => arrB.some((bVal) => deepEqualInternal(val, bVal, visited, strict)))\n }\n if (a instanceof Set || b instanceof Set) {\n return false\n }\n\n // 普通物件比較\n const keysA = Object.keys(a as object)\n const keysB = Object.keys(b as object)\n\n if (keysA.length !== keysB.length) {\n return false\n }\n\n return keysA.every((key) => {\n const valA = (a as Record<string, unknown>)[key]\n const valB = (b as Record<string, unknown>)[key]\n return deepEqualInternal(valA, valB, visited, strict)\n })\n}\n\n/**\n * Singleton cache for deep equals function.\n * @internal\n */\nlet deepEqualsFn: DeepEqualsFn | null = null\n\n/**\n * Get the optimized deep equality comparison function for the current runtime.\n *\n * - **Bun**: Uses native Bun.deepEquals() for maximum performance (C++ optimized)\n * - **Node.js/Deno/Unknown**: Uses fallback recursive implementation with cycle detection\n *\n * Results are cached after first invocation for efficiency.\n *\n * @returns A function that performs deep equality comparison\n * @public\n *\n * @example\n * ```typescript\n * const deepEquals = getDeepEquals()\n *\n * const obj1 = { a: [1, 2], b: { c: 3 } }\n * const obj2 = { a: [1, 2], b: { c: 3 } }\n *\n * console.log(deepEquals(obj1, obj2)) // true\n *\n * // Strict mode for +0 / -0 and NaN\n * console.log(deepEquals(NaN, NaN)) // true (lenient)\n * console.log(deepEquals(NaN, NaN, { strict: true })) // false\n * ```\n */\nexport function getDeepEquals(): DeepEqualsFn {\n if (deepEqualsFn) {\n return deepEqualsFn\n }\n\n const kind = getRuntimeKind()\n if (kind === 'bun' && typeof Bun !== 'undefined') {\n deepEqualsFn = (a: unknown, b: unknown, options?: DeepEqualsOptions): boolean => {\n return Bun.deepEquals(a, b, options?.strict ?? false)\n }\n return deepEqualsFn\n }\n\n deepEqualsFn = createFallbackDeepEquals()\n return deepEqualsFn\n}\n",
82
- "/**\n * Runtime HTML escape abstraction.\n *\n * Provides unified HTML escaping across Bun, Node.js, and Deno runtimes.\n * Bun uses the native C++ `Bun.escapeHTML()` for 10-100x better performance.\n * Node.js/Deno fall back to manual entity replacement.\n *\n * @module runtime/escape\n * @since 3.4.0\n */\n\nimport { getRuntimeKind } from './detection'\n\n/**\n * HTML escape function type.\n * @public\n */\nexport type EscapeHtmlFn = (value: string) => string\n\n/**\n * Creates a fallback HTML escape function using .replace() chains.\n *\n * Escapes 5 special characters: &, <, >, \", '\n * Each is replaced with its HTML entity equivalent.\n *\n * @returns HTML escape function\n * @internal\n */\nfunction createFallbackEscapeHtml(): EscapeHtmlFn {\n return (value: string): string => {\n if (!value) {\n return ''\n }\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;')\n }\n}\n\n// ============ Singleton ============\n\nlet escapeHtmlFn: EscapeHtmlFn | null = null\n\n/**\n * Get the HTML escape function (auto-selects best implementation based on runtime).\n *\n * - Bun: Uses native C++ `Bun.escapeHTML()` (10-100x faster, SIMD accelerated)\n * - Node.js/Deno/Unknown: Uses .replace() chain fallback with same behavior\n *\n * @returns HTML escape function\n * @public\n *\n * @example\n * ```typescript\n * import { getEscapeHtml } from '@gravito/core'\n *\n * const escapeHtml = getEscapeHtml()\n * const safe = escapeHtml('<script>alert(\"xss\")</script>')\n * // '&lt;script&gt;alert(&quot;xss&quot;)&lt;/script&gt;'\n * ```\n */\nexport function getEscapeHtml(): EscapeHtmlFn {\n if (escapeHtmlFn) {\n return escapeHtmlFn\n }\n\n const kind = getRuntimeKind()\n if (kind === 'bun' && typeof Bun !== 'undefined' && typeof Bun.escapeHTML === 'function') {\n escapeHtmlFn = (value: string): string => {\n if (!value) {\n return ''\n }\n return Bun.escapeHTML(value)\n }\n } else {\n escapeHtmlFn = createFallbackEscapeHtml()\n }\n\n return escapeHtmlFn\n}\n",
83
- "/**\n * Runtime abstraction module.\n *\n * Provides unified APIs for filesystem, process, archive, and compression\n * operations across Bun, Node.js, and Deno runtimes.\n *\n * @module runtime\n * @since 3.2.0\n */\n\nimport { createBunAdapter } from './adapter-bun'\nimport { createDenoAdapter } from './adapter-deno'\nimport { createNodeAdapter } from './adapter-node'\nimport { createUnknownAdapter } from './adapter-unknown'\nimport { getRuntimeKind } from './detection'\nimport type { RuntimeAdapter, RuntimePasswordAdapter, RuntimeSqliteDatabase } from './types'\n\n// ============ Type Exports ============\n\nexport type {\n ArchiveCreateOptions,\n ArchiveEntry,\n ArchiveExtractOptions,\n ArchiveFileInfo,\n ArchiveFromDirectoryOptions,\n CompressionOptions,\n MarkdownRenderCallbacks,\n MarkdownRenderOptions,\n OptionalRuntimeResourceUsage,\n RuntimeAdapter,\n RuntimeArchiveAdapter,\n RuntimeCompressionAdapter,\n RuntimeFileSink,\n RuntimeFileStat,\n RuntimeKind,\n RuntimeMarkdownAdapter,\n RuntimePasswordAdapter,\n RuntimeProcess,\n RuntimeProcessOutput,\n RuntimeResourceUsage,\n RuntimeServeConfig,\n RuntimeServer,\n RuntimeSpawnOptions,\n RuntimeSpawnSyncResult,\n RuntimeSqliteDatabase,\n RuntimeSqliteStatement,\n} from './types'\n\n// ============ Detection Exports ============\n\nexport { getRuntimeEnv, getRuntimeKind } from './detection'\n\n// ============ Archive Exports ============\n\nexport {\n archiveFromDirectory,\n getArchiveAdapter,\n} from './archive'\n\n// ============ Compression Exports ============\n\nexport { getCompressionAdapter } from './compression'\n\n// ============ Markdown Exports ============\n\nexport { createHtmlRenderCallbacks, getMarkdownAdapter } from './markdown'\n\n// ============ Deep Equals Exports ============\n\nexport type { DeepEqualsFn, DeepEqualsOptions } from './deep-equals'\nexport { getDeepEquals } from './deep-equals'\n\n// ============ Escape Exports ============\n\nexport type { EscapeHtmlFn } from './escape'\nexport { getEscapeHtml } from './escape'\n\n// ============ Runtime Adapter Singleton ============\n\nlet runtimeAdapter: RuntimeAdapter | null = null\n\n/**\n * Get the runtime abstraction adapter (Bun/Node/Deno).\n * @public\n */\nexport function getRuntimeAdapter(): RuntimeAdapter {\n if (runtimeAdapter) {\n return runtimeAdapter\n }\n\n const kind = getRuntimeKind()\n\n // Browser safety: return unknown adapter immediately if we're in a browser\n if (typeof window !== 'undefined' || (globalThis as any).process?.browser) {\n return (runtimeAdapter = createUnknownAdapter())\n }\n\n switch (kind) {\n case 'bun':\n runtimeAdapter = createBunAdapter()\n break\n case 'node':\n runtimeAdapter = createNodeAdapter()\n break\n case 'deno':\n runtimeAdapter = createDenoAdapter()\n break\n default:\n runtimeAdapter = createUnknownAdapter()\n }\n\n return runtimeAdapter\n}\n\n/**\n * Reset the runtime adapter (mainly for testing).\n * @internal\n */\nexport function resetRuntimeAdapter(): void {\n runtimeAdapter = null\n}\n\n// ============ Password Adapter Singleton ============\n\nlet passwordAdapter: RuntimePasswordAdapter | null = null\n\n/**\n * Get the password hashing adapter using native optimized implementations if available.\n * @public\n */\nexport function getPasswordAdapter(): RuntimePasswordAdapter {\n if (passwordAdapter) {\n return passwordAdapter\n }\n\n const kind = getRuntimeKind()\n const B = (globalThis as any).Bun\n\n if (kind === 'bun' && B) {\n passwordAdapter = {\n async hash(value, options) {\n if (options.algorithm === 'bcrypt') {\n return await B.password.hash(value, {\n algorithm: 'bcrypt',\n cost: options.cost ?? 12,\n })\n }\n return await B.password.hash(value, {\n algorithm: 'argon2id',\n ...(options.memoryCost !== undefined ? { memoryCost: options.memoryCost } : {}),\n ...(options.timeCost !== undefined ? { timeCost: options.timeCost } : {}),\n ...(options.parallelism !== undefined ? { parallelism: options.parallelism } : {}),\n })\n },\n async verify(value, hashed) {\n return await B.password.verify(value, hashed)\n },\n }\n return passwordAdapter\n }\n\n const message = '[RuntimeAdapter] Password hashing requires Bun runtime or a Node/Deno adapter'\n passwordAdapter = {\n async hash() {\n throw new Error(message)\n },\n async verify() {\n throw new Error(message)\n },\n }\n return passwordAdapter\n}\n\n// ============ SQLite Adapter ============\n\n/**\n * Create a SQLite database connection using runtime-native drivers.\n * @public\n */\nexport async function createSqliteDatabase(path: string): Promise<RuntimeSqliteDatabase> {\n const kind = getRuntimeKind()\n const B = (globalThis as any).Bun\n\n if (kind === 'bun' && B) {\n const sqlite = await import('bun:sqlite')\n const db = new sqlite.Database(path, { create: true })\n return db as RuntimeSqliteDatabase\n }\n\n throw new Error('[RuntimeAdapter] SQLite storage requires Bun runtime or a Node/Deno adapter')\n}\n\n/**\n * Convert various data types to Uint8Array.\n * @internal\n */\nexport async function toUint8Array(\n data: Blob | Buffer | string | ArrayBuffer | Uint8Array\n): Promise<Uint8Array> {\n if (data instanceof Uint8Array) {\n return data\n }\n if (typeof data === 'string') {\n return new TextEncoder().encode(data)\n }\n if (data instanceof ArrayBuffer) {\n return new Uint8Array(data)\n }\n if (typeof Buffer !== 'undefined' && data instanceof Buffer) {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n }\n if (data instanceof Blob) {\n return new Uint8Array(await data.arrayBuffer())\n }\n return new Uint8Array()\n}\n",
84
- "/**\n * Configuration manager (ConfigManager)\n *\n * Unifies environment variables and application configuration access.\n */\nimport type { ZodSchema } from 'zod'\nimport { getRuntimeEnv } from './runtime'\n\n/**\n * ConfigManager - Central configuration store.\n * Supports loading from environment variables and initial objects.\n * @public\n */\nexport class ConfigManager {\n private config: Map<string, unknown> = new Map()\n private schema: ZodSchema | null = null\n\n constructor(initialConfig: Record<string, unknown> = {}) {\n // 1. Load initial config\n for (const [key, value] of Object.entries(initialConfig)) {\n this.config.set(key, value)\n }\n\n // 2. Auto-load runtime environment variables\n this.loadEnv()\n }\n\n /**\n * Load all environment variables from the active runtime.\n */\n private loadEnv() {\n const env = getRuntimeEnv()\n for (const key of Object.keys(env)) {\n if (env[key] !== undefined) {\n this.config.set(key, env[key])\n }\n }\n }\n\n /**\n * Get a configuration value (generic return type supported).\n * Supports dot notation for deep access (e.g. 'app.name').\n */\n get<T = unknown>(key: string, defaultValue?: T): T {\n // Check if key exists directly first\n if (this.config.has(key)) {\n return this.config.get(key) as T\n }\n\n // Handle dot notation\n if (key.includes('.')) {\n const parts = key.split('.')\n const rootKey = parts[0]\n if (rootKey) {\n let current: any = this.config.get(rootKey)\n\n if (current !== undefined) {\n for (let i = 1; i < parts.length; i++) {\n const part = parts[i]\n if (part && current && typeof current === 'object' && part in current) {\n current = current[part]\n } else {\n current = undefined\n break\n }\n }\n\n if (current !== undefined) {\n return current as T\n }\n }\n }\n }\n\n if (defaultValue !== undefined) {\n return defaultValue\n }\n throw new Error(`Config key '${key}' not found`)\n }\n\n /**\n * Set a configuration value.\n */\n set(key: string, value: unknown): void {\n this.config.set(key, value)\n }\n\n /**\n * Check whether a key exists.\n */\n has(key: string): boolean {\n return this.config.has(key)\n }\n\n /**\n * Define a Zod schema for configuration validation.\n *\n * @param schema - Zod schema for validation\n *\n * @example\n * ```typescript\n * config.defineSchema(z.object({\n * DATABASE_URL: z.string().url(),\n * PORT: z.number().default(3000),\n * }))\n * ```\n */\n defineSchema(schema: ZodSchema): void {\n this.schema = schema\n }\n\n /**\n * Validate configuration against the defined schema.\n *\n * Should be called during bootstrap to catch configuration errors early.\n *\n * @throws Error if validation fails with details about missing/invalid fields\n *\n * @example\n * ```typescript\n * try {\n * config.validate()\n * } catch (error) {\n * console.error('Config validation failed:', error.message)\n * process.exit(1)\n * }\n * ```\n */\n validate(): void {\n if (!this.schema) {\n return\n }\n\n const configObj = Object.fromEntries(this.config)\n const result = this.schema.safeParse(configObj)\n\n if (!result.success) {\n const errors = result.error.issues\n .map((issue) => {\n const path = Array.isArray(issue.path) ? issue.path.join('.') : String(issue.path)\n return `${path} - ${issue.message}`\n })\n .join('; ')\n throw new Error(`Configuration validation failed: ${errors}`)\n }\n }\n}\n",
85
- "/**\n * Universal AsyncLocalStorage wrapper.\n * Automatically switches between node:async_hooks and a browser mock.\n */\n\nlet AsyncLocalStorageClass: any\n\n// Try to load Node.js AsyncLocalStorage\nconst tryGetNodeAsyncHooks = () => {\n try {\n if (\n typeof window === 'undefined' &&\n typeof process !== 'undefined' &&\n !(process as any).browser\n ) {\n // Try direct import for Bun/Node.js ESM compatibility\n try {\n const module = require('node:async_hooks')\n return module.AsyncLocalStorage\n } catch (_e1) {\n // Fallback to eval for CommonJS require hiding\n try {\n // biome-ignore lint/security/noGlobalEval: specialized case for hiding node built-ins\n return eval('require')('node:async_hooks').AsyncLocalStorage\n } catch (_e2) {\n return null\n }\n }\n }\n } catch (_e) {\n return null\n }\n}\n\nAsyncLocalStorageClass = tryGetNodeAsyncHooks()\n\nif (!AsyncLocalStorageClass) {\n /**\n * Browser-safe AsyncLocalStorage mock.\n * Note: This mock only works with synchronous functions.\n * For proper async support, ensure Node.js AsyncLocalStorage is available.\n */\n AsyncLocalStorageClass = class AsyncLocalStorage<T> {\n private store: T | null = null\n\n run<R>(store: T, fn: () => R): R {\n const prev = this.store\n this.store = store\n try {\n return fn()\n } finally {\n this.store = prev\n }\n }\n\n getStore(): T | undefined {\n return this.store || undefined\n }\n\n disable(): void {\n this.store = null\n }\n }\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: generic class mock\nexport const AsyncLocalStorage: { new <_T>(): any } = AsyncLocalStorageClass\n",
86
- "import type { ServiceKey } from '../Container'\n\n/**\n * CircularDependencyException - Thrown when the container detects an infinite loop.\n *\n * @module @gravito/core\n */\nexport class CircularDependencyException extends Error {\n constructor(key: ServiceKey, stack: ServiceKey[]) {\n const path = [...stack, key].map(String).join(' -> ')\n super(`Circular dependency detected: ${path}`)\n this.name = 'CircularDependencyException'\n }\n}\n",
87
- "import type { RequestScopeManager } from './Container/RequestScopeManager'\nimport { AsyncLocalStorage } from './compat/async-local-storage'\nimport { CircularDependencyException } from './exceptions/CircularDependencyException'\n\n/**\n * Factory type for creating service instances\n */\nexport type Factory<T> = (container: Container) => T\n\n/**\n * AsyncLocalStorage 實例,用於隔離請求範圍\n * @internal\n */\nconst scopeStorage = new AsyncLocalStorage<RequestScopeManager>()\n\n/**\n * ServiceMap interface for type-safe IoC resolution.\n *\n * Extend this interface via module augmentation to get type inference:\n * @example\n * ```typescript\n * declare module '@gravito/core' {\n * interface ServiceMap {\n * logger: Logger\n * db: DatabaseConnection\n * }\n * }\n * ```\n */\n// biome-ignore lint/complexity/noBannedTypes: empty interface needed for module augmentation\nexport type ServiceMap = {}\n\n/**\n * ServiceKey represents the allowed keys for service resolution.\n * Includes keys from ServiceMap, generic strings, or symbols.\n */\nexport type ServiceKey = keyof ServiceMap | (string & {}) | symbol\n\ninterface Binding<T = unknown> {\n factory: Factory<T>\n shared: boolean // true for singleton\n scope?: 'transient' | 'singleton' | 'request' // scope type\n}\n\n/**\n * Container - Simple Dependency Injection Container.\n * Manages service bindings and singleton instances.\n * @public\n */\nexport class Container {\n private bindings = new Map<ServiceKey, Binding>()\n private instances = new Map<ServiceKey, unknown>()\n private resolutionStack: ServiceKey[] = []\n\n /**\n * Run a function within a request scope context.\n *\n * All service resolutions within the function will use the provided scope,\n * enabling request-scoped service instances to be properly isolated.\n *\n * @template T - The return type of the function.\n * @param scope - The RequestScopeManager for this request.\n * @param fn - The function to execute within the scope.\n * @returns The result of the function.\n *\n * @example\n * ```typescript\n * const scope = new RequestScopeManager()\n * const result = await Container.runWithScope(scope, async () => {\n * const service = container.make('requestScoped')\n * return service.doSomething()\n * })\n * ```\n */\n static runWithScope<T>(scope: RequestScopeManager, fn: () => T | Promise<T>): T | Promise<T> {\n return scopeStorage.run(scope, fn)\n }\n\n /**\n * Bind a service to the container.\n *\n * A new instance will be created by the factory function every time the\n * service is resolved from the container.\n *\n * @template T - The type of the service being bound.\n * @param key - The unique identifier for the service.\n * @param factory - The factory function that creates the service instance.\n *\n * @example\n * ```typescript\n * container.bind('logger', (c) => new ConsoleLogger());\n * ```\n */\n bind<T>(key: ServiceKey, factory: Factory<T>): void {\n this.bindings.set(key, {\n factory: factory as Factory<unknown>,\n shared: false,\n scope: 'transient',\n })\n }\n\n /**\n * Bind a shared service to the container (Singleton).\n *\n * The factory function will be called only once, and the same instance\n * will be returned on every subsequent resolution.\n *\n * @template T - The type of the service being bound.\n * @param key - The unique identifier for the service.\n * @param factory - The factory function that creates the service instance.\n *\n * @example\n * ```typescript\n * container.singleton('db', (c) => new DatabaseConnection());\n * ```\n */\n singleton<T>(key: ServiceKey, factory: Factory<T>): void {\n this.bindings.set(key, {\n factory: factory as Factory<unknown>,\n shared: true,\n scope: 'singleton',\n })\n }\n\n /**\n * Bind a request-scoped service to the container.\n *\n * A new instance will be created for each request and cached within that request.\n * The service is automatically cleaned up when the request ends.\n *\n * @template T - The type of the service being bound.\n * @param key - The unique identifier for the service.\n * @param factory - The factory function that creates the service instance.\n *\n * @example\n * ```typescript\n * container.scoped('requestCache', (c) => new RequestProductCache());\n * ```\n */\n scoped<T>(key: ServiceKey, factory: Factory<T>): void {\n this.bindings.set(key, {\n factory: factory as Factory<unknown>,\n shared: false,\n scope: 'request',\n })\n }\n\n /**\n * Register an existing instance as a shared service.\n *\n * @param key - The unique identifier for the service.\n * @param instance - The instance to register.\n */\n instance<T>(key: ServiceKey, instance: T): void {\n this.instances.set(key, instance)\n }\n\n /**\n * Check if a service is request-scoped.\n *\n * @param key - The service key to check.\n * @returns True if the service is request-scoped.\n */\n isRequestScoped(key: ServiceKey): boolean {\n return this.bindings.get(key)?.scope === 'request'\n }\n\n /**\n * Resolve a service instance from the container.\n *\n * Automatically handles singleton caching and factory execution.\n *\n * @template T - The expected type of the service.\n * @param key - The unique identifier for the service.\n * @returns The resolved service instance.\n * @throws Error if the service key is not found in the container.\n *\n * @example\n * ```typescript\n * const logger = container.make<Logger>('logger');\n * ```\n */\n make<K extends keyof ServiceMap>(key: K): ServiceMap[K]\n make<T>(key: ServiceKey): T\n make<T>(key: ServiceKey): T {\n // 1. Check shared instances\n if (this.instances.has(key)) {\n return this.instances.get(key) as T\n }\n\n // 2. Check for circular dependencies\n if (this.resolutionStack.includes(key)) {\n throw new CircularDependencyException(key, this.resolutionStack)\n }\n\n // 3. Check bindings\n const binding = this.bindings.get(key)\n if (!binding) {\n throw new Error(`Service '${String(key)}' not found in container`)\n }\n\n // 4. Handle request-scoped services\n if (binding.scope === 'request') {\n const scope = scopeStorage.getStore()\n if (scope) {\n // Use request scope manager to resolve\n return scope.resolve(key, () => binding.factory(this)) as T\n }\n // Fallback: if no scope context, create temporary instance with warning\n console.warn(\n `Request-scoped service '${String(key)}' resolved outside request context. ` +\n 'This instance will not be shared across the request. Consider wrapping with Container.runWithScope().'\n )\n }\n\n // 5. Resolve instance\n this.resolutionStack.push(key)\n\n try {\n const instance = binding.factory(this)\n\n // 6. Cache if shared\n if (binding.shared) {\n this.instances.set(key, instance)\n }\n\n return instance as T\n } finally {\n this.resolutionStack.pop()\n }\n }\n\n /**\n * Check if a service is bound or has an instance in the container.\n *\n * @param key - The service key to check.\n * @returns True if the service exists.\n */\n has(key: ServiceKey): boolean {\n return this.bindings.has(key) || this.instances.has(key)\n }\n\n /**\n * Flush all instances and bindings from the container.\n * Resets the container to an empty state.\n */\n flush(): void {\n this.bindings.clear()\n this.instances.clear()\n }\n\n /**\n * Forget a specific instance while keeping its binding.\n *\n * @param key - The service key to forget.\n */\n forget(key: ServiceKey): void {\n this.instances.delete(key)\n }\n}\n",
88
- "/**\n * Standard logger interface.\n *\n * PSR-3 inspired API for easy swapping (e.g., Winston, Pino).\n */\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void\n info(message: string, ...args: unknown[]): void\n warn(message: string, ...args: unknown[]): void\n error(message: string, ...args: unknown[]): void\n}\n\n/**\n * Default console logger implementation.\n */\nexport class ConsoleLogger implements Logger {\n debug(message: string, ...args: unknown[]): void {\n console.debug(`[DEBUG] ${message}`, ...args)\n }\n\n info(message: string, ...args: unknown[]): void {\n console.info(`[INFO] ${message}`, ...args)\n }\n\n warn(message: string, ...args: unknown[]): void {\n console.warn(`[WARN] ${message}`, ...args)\n }\n\n error(message: string, ...args: unknown[]): void {\n console.error(`[ERROR] ${message}`, ...args)\n }\n}\n",
89
- "/**\n * RequestScope-Aware Error Handling\n *\n * Integrates RequestScope lifecycle with error handling to provide:\n * - Error context with request-scoped resources\n * - Automatic cleanup of scoped services on error\n * - Request tracing and diagnostics\n * - Resource leak detection\n */\n\nimport type { RequestScopeManager } from '../Container/RequestScopeManager'\nimport type { RequestScopeMetrics } from '../Container/RequestScopeMetrics'\nimport type { GravitoContext } from '../http/types'\n\n/**\n * Extended error context with RequestScope information\n *\n * Provides error handlers access to request-scoped resources\n * for proper resource cleanup and error diagnostics.\n */\nexport interface RequestScopeErrorContext {\n /**\n * The original error that was thrown\n */\n error: unknown\n\n /**\n * HTTP context where error occurred\n */\n context: GravitoContext\n\n /**\n * RequestScope manager for this request\n * Allows error handlers to access or clean up scoped resources\n */\n scope?: RequestScopeManager\n\n /**\n * Metrics about the request scope state\n * Useful for diagnostics and understanding resource usage\n */\n scopeMetrics?: RequestScopeMetrics\n\n /**\n * Number of scoped services at time of error\n * High numbers might indicate resource leaks\n */\n scopeSize?: number\n\n /**\n * Request processing time in milliseconds\n * Useful for timeout errors\n */\n duration?: number\n\n /**\n * Additional diagnostic information\n */\n diagnostics?: {\n // Services that had cleanup called\n servicesCleanedUp?: string[]\n // Services that failed cleanup\n cleanupErrors?: Array<{ service: string; error: unknown }>\n // Peak memory usage during request\n peakMemoryMb?: number\n }\n}\n\n/**\n * Error that occurred during RequestScope cleanup\n *\n * Wraps original error with cleanup context for proper error reporting\n */\nexport class RequestScopeCleanupError extends Error {\n constructor(\n message: string,\n public originalError: unknown,\n public cleanupErrors: Array<{ service: string; error: unknown }>\n ) {\n super(message)\n this.name = 'RequestScopeCleanupError'\n }\n}\n\n/**\n * Helper to extract RequestScope context from GravitoContext\n *\n * @param ctx - Gravito context\n * @returns RequestScope error context with available information\n */\nexport function extractRequestScopeErrorContext(\n ctx: GravitoContext,\n error: unknown\n): RequestScopeErrorContext {\n const scope = (ctx as any)._requestScope\n const metrics = scope?.getMetrics?.()\n const scopeSize = scope?.size?.()\n\n return {\n error,\n context: ctx,\n scope,\n scopeMetrics: metrics,\n scopeSize,\n }\n}\n\n/**\n * Cleanup scoped services safely during error handling\n *\n * Ensures all scoped services are cleaned up even if some fail,\n * and collects cleanup errors for diagnostics.\n *\n * @param scope - RequestScope manager\n * @returns Array of cleanup errors if any occurred\n */\nexport async function cleanupRequestScopeOnError(\n scope?: RequestScopeManager\n): Promise<Array<{ service: string; error: unknown }>> {\n if (!scope) {\n return []\n }\n\n const errors: Array<{ service: string; error: unknown }> = []\n\n try {\n await scope.cleanup()\n } catch (error) {\n // Capture error but don't rethrow - we want to return error info\n errors.push({\n service: 'RequestScopeManager',\n error,\n })\n }\n\n return errors\n}\n\n/**\n * Safe error handler wrapper that manages RequestScope cleanup\n *\n * Ensures scoped services are properly cleaned up before returning error response.\n * Use this to wrap error handlers to make them RequestScope-aware.\n *\n * @example\n * ```typescript\n * const errorHandler = withRequestScopeCleanup(async (ctx, error) => {\n * // Handle error...\n * return ctx.json({ error: error.message }, 500)\n * })\n *\n * // In your app:\n * try {\n * // Handle request...\n * } catch (error) {\n * return errorHandler(ctx, error)\n * }\n * ```\n */\nexport function withRequestScopeCleanup<\n T extends (ctx: GravitoContext, error: unknown) => Promise<Response>,\n>(handler: T): T {\n return (async (ctx: GravitoContext, error: unknown): Promise<Response> => {\n const scope = (ctx as any)._requestScope\n // Ensure scoped resources are cleaned up before error handler completes\n // Errors during cleanup are logged but don't prevent error response\n void (await cleanupRequestScopeOnError(scope))\n\n try {\n // Call original error handler\n return await handler(ctx, error)\n } catch (handlerError) {\n // If error handler itself fails, at least we tried to cleanup\n console.error('Error handler failed after RequestScope cleanup:', handlerError)\n throw handlerError\n }\n }) as T\n}\n\n/**\n * Detect potential resource leaks in RequestScope\n *\n * Returns diagnostic information about suspicious resource usage patterns\n */\nexport function detectRequestScopeLeaks(context: RequestScopeErrorContext): {\n potentialLeaks: boolean\n warnings: string[]\n} {\n const warnings: string[] = []\n\n // High service count might indicate services not being cleaned up properly\n if ((context.scopeSize ?? 0) > 100) {\n warnings.push(\n `High service count in scope: ${context.scopeSize}. ` +\n `Potential resource leak or accumulation.`\n )\n }\n\n // Long cleanup time might indicate slow cleanup handlers\n if ((context.scopeMetrics?.getCleanupDuration() ?? 0) > 100) {\n warnings.push(\n `Slow RequestScope cleanup: ${context.scopeMetrics?.getCleanupDuration()}ms. ` +\n `Check for blocking operations in cleanup() methods.`\n )\n }\n\n // Cleanup errors indicate failed resource cleanup\n if ((context.diagnostics?.cleanupErrors?.length ?? 0) > 0) {\n warnings.push(\n `${context.diagnostics?.cleanupErrors?.length} cleanup errors occurred. ` +\n `Check error details for resource leak details.`\n )\n }\n\n return {\n potentialLeaks: warnings.length > 0,\n warnings,\n }\n}\n",
90
- "import type { ContentfulStatusCode } from '../http/types'\n\n/**\n * Options for creating a GravitoException\n * @public\n */\nexport interface ExceptionOptions {\n message?: string\n cause?: unknown\n i18nKey?: string // e.g. 'errors.validation.failed'\n i18nParams?: Record<string, string | number>\n}\n\n/**\n * Base exception class for consistent error handling.\n * @public\n */\nexport abstract class GravitoException extends Error {\n public readonly status: ContentfulStatusCode\n public readonly code: string\n public readonly i18nKey?: string\n public readonly i18nParams?: Record<string, string | number>\n\n constructor(status: number, code: string, options: ExceptionOptions = {}) {\n super(options.message)\n this.name = 'GravitoException'\n this.status = status as ContentfulStatusCode\n this.cause = options.cause\n this.code = code\n if (options.i18nKey) {\n this.i18nKey = options.i18nKey\n }\n if (options.i18nParams) {\n this.i18nParams = options.i18nParams\n }\n }\n\n // Helper for i18n\n getLocalizedMessage(\n t: (key: string, params?: Record<string, string | number>) => string\n ): string {\n if (this.i18nKey) {\n return t(this.i18nKey, this.i18nParams)\n }\n return this.message\n }\n}\n",
91
- "import type { ContentfulStatusCode } from '../http/types'\nimport { type ExceptionOptions, GravitoException } from './GravitoException'\n\n/**\n * Generic HTTP Exception\n * @public\n */\nexport class HttpException extends GravitoException {\n constructor(status: ContentfulStatusCode, options: ExceptionOptions = {}) {\n super(status, 'HTTP_ERROR', options)\n this.name = 'HttpException'\n }\n}\n",
92
- "import { GravitoException } from './GravitoException'\n\n/**\n * Structure of a validation error\n * @public\n */\nexport interface ValidationError {\n field: string\n message: string\n code?: string\n}\n\n/**\n * Exception thrown when data validation fails.\n * @public\n */\nexport class ValidationException extends GravitoException {\n public readonly errors: ValidationError[]\n public redirectTo?: string\n public input?: unknown\n\n constructor(errors: ValidationError[], message = 'Validation failed') {\n super(422, 'VALIDATION_ERROR', {\n message,\n i18nKey: 'errors.validation.failed',\n })\n this.errors = errors\n }\n\n withRedirect(url: string): this {\n this.redirectTo = url\n return this\n }\n\n withInput(input: unknown): this {\n this.input = input\n return this\n }\n}\n",
93
- "import type { ContentfulStatusCode, GravitoContext } from '../http/types'\n\n/**\n * Standard API Success Response Structure\n * @public\n */\nexport type ApiSuccess<T> = {\n success: true\n data: T\n}\n\n/**\n * Standard API Failure Response Structure\n * @public\n */\nexport type ApiFailure = {\n success: false\n error: {\n message: string\n code?: string\n details?: unknown\n }\n}\n\n/**\n * Create a success response object.\n * @public\n */\nexport function ok<T>(data: T): ApiSuccess<T> {\n return { success: true, data }\n}\n\n/**\n * Create a failure response object.\n * @public\n */\nexport function fail(message: string, code?: string, details?: unknown): ApiFailure {\n const error: ApiFailure['error'] = { message }\n if (code !== undefined) {\n error.code = code\n }\n if (details !== undefined) {\n error.details = details\n }\n return { success: false, error }\n}\n\n/**\n * Return a JSON response with standard success structure.\n * @public\n */\nexport function jsonSuccess<T>(\n c: GravitoContext,\n data: T,\n status: ContentfulStatusCode = 200\n): Response {\n return c.json(ok(data), status)\n}\n\n/**\n * Return a JSON response with standard failure structure.\n * @public\n */\nexport function jsonFail(\n c: GravitoContext,\n message: string,\n status: ContentfulStatusCode = 400,\n code?: string,\n details?: unknown\n): Response {\n return c.json(fail(message, code, details), status)\n}\n",
94
- "/**\n * @fileoverview ErrorHandler - Centralized Error Handling for Gravito Framework\n *\n * Extracted from PlanetCore to follow Single Responsibility Principle.\n * Handles HTTP errors, validation errors, and error rendering.\n *\n * @module @gravito/core\n * @since 1.3.0\n */\n\nimport {\n cleanupRequestScopeOnError,\n detectRequestScopeLeaks,\n extractRequestScopeErrorContext,\n} from './error-handling/RequestScopeErrorContext'\nimport { GravitoException } from './exceptions/GravitoException'\nimport { HttpException } from './exceptions/HttpException'\nimport { ValidationException } from './exceptions/ValidationException'\nimport type { HookManager } from './HookManager'\nimport { fail } from './helpers/response'\nimport type { ContentfulStatusCode, GravitoContext } from './http/types'\nimport type { Logger } from './Logger'\nimport type { ErrorHandlerContext, ViewService } from './PlanetCore'\n\n/**\n * HTTP Status Code to Error Code mapping\n */\nexport function codeFromStatus(status: number): string {\n switch (status) {\n case 400:\n return 'BAD_REQUEST'\n case 401:\n return 'UNAUTHENTICATED'\n case 403:\n return 'FORBIDDEN'\n case 404:\n return 'NOT_FOUND'\n case 405:\n return 'METHOD_NOT_ALLOWED'\n case 409:\n return 'CONFLICT'\n case 422:\n return 'VALIDATION_ERROR'\n case 429:\n return 'TOO_MANY_REQUESTS'\n default:\n return status >= 500 ? 'INTERNAL_ERROR' : 'HTTP_ERROR'\n }\n}\n\n/**\n * HTTP Status Code to Message mapping\n */\nexport function messageFromStatus(status: number): string {\n switch (status) {\n case 400:\n return 'Bad Request'\n case 401:\n return 'Unauthorized'\n case 403:\n return 'Forbidden'\n case 404:\n return 'Not Found'\n case 405:\n return 'Method Not Allowed'\n case 409:\n return 'Conflict'\n case 422:\n return 'Unprocessable Content'\n case 429:\n return 'Too Many Requests'\n case 500:\n return 'Internal Server Error'\n case 502:\n return 'Bad Gateway'\n case 503:\n return 'Service Unavailable'\n case 504:\n return 'Gateway Timeout'\n default:\n return status >= 500 ? 'Internal Server Error' : 'Request Error'\n }\n}\n\n/**\n * Dependencies injected into ErrorHandler\n * @public\n */\nexport interface ErrorHandlerDeps {\n logger: Logger\n hooks: HookManager\n getCore: () => unknown // Lazy reference to avoid circular deps\n}\n\n/**\n * ErrorHandler - Centralized error handling logic\n *\n * @example\n * ```typescript\n * const handler = new ErrorHandler({ logger, hooks, getCore: () => core })\n * adapter.onError(handler.handleError.bind(handler))\n * adapter.onNotFound(handler.handleNotFound.bind(handler))\n * ```\n */\nexport class ErrorHandler {\n constructor(private deps: ErrorHandlerDeps) {}\n\n /**\n * Handle application errors\n *\n * Integrates RequestScope cleanup to ensure proper resource management\n * even when errors occur during request processing.\n */\n async handleError(err: unknown, c: GravitoContext): Promise<Response> {\n const isProduction = process.env.NODE_ENV === 'production'\n\n // Extract RequestScope context for diagnostics and cleanup\n const scopeErrorContext = extractRequestScopeErrorContext(c, err)\n const cleanupErrors = await cleanupRequestScopeOnError(scopeErrorContext.scope)\n\n // Update context with cleanup diagnostics\n if (cleanupErrors.length > 0) {\n scopeErrorContext.diagnostics = {\n cleanupErrors,\n }\n }\n\n // Detect potential resource leaks\n const leakDetection = detectRequestScopeLeaks(scopeErrorContext)\n if (leakDetection.warnings.length > 0 && !isProduction) {\n // Log warnings in development to help identify issues\n for (const warning of leakDetection.warnings) {\n this.deps.logger?.warn?.(`[RequestScope] ${warning}`)\n }\n }\n\n // Try rendering HTML if available and requested\n const view = c.get('view') as ViewService | undefined\n const i18n = c.get('i18n') as { t?: (key: string, params?: unknown) => string } | undefined\n const accept = c.req.header('Accept') || ''\n const wantsHtml = Boolean(\n view && accept.includes('text/html') && !accept.includes('application/json')\n )\n\n let status: ContentfulStatusCode = 500\n let message = messageFromStatus(500)\n let code = 'INTERNAL_ERROR'\n let details: unknown\n\n // Parse error type\n if (err instanceof GravitoException) {\n status = err.status as ContentfulStatusCode\n code = err.code\n\n // Fallback for generic HTTP errors to use status-based codes\n if (code === 'HTTP_ERROR') {\n code = codeFromStatus(status)\n }\n\n if (i18n?.t && err.i18nKey) {\n message = i18n.t(err.i18nKey, err.i18nParams)\n } else {\n message = err.message || messageFromStatus(status)\n }\n\n if (err instanceof ValidationException) {\n details = err.errors\n\n // Handle HTML Redirect for Validation\n if (wantsHtml) {\n const redirectResponse = this.handleValidationRedirect(err, c)\n if (redirectResponse) {\n return redirectResponse\n }\n }\n } else if (err instanceof Error && !isProduction && err.cause) {\n details = { cause: err.cause }\n }\n } else if (err instanceof HttpException) {\n status = err.status\n message = err.message\n } else if (\n err instanceof Error &&\n 'status' in err &&\n typeof (err as { status?: unknown }).status === 'number'\n ) {\n // Handle Photon or other framework exceptions via duck typing\n status = (err as { status: number }).status as ContentfulStatusCode\n message = err.message\n code = codeFromStatus(status)\n } else if (err instanceof Error) {\n if (!isProduction) {\n message = err.message || message\n }\n } else if (typeof err === 'string') {\n if (!isProduction) {\n message = err\n }\n }\n\n // Sanitize message in production for 5xx errors\n if (isProduction && status >= 500) {\n message = messageFromStatus(status)\n }\n\n // Add stack trace in development\n if (!isProduction && err instanceof Error && !details) {\n details = { stack: err.stack, ...(details as object) }\n }\n\n // Build handler context\n let handlerContext: ErrorHandlerContext = {\n core: this.deps.getCore() as import('./PlanetCore').PlanetCore,\n c,\n error: err,\n isProduction,\n accept,\n wantsHtml,\n status,\n payload: fail(message, code, details),\n ...(wantsHtml\n ? {\n html: {\n templates: status === 500 ? ['errors/500'] : [`errors/${status}`, 'errors/500'],\n data: {\n status,\n message,\n code,\n error: !isProduction && err instanceof Error ? err.stack : undefined,\n debug: !isProduction,\n details,\n },\n },\n }\n : {}),\n }\n\n // Apply filters for customization\n handlerContext = await this.deps.hooks.applyFilters<ErrorHandlerContext>(\n 'error:context',\n handlerContext\n )\n\n // Logging\n this.logError(handlerContext, err)\n\n // Report action\n await this.deps.hooks.doAction('error:report', handlerContext)\n\n // Check for custom render\n const customResponse = await this.deps.hooks.applyFilters<Response | null>(\n 'error:render',\n null,\n handlerContext\n )\n if (customResponse) {\n return customResponse\n }\n\n // Render HTML or JSON\n return this.renderErrorResponse(handlerContext, view, c)\n }\n\n /**\n * Handle 404 Not Found errors\n */\n async handleNotFound(c: GravitoContext): Promise<Response> {\n const view = c.get('view') as ViewService | undefined\n const accept = c.req.header('Accept') || ''\n const wantsHtml = view && accept.includes('text/html') && !accept.includes('application/json')\n const isProduction = process.env.NODE_ENV === 'production'\n\n let handlerContext: ErrorHandlerContext = {\n core: this.deps.getCore() as import('./PlanetCore').PlanetCore,\n c,\n error: new HttpException(404, { message: 'Route not found' }),\n isProduction,\n accept,\n wantsHtml: Boolean(wantsHtml),\n status: 404,\n payload: fail('Route not found', 'NOT_FOUND'),\n ...(wantsHtml\n ? {\n html: {\n templates: ['errors/404', 'errors/500'],\n data: {\n status: 404,\n message: 'Route not found',\n code: 'NOT_FOUND',\n debug: !isProduction,\n },\n },\n }\n : {}),\n }\n\n handlerContext = await this.deps.hooks.applyFilters<ErrorHandlerContext>(\n 'notFound:context',\n handlerContext\n )\n\n // Logging\n const logLevel = handlerContext.logLevel ?? 'info'\n if (logLevel !== 'none') {\n const msg = handlerContext.logMessage ?? `404 Not Found: ${c.req.url}`\n if (logLevel === 'error') {\n this.deps.logger.error(msg)\n } else if (logLevel === 'warn') {\n this.deps.logger.warn(msg)\n } else {\n this.deps.logger.info(msg)\n }\n }\n\n await this.deps.hooks.doAction('notFound:report', handlerContext)\n\n const customResponse = await this.deps.hooks.applyFilters<Response | null>(\n 'notFound:render',\n null,\n handlerContext\n )\n if (customResponse) {\n return customResponse\n }\n\n return this.renderErrorResponse(handlerContext, view, c)\n }\n\n /**\n * Handle validation error redirect for HTML requests\n */\n private handleValidationRedirect(err: ValidationException, c: GravitoContext): Response | null {\n const session = c.get('session') as { flash: (key: string, value: unknown) => void } | undefined\n\n if (!session) {\n return null\n }\n\n // Transform details to ErrorBag format: Record<string, string[]>\n const errorBag: Record<string, string[]> = {}\n for (const e of err.errors) {\n if (!errorBag[e.field]) {\n errorBag[e.field] = []\n }\n errorBag[e.field]?.push(e.message)\n }\n session.flash('errors', errorBag)\n\n if (err.input) {\n session.flash('_old_input', err.input)\n }\n\n const redirectUrl = err.redirectTo ?? c.req.header('Referer') ?? '/'\n return c.redirect(redirectUrl)\n }\n\n /**\n * Log error based on context settings\n */\n private logError(handlerContext: ErrorHandlerContext, err: unknown): void {\n const defaultLogLevel = handlerContext.status >= 500 ? 'error' : 'none'\n const logLevel = handlerContext.logLevel ?? defaultLogLevel\n\n if (logLevel === 'none') {\n return\n }\n\n const rawErrorMessage =\n handlerContext.error instanceof Error\n ? handlerContext.error.message\n : typeof handlerContext.error === 'string'\n ? handlerContext.error\n : handlerContext.payload.error.message\n\n const msg =\n handlerContext.logMessage ??\n (logLevel === 'error'\n ? `Application Error: ${rawErrorMessage || handlerContext.payload.error.message}`\n : `HTTP ${handlerContext.status}: ${handlerContext.payload.error.message}`)\n\n if (logLevel === 'error') {\n this.deps.logger.error(msg, err)\n } else if (logLevel === 'warn') {\n this.deps.logger.warn(msg)\n } else {\n this.deps.logger.info(msg)\n }\n }\n\n /**\n * Render error response (HTML or JSON)\n */\n private renderErrorResponse(\n handlerContext: ErrorHandlerContext,\n view: ViewService | undefined,\n c: GravitoContext\n ): Response {\n if (handlerContext.wantsHtml && view && handlerContext.html) {\n let lastRenderError: unknown\n for (const template of handlerContext.html.templates) {\n try {\n return c.html(view.render(template, handlerContext.html.data), handlerContext.status)\n } catch (renderError) {\n lastRenderError = renderError\n }\n }\n this.deps.logger.error('Failed to render error view', lastRenderError)\n }\n\n return c.json(handlerContext.payload, handlerContext.status)\n }\n}\n",
95
- "/**\n * Event system type definitions.\n */\n\n/**\n * Listener interface.\n *\n * All event listeners must implement this interface.\n */\nexport interface Listener<TEvent extends Event = Event> {\n /**\n * Handle an event.\n * @param event - Event instance\n */\n handle(event: TEvent): Promise<void> | void\n}\n\n/**\n * Marker interface for listeners that should be queued.\n *\n * Listeners implementing this interface can be dispatched asynchronously via a queue.\n */\nexport interface ShouldQueue {\n /**\n * Queue name (optional).\n */\n queue?: string\n\n /**\n * Connection name (optional).\n */\n connection?: string\n\n /**\n * Delay before execution (seconds).\n */\n delay?: number\n}\n\n/**\n * Marker interface for events that should be broadcast.\n *\n * Events implementing this interface can be automatically broadcast to clients.\n */\nexport interface ShouldBroadcast {\n /**\n * Define the broadcast channel.\n * @returns Channel name or channel object\n */\n broadcastOn(): string | Channel\n\n /**\n * Define broadcast payload (optional).\n * If omitted, public event properties will be used.\n * @returns Broadcast payload\n */\n broadcastWith?(): Record<string, unknown>\n\n /**\n * Define the broadcast event name (optional).\n * If omitted, the event class name will be used.\n * @returns Event name\n */\n broadcastAs?(): string\n}\n\n/**\n * Channel interface.\n */\nexport interface Channel {\n /**\n * Channel name.\n */\n name: string\n\n /**\n * Channel type.\n */\n type: 'public' | 'private' | 'presence'\n}\n\n/**\n * Base event class.\n *\n * All events should extend this class.\n */\nexport abstract class Event {\n /**\n * Whether this event should be broadcast.\n */\n shouldBroadcast(): boolean {\n return (\n 'broadcastOn' in this &&\n typeof (this as unknown as ShouldBroadcast).broadcastOn === 'function'\n )\n }\n\n /**\n * Get broadcast channel.\n */\n getBroadcastChannel(): string | Channel | null {\n if (this.shouldBroadcast()) {\n return (this as unknown as ShouldBroadcast).broadcastOn()\n }\n return null\n }\n\n /**\n * Get broadcast payload.\n */\n getBroadcastData(): Record<string, unknown> {\n if (this.shouldBroadcast()) {\n const broadcast = this as unknown as ShouldBroadcast\n if (broadcast.broadcastWith) {\n return broadcast.broadcastWith()\n }\n // Default to public event properties\n const data: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(this)) {\n if (!key.startsWith('_') && typeof value !== 'function') {\n data[key] = value\n }\n }\n return data\n }\n return {}\n }\n\n /**\n * Get broadcast event name.\n */\n getBroadcastEventName(): string {\n if (this.shouldBroadcast()) {\n const broadcast = this as unknown as ShouldBroadcast\n if (broadcast.broadcastAs) {\n return broadcast.broadcastAs()\n }\n }\n // Default to class name\n return this.constructor.name\n }\n}\n",
96
- "import { Event } from './Event'\nimport type { Listener, ShouldQueue } from './Listener'\nimport type { PlanetCore } from './PlanetCore'\n\n/**\n * Listener registration metadata.\n */\ninterface ListenerRegistration<TEvent extends Event = Event> {\n listener: Listener<TEvent> | (new () => Listener<TEvent>)\n queue?: string\n connection?: string\n delay?: number\n}\n\n/**\n * Event manager.\n *\n * Provides type-safe event dispatching and listener registration.\n * Supports both synchronous listeners and asynchronous (queued) listeners.\n *\n * @example\n * ```typescript\n * class UserRegistered extends Event {\n * constructor(public user: User) {\n * super()\n * }\n * }\n *\n * class SendWelcomeEmail implements Listener<UserRegistered> {\n * async handle(event: UserRegistered): Promise<void> {\n * // send welcome email\n * }\n * }\n *\n * // Register listener\n * core.events.listen(UserRegistered, SendWelcomeEmail)\n *\n * // Dispatch event\n * await core.events.dispatch(new UserRegistered(user))\n * ```\n */\nexport class EventManager {\n /**\n * Listener registry.\n * Key: event class or event name\n * Value: listener registrations\n */\n private listeners = new Map<string | (new () => Event), ListenerRegistration[]>()\n\n /**\n * Broadcast manager (optional, injected by `orbit-broadcasting`).\n */\n private broadcastManager:\n | {\n broadcast(\n event: Event,\n channel: string | { name: string; type: string },\n data: Record<string, unknown>,\n eventName: string\n ): Promise<void>\n }\n | undefined\n\n /**\n * Queue manager (optional, injected by `orbit-queue`).\n */\n private queueManager:\n | {\n push(job: unknown, queue?: string, connection?: string, delay?: number): Promise<void>\n }\n | undefined\n\n constructor(private core: PlanetCore) {}\n\n /**\n * Register the broadcast manager (called by `orbit-broadcasting`).\n */\n setBroadcastManager(manager: EventManager['broadcastManager']): void {\n this.broadcastManager = manager\n }\n\n /**\n * Register the queue manager (called by `orbit-queue`).\n */\n setQueueManager(manager: EventManager['queueManager']): void {\n this.queueManager = manager\n }\n\n /**\n * Register an event listener.\n *\n * @param event - Event class or event name\n * @param listener - Listener instance or listener class\n * @param options - Optional queue options\n *\n * @example\n * ```typescript\n * // Synchronous listener\n * core.events.listen(UserRegistered, SendWelcomeEmail)\n *\n * // Queued listener (async)\n * core.events.listen(UserRegistered, SendWelcomeEmail, {\n * queue: 'emails',\n * delay: 60\n * })\n * ```\n */\n listen<TEvent extends Event>(\n event: string | (new (...args: unknown[]) => TEvent),\n listener: Listener<TEvent> | (new () => Listener<TEvent>),\n options?: {\n queue?: string\n connection?: string\n delay?: number\n }\n ): void {\n const eventKey = typeof event === 'string' ? event : event\n if (!this.listeners.has(eventKey)) {\n this.listeners.set(eventKey, [])\n }\n\n const registration: ListenerRegistration<TEvent> = {\n listener,\n ...options,\n }\n\n this.listeners.get(eventKey)?.push(registration)\n }\n\n /**\n * Remove an event listener.\n *\n * @param event - Event class or event name\n * @param listener - Listener to remove\n */\n unlisten<TEvent extends Event>(\n event: string | (new (...args: unknown[]) => TEvent),\n listener: Listener<TEvent> | (new () => Listener<TEvent>)\n ): void {\n const eventKey = typeof event === 'string' ? event : event\n const registrations = this.listeners.get(eventKey)\n if (!registrations) {\n return\n }\n\n const filtered = registrations.filter((reg) => reg.listener !== listener)\n if (filtered.length === 0) {\n this.listeners.delete(eventKey)\n } else {\n this.listeners.set(eventKey, filtered)\n }\n }\n\n /**\n * Dispatch an event.\n *\n * Runs all registered listeners. If a listener implements `ShouldQueue` or\n * has queue options, the listener will be pushed to the queue for async execution.\n *\n * @param event - Event instance\n *\n * @example\n * ```typescript\n * await core.events.dispatch(new UserRegistered(user))\n * ```\n */\n async dispatch<TEvent extends Event>(event: TEvent): Promise<void> {\n const eventKey = event.constructor as new () => Event\n const eventName = event.constructor.name\n\n // Trigger hooks (backward compatible)\n await this.core.hooks.doAction(`event:${eventName}`, event)\n await this.core.hooks.doAction('event:dispatched', { event, eventName })\n\n // Broadcast\n if (event instanceof Event && event.shouldBroadcast() && this.broadcastManager) {\n const channel = event.getBroadcastChannel()\n if (channel) {\n const channelName = typeof channel === 'string' ? channel : channel.name\n const channelType = typeof channel === 'string' ? 'public' : channel.type\n const data = event.getBroadcastData()\n const broadcastEventName = event.getBroadcastEventName()\n\n await this.broadcastManager\n .broadcast(event, { name: channelName, type: channelType }, data, broadcastEventName)\n .catch((error) => {\n this.core.logger.error(`[EventManager] Failed to broadcast event ${eventName}:`, error)\n })\n }\n }\n\n // Collect listeners (check class key first, then string name)\n const registrations = this.listeners.get(eventKey) || []\n const stringRegistrations = this.listeners.get(eventName) || []\n const allRegistrations = [...registrations, ...stringRegistrations]\n\n // Execute listeners\n for (const registration of allRegistrations) {\n try {\n // Resolve listener instance\n let listenerInstance: Listener<TEvent>\n if (typeof registration.listener === 'function') {\n // Class: instantiate\n listenerInstance = new registration.listener() as Listener<TEvent>\n } else {\n // Instance: use directly\n listenerInstance = registration.listener as Listener<TEvent>\n }\n\n // Determine whether it should be queued\n const shouldQueue =\n 'queue' in listenerInstance ||\n registration.queue !== undefined ||\n registration.connection !== undefined ||\n registration.delay !== undefined\n\n if (shouldQueue && this.queueManager) {\n // Push to queue\n const queue = (listenerInstance as unknown as ShouldQueue).queue || registration.queue\n const connection =\n (listenerInstance as unknown as ShouldQueue).connection || registration.connection\n const delay = (listenerInstance as unknown as ShouldQueue).delay || registration.delay\n\n // Create a queue job wrapper\n const queueJob = {\n type: 'event-listener',\n event: eventName,\n listener: listenerInstance.constructor.name,\n eventData: this.serializeEvent(event),\n handle: async () => {\n await listenerInstance.handle(event)\n },\n }\n\n await this.queueManager.push(queueJob, queue, connection, delay)\n } else {\n // Run synchronously\n await listenerInstance.handle(event)\n }\n } catch (error) {\n this.core.logger.error(`[EventManager] Error in listener for event ${eventName}:`, error)\n // Continue with other listeners\n }\n }\n }\n\n /**\n * Serialize an event (for queueing).\n */\n private serializeEvent(event: Event): Record<string, unknown> {\n const data: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(event)) {\n if (!key.startsWith('_') && typeof value !== 'function') {\n data[key] = value\n }\n }\n return data\n }\n\n /**\n * Get all registered listeners.\n */\n getListeners(event?: string | (new () => Event)): ListenerRegistration[] {\n if (event) {\n const eventKey = typeof event === 'string' ? event : event\n return this.listeners.get(eventKey) || []\n }\n const all: ListenerRegistration[] = []\n for (const registrations of this.listeners.values()) {\n all.push(...registrations)\n }\n return all\n }\n\n /**\n * Clear all listeners.\n */\n clear(): void {\n this.listeners.clear()\n }\n}\n",
97
- "import type { EventOptions } from './EventOptions'\n\n/**\n * Source of DLQ entry - reason why event entered the DLQ.\n * @public\n */\nexport type DLQEntrySource =\n | 'retry_exhausted'\n | 'circuit_breaker'\n | 'backpressure_overflow'\n | 'manual'\n\n/**\n * Dead Letter Queue entry representing a failed event.\n * @public\n */\nexport interface DLQEntry {\n /**\n * Unique identifier for this DLQ entry.\n */\n id: string\n\n /**\n * Event hook name.\n */\n eventName: string\n\n /**\n * Event payload.\n */\n payload: unknown\n\n /**\n * Event options used when dispatching.\n */\n options: EventOptions\n\n /**\n * Error that caused the event to fail.\n */\n error: {\n message: string\n stack?: string\n code?: string\n }\n\n /**\n * Number of retry attempts made.\n */\n retryCount: number\n\n /**\n * Timestamp when the event first failed.\n */\n firstFailedAt: number\n\n /**\n * Timestamp when the event was added to DLQ.\n */\n failedAt: number\n\n /**\n * Timestamp when the event was last retried (if any).\n */\n lastRetriedAt?: number\n\n /**\n * Source of the DLQ entry - reason why event entered the DLQ.\n */\n source: DLQEntrySource\n}\n\n/**\n * Filter options for querying DLQ entries.\n * @public\n */\nexport interface DLQFilter {\n /**\n * Filter by event name.\n */\n eventName?: string\n\n /**\n * Filter by entries failed after this timestamp.\n */\n from?: number\n\n /**\n * Filter by entries failed before this timestamp.\n */\n to?: number\n\n /**\n * Maximum number of entries to return.\n */\n limit?: number\n}\n\n/**\n * Callback type for DLQ entry events.\n * @public\n */\nexport type DLQEntryCallback = (entry: DLQEntry) => void\n\n/**\n * Dead Letter Queue Manager for handling failed events.\n *\n * The DLQ stores events that have exceeded their retry limit,\n * allowing for manual inspection, reprocessing, or analysis.\n *\n * @public\n */\nexport class DeadLetterQueue {\n private entries: Map<string, DLQEntry> = new Map()\n private entryIdCounter = 0\n private maxEntries?: number\n private onEntryAdded?: DLQEntryCallback\n private onEntryRemoved?: DLQEntryCallback\n\n /**\n * Create a new DeadLetterQueue instance.\n *\n * @param maxEntries - Maximum number of entries to keep (optional, no limit if not set)\n */\n constructor(maxEntries?: number) {\n this.maxEntries = maxEntries\n }\n\n /**\n * Add a failed event to the Dead Letter Queue.\n *\n * @param eventName - Name of the failed event\n * @param payload - Event payload\n * @param options - Event options\n * @param error - Error that caused the failure\n * @param retryCount - Number of retry attempts made\n * @param firstFailedAt - Timestamp of first failure\n * @param source - Source of the DLQ entry (default: 'retry_exhausted')\n * @returns DLQ entry ID\n */\n add(\n eventName: string,\n payload: unknown,\n options: EventOptions,\n error: Error,\n retryCount: number,\n firstFailedAt: number,\n source: DLQEntrySource = 'retry_exhausted'\n ): string {\n // Check capacity and evict oldest if needed\n if (this.maxEntries && this.entries.size >= this.maxEntries) {\n this.evictOldest()\n }\n\n const entryId = `dlq-${++this.entryIdCounter}-${Date.now()}`\n\n const entry: DLQEntry = {\n id: entryId,\n eventName,\n payload,\n options,\n error: {\n message: error.message,\n stack: error.stack,\n code: (error as any).code,\n },\n retryCount,\n firstFailedAt,\n failedAt: Date.now(),\n source,\n }\n\n this.entries.set(entryId, entry)\n\n // Trigger callback\n this.onEntryAdded?.(entry)\n\n // Log DLQ entry\n console.error(\n `[DeadLetterQueue] Event \"${eventName}\" added to DLQ (source: ${source}) after ${retryCount} retries:`,\n error.message\n )\n\n return entryId\n }\n\n /**\n * Get a specific DLQ entry by ID.\n *\n * @param entryId - DLQ entry ID\n * @returns DLQ entry or undefined if not found\n */\n get(entryId: string): DLQEntry | undefined {\n return this.entries.get(entryId)\n }\n\n /**\n * List DLQ entries with optional filtering.\n *\n * @param filter - Filter options\n * @returns Array of DLQ entries\n */\n list(filter: DLQFilter = {}): DLQEntry[] {\n let entries = Array.from(this.entries.values())\n\n // Filter by event name\n if (filter.eventName) {\n entries = entries.filter((entry) => entry.eventName === filter.eventName)\n }\n\n // Filter by time range\n if (filter.from) {\n entries = entries.filter((entry) => entry.failedAt >= filter.from!)\n }\n\n if (filter.to) {\n entries = entries.filter((entry) => entry.failedAt <= filter.to!)\n }\n\n // Sort by failedAt (newest first)\n entries.sort((a, b) => b.failedAt - a.failedAt)\n\n // Apply limit\n if (filter.limit) {\n entries = entries.slice(0, filter.limit)\n }\n\n return entries\n }\n\n /**\n * Delete a DLQ entry.\n *\n * @param entryId - DLQ entry ID\n * @returns True if entry was deleted, false if not found\n */\n delete(entryId: string): boolean {\n const entry = this.entries.get(entryId)\n if (entry) {\n this.onEntryRemoved?.(entry)\n }\n return this.entries.delete(entryId)\n }\n\n /**\n * Delete all DLQ entries matching the filter.\n *\n * @param filter - Filter options\n * @returns Number of entries deleted\n */\n deleteAll(filter: DLQFilter = {}): number {\n const entriesToDelete = this.list(filter)\n let deletedCount = 0\n\n for (const entry of entriesToDelete) {\n if (this.delete(entry.id)) {\n deletedCount++\n }\n }\n\n return deletedCount\n }\n\n /**\n * Get the total number of entries in the DLQ.\n *\n * @returns Total entry count\n */\n getCount(): number {\n return this.entries.size\n }\n\n /**\n * Get the count of entries for a specific event.\n *\n * @param eventName - Event name\n * @returns Entry count for the event\n */\n getCountByEvent(eventName: string): number {\n return this.list({ eventName }).length\n }\n\n /**\n * Clear all entries from the DLQ.\n */\n clear(): void {\n for (const entry of this.entries.values()) {\n this.onEntryRemoved?.(entry)\n }\n this.entries.clear()\n }\n\n /**\n * Update the last retried timestamp for an entry.\n *\n * @param entryId - DLQ entry ID\n * @internal\n */\n updateLastRetried(entryId: string): void {\n const entry = this.entries.get(entryId)\n if (entry) {\n entry.lastRetriedAt = Date.now()\n }\n }\n\n /**\n * Evict the oldest entry from the DLQ.\n * Used when capacity limit is reached.\n *\n * @private\n */\n private evictOldest(): void {\n let oldestEntry: DLQEntry | null = null\n let oldestId: string | null = null\n\n for (const [id, entry] of this.entries.entries()) {\n if (!oldestEntry || entry.failedAt < oldestEntry.failedAt) {\n oldestEntry = entry\n oldestId = id\n }\n }\n\n if (oldestId && oldestEntry) {\n console.warn(`[DeadLetterQueue] Capacity limit reached. Evicting oldest entry: ${oldestId}`)\n this.delete(oldestId)\n }\n }\n\n /**\n * Get the oldest entry in the DLQ.\n *\n * @returns Oldest DLQ entry or undefined if empty\n */\n getOldestEntry(): DLQEntry | undefined {\n let oldestEntry: DLQEntry | undefined\n let oldestTime = Infinity\n\n for (const entry of this.entries.values()) {\n if (entry.failedAt < oldestTime) {\n oldestEntry = entry\n oldestTime = entry.failedAt\n }\n }\n\n return oldestEntry\n }\n\n /**\n * Get the newest entry in the DLQ.\n *\n * @returns Newest DLQ entry or undefined if empty\n */\n getNewestEntry(): DLQEntry | undefined {\n let newestEntry: DLQEntry | undefined\n let newestTime = 0\n\n for (const entry of this.entries.values()) {\n if (entry.failedAt > newestTime) {\n newestEntry = entry\n newestTime = entry.failedAt\n }\n }\n\n return newestEntry\n }\n\n /**\n * Get all entries grouped by source.\n *\n * @param source - Source to filter by\n * @returns Array of entries matching the source\n */\n getEntriesBySource(source: DLQEntrySource): DLQEntry[] {\n return Array.from(this.entries.values()).filter((entry) => entry.source === source)\n }\n\n /**\n * Set callback for when an entry is added to the DLQ.\n *\n * @param callback - Callback function or undefined to clear\n */\n setOnEntryAdded(callback?: DLQEntryCallback): void {\n this.onEntryAdded = callback\n }\n\n /**\n * Set callback for when an entry is removed from the DLQ.\n *\n * @param callback - Callback function or undefined to clear\n */\n setOnEntryRemoved(callback?: DLQEntryCallback): void {\n this.onEntryRemoved = callback\n }\n\n /**\n * Get the maximum number of entries allowed in the DLQ.\n *\n * @returns Max entries limit or undefined if no limit\n */\n getMaxEntries(): number | undefined {\n return this.maxEntries\n }\n\n /**\n * Set the maximum number of entries allowed in the DLQ.\n *\n * @param maxEntries - Maximum entries or undefined to remove limit\n */\n setMaxEntries(maxEntries?: number): void {\n this.maxEntries = maxEntries\n\n // Evict oldest entries if current size exceeds new limit\n if (maxEntries && this.entries.size > maxEntries) {\n const excess = this.entries.size - maxEntries\n for (let i = 0; i < excess; i++) {\n this.evictOldest()\n }\n }\n }\n}\n",
98
- "/**\n * @gravito/core - Event System Backpressure Management\n *\n * Implements a backpressure management system to prevent high-priority events\n * from starving low-priority events when the queue is under resource constraints.\n *\n * 背壓管理器:在資源受限時進行智慧型流量控制,防止優先級飢餓。\n *\n * FS-103 增強:\n * - 多優先級隊列深度監控\n * - 背壓反饋迴路支持\n * - 智能 DLQ 路由決策\n */\n\nimport type { DeadLetterDecision, MultiPriorityQueueDepth, WindowAdjustment } from './types'\n\n/**\n * 背壓狀態枚舉。\n *\n * 狀態轉換:Normal → Warning → Critical → Overflow\n * 恢復方向:遲滯設計(需降至觸發閾值的 80%)\n *\n * @public\n */\nexport enum BackpressureState {\n /** 正常運作,無背壓 */\n NORMAL = 'NORMAL',\n /** 警告狀態,開始限制低優先級事件 */\n WARNING = 'WARNING',\n /** 危急狀態,僅允許高優先級事件 */\n CRITICAL = 'CRITICAL',\n /** 溢位狀態,全部拒絕 */\n OVERFLOW = 'OVERFLOW',\n}\n\n/**\n * 背壓配置選項。\n *\n * @public\n */\nexport interface BackpressureConfig {\n /** 是否啟用背壓管理器(預設 true) */\n enabled?: boolean\n\n /** 總隊列深度限制(預設無限) */\n maxQueueSize?: number\n\n /** 分優先級隊列深度限制 */\n maxSizeByPriority?: {\n critical?: number\n high?: number\n normal?: number\n low?: number\n }\n\n /** 每秒最大入隊速率(events/sec,預設無限) */\n maxEnqueueRate?: number\n\n /** 速率限制滑動視窗大小(ms,預設 1000) */\n rateLimitWindowMs?: number\n\n /** 背壓狀態閾值(佔 maxQueueSize 的百分比) */\n thresholds?: {\n /** WARNING 觸發百分比(預設 0.6 = 60%) */\n warning?: number\n /** CRITICAL 觸發百分比(預設 0.85 = 85%) */\n critical?: number\n /** OVERFLOW 觸發百分比(預設 1.0 = 100%) */\n overflow?: number\n }\n\n /** 被拒絕事件的處理策略(預設 'drop-with-callback') */\n rejectionPolicy?: 'throw' | 'drop-silent' | 'drop-with-callback'\n\n /** 當 rejectionPolicy 為 'drop-with-callback' 時的回呼 */\n onRejected?: (eventName: string, priority: string, reason: string) => void\n\n /** 背壓狀態變更回呼 */\n onStateChange?: (from: BackpressureState, to: BackpressureState) => void\n\n /** 低優先級事件在 WARNING 狀態下的延遲入隊時間(ms,預設 100) */\n lowPriorityDelayMs?: number\n\n /** 是否啟用優先級反轉防護(預設 true) */\n enableStarvationProtection?: boolean\n\n /** 低優先級事件最大等待時間,超過則提升優先級(ms,預設 5000) */\n starvationTimeoutMs?: number\n\n /** 當進入 OVERFLOW 狀態時,是否將被拒絕事件路由到 DLQ(預設 false) */\n dlqOnOverflow?: boolean\n\n /** OVERFLOW 時的重試策略(預設 'dlq-only') */\n overflowRetryStrategy?: 'immediate' | 'delayed' | 'dlq-only'\n\n /** OVERFLOW 延遲重試的基礎延遲時間(ms,預設 5000) */\n overflowRetryDelayMs?: number\n}\n\n/**\n * 背壓決策結果。\n *\n * @public\n */\nexport interface BackpressureDecision {\n /** 是否允許入隊 */\n allowed: boolean\n /** 拒絕原因(若不允許) */\n reason?: string\n /** 是否需要延遲入隊 */\n delayed?: boolean\n /** 延遲時間(ms) */\n delayMs?: number\n /** 建議降級後的優先級(若降級) */\n degradedPriority?: 'high' | 'normal' | 'low'\n /** 是否是由於 OVERFLOW 狀態被拒絕 */\n isOverflow?: boolean\n /** OVERFLOW 時的重試策略建議('immediate'、'delayed'、'dlq-only') */\n retryStrategy?: 'immediate' | 'delayed' | 'dlq-only'\n}\n\n/**\n * 背壓指標快照。\n *\n * @public\n */\nexport interface BackpressureMetricsSnapshot {\n state: BackpressureState\n totalDepth: number\n depthByPriority: { critical: number; high: number; normal: number; low: number }\n enqueueRate: number\n rejectedCount: number\n degradedCount: number\n stateTransitions: number\n dlqRouteCount?: number\n windowAdjustmentCount?: number\n}\n\n/**\n * 預設背壓配置。\n */\nconst DEFAULT_BACKPRESSURE_CONFIG = {\n enabled: true,\n maxQueueSize: Number.POSITIVE_INFINITY,\n maxSizeByPriority: {\n high: Number.POSITIVE_INFINITY,\n normal: Number.POSITIVE_INFINITY,\n low: Number.POSITIVE_INFINITY,\n },\n maxEnqueueRate: Number.POSITIVE_INFINITY,\n rateLimitWindowMs: 1000,\n thresholds: { warning: 0.6, critical: 0.85, overflow: 1.0 } as Required<\n NonNullable<BackpressureConfig['thresholds']>\n >,\n rejectionPolicy: 'drop-with-callback' as const,\n lowPriorityDelayMs: 100,\n enableStarvationProtection: true,\n starvationTimeoutMs: 5000,\n dlqOnOverflow: false,\n overflowRetryStrategy: 'dlq-only' as const,\n overflowRetryDelayMs: 5000,\n}\n\n/**\n * 滑動視窗速率計數器。\n *\n * 使用環形緩衝區記錄固定時間窗內的事件計數。\n * 計算滑動窗口內的事件速率(events/sec)。\n */\nclass SlidingWindowCounter {\n private readonly windowMs: number\n private readonly bucketMs: number\n private readonly buckets: number[]\n private currentBucketIndex: number\n private lastBucketTime: number\n\n constructor(windowMs = 1000, bucketCount = 10) {\n this.windowMs = windowMs\n this.bucketMs = windowMs / bucketCount\n this.buckets = new Array(bucketCount).fill(0)\n this.currentBucketIndex = 0\n this.lastBucketTime = Date.now()\n }\n\n /**\n * 記錄一個事件。\n */\n increment(): void {\n const now = Date.now()\n const timePassed = now - this.lastBucketTime\n\n // 推進到當前時間桶\n const bucketsToAdvance = Math.floor(timePassed / this.bucketMs)\n if (bucketsToAdvance > 0) {\n for (let i = 0; i < Math.min(bucketsToAdvance, this.buckets.length); i++) {\n this.currentBucketIndex = (this.currentBucketIndex + 1) % this.buckets.length\n this.buckets[this.currentBucketIndex] = 0\n }\n this.lastBucketTime = now\n }\n\n // 增加當前桶的計數\n this.buckets[this.currentBucketIndex]++\n }\n\n /**\n * 獲取當前滑動視窗的速率(events/sec)。\n */\n getRate(): number {\n const now = Date.now()\n const timePassed = now - this.lastBucketTime\n\n // Note: timePassed could be used to advance buckets if needed\n // For now, we just calculate the current rate from existing buckets\n void timePassed // Intentionally unused\n let totalCount = 0\n for (let i = 0; i < this.buckets.length; i++) {\n totalCount += this.buckets[i]\n }\n\n return (totalCount / this.windowMs) * 1000 // 轉換為 events/sec\n }\n\n /**\n * 重置計數器。\n */\n reset(): void {\n this.buckets.fill(0)\n this.currentBucketIndex = 0\n this.lastBucketTime = Date.now()\n }\n}\n\n/**\n * 背壓管理器。\n *\n * 根據隊列深度、速率、優先級等因素,決定是否允許新事件入隊,\n * 以及是否需要降級優先級或延遲入隊。\n *\n * @public\n */\nexport class BackpressureManager {\n private enabled: boolean\n private config: Omit<Required<BackpressureConfig>, 'onRejected' | 'onStateChange'> & {\n dlqOnOverflow: boolean\n }\n private onRejected?: BackpressureConfig['onRejected']\n private onStateChange?: BackpressureConfig['onStateChange']\n\n private state: BackpressureState = BackpressureState.NORMAL\n private rejectedCount = 0\n private degradedCount = 0\n private stateTransitions = 0\n private rateCounter: SlidingWindowCounter\n\n // FS-103 增強:多優先級隊列深度監控\n private depthByPriority: MultiPriorityQueueDepth = {\n critical: 0,\n high: 0,\n normal: 0,\n low: 0,\n total: 0,\n }\n private windowAdjustmentHistory: WindowAdjustment[] = []\n private dlqRouteCount = 0\n\n constructor(config: BackpressureConfig = {}) {\n this.enabled = config.enabled !== false\n this.config = {\n enabled: config.enabled ?? DEFAULT_BACKPRESSURE_CONFIG.enabled,\n maxQueueSize: config.maxQueueSize ?? DEFAULT_BACKPRESSURE_CONFIG.maxQueueSize,\n maxSizeByPriority: {\n ...DEFAULT_BACKPRESSURE_CONFIG.maxSizeByPriority,\n ...config.maxSizeByPriority,\n },\n maxEnqueueRate: config.maxEnqueueRate ?? DEFAULT_BACKPRESSURE_CONFIG.maxEnqueueRate,\n rateLimitWindowMs: config.rateLimitWindowMs ?? DEFAULT_BACKPRESSURE_CONFIG.rateLimitWindowMs,\n thresholds: { ...DEFAULT_BACKPRESSURE_CONFIG.thresholds, ...config.thresholds },\n rejectionPolicy: (config.rejectionPolicy ?? DEFAULT_BACKPRESSURE_CONFIG.rejectionPolicy) as\n | 'throw'\n | 'drop-silent'\n | 'drop-with-callback',\n lowPriorityDelayMs:\n config.lowPriorityDelayMs ?? DEFAULT_BACKPRESSURE_CONFIG.lowPriorityDelayMs,\n enableStarvationProtection:\n config.enableStarvationProtection ?? DEFAULT_BACKPRESSURE_CONFIG.enableStarvationProtection,\n starvationTimeoutMs:\n config.starvationTimeoutMs ?? DEFAULT_BACKPRESSURE_CONFIG.starvationTimeoutMs,\n dlqOnOverflow: config.dlqOnOverflow ?? DEFAULT_BACKPRESSURE_CONFIG.dlqOnOverflow,\n overflowRetryStrategy: (config.overflowRetryStrategy ??\n DEFAULT_BACKPRESSURE_CONFIG.overflowRetryStrategy) as 'immediate' | 'delayed' | 'dlq-only',\n overflowRetryDelayMs:\n config.overflowRetryDelayMs ?? DEFAULT_BACKPRESSURE_CONFIG.overflowRetryDelayMs,\n }\n this.onRejected = config.onRejected\n this.onStateChange = config.onStateChange\n this.rateCounter = new SlidingWindowCounter(this.config.rateLimitWindowMs, 10)\n }\n\n /**\n * 評估是否允許新事件入隊。\n *\n * @param eventName 事件名稱\n * @param priority 事件優先級\n * @param queueDepth 當前隊列深度\n * @param depthByPriority 分優先級隊列深度\n * @returns 背壓決策結果\n */\n evaluate(\n eventName: string,\n priority: 'critical' | 'high' | 'normal' | 'low',\n queueDepth: number,\n depthByPriority: { critical: number; high: number; normal: number; low: number }\n ): BackpressureDecision {\n if (!this.enabled) {\n return { allowed: true }\n }\n\n // 更新速率計數器\n this.rateCounter.increment()\n\n // 重新計算背壓狀態\n this.updateState(queueDepth)\n\n // CRITICAL 優先級在 OVERFLOW 之外永不拒絕\n if (priority === 'critical' && this.state !== BackpressureState.OVERFLOW) {\n return { allowed: true }\n }\n\n // 檢查分優先級深度限制\n const maxSizeForPriority = this.config.maxSizeByPriority?.[priority] ?? Number.POSITIVE_INFINITY\n if (depthByPriority[priority] >= maxSizeForPriority) {\n return this.createDecision(false, `Priority queue full for ${priority}`, eventName, priority)\n }\n\n // 根據狀態進行決策\n switch (this.state) {\n case BackpressureState.OVERFLOW:\n return {\n ...this.createDecision(false, 'Backpressure OVERFLOW', eventName, priority),\n isOverflow: true,\n retryStrategy: this.config.overflowRetryStrategy,\n delayMs:\n this.config.overflowRetryStrategy === 'delayed'\n ? this.config.overflowRetryDelayMs\n : undefined,\n }\n\n case BackpressureState.CRITICAL:\n // 允許 CRITICAL 和 HIGH 優先級\n if (priority === 'critical' || priority === 'high') {\n return { allowed: true }\n }\n if (priority === 'normal') {\n return { allowed: true, delayed: true, delayMs: this.config.lowPriorityDelayMs }\n }\n return this.createDecision(false, 'Backpressure CRITICAL', eventName, priority)\n\n case BackpressureState.WARNING:\n // 低優先級延遲或拒絕\n if (priority === 'low') {\n // 檢查速率\n const rate = this.rateCounter.getRate()\n if (rate > this.config.maxEnqueueRate) {\n return this.createDecision(false, 'Rate limit exceeded', eventName, priority)\n }\n return { allowed: true, delayed: true, delayMs: this.config.lowPriorityDelayMs }\n }\n break\n default: {\n // 檢查速率限制\n const rate = this.rateCounter.getRate()\n if (rate > this.config.maxEnqueueRate) {\n if (priority === 'low') {\n return this.createDecision(false, 'Rate limit exceeded', eventName, priority)\n }\n if (priority === 'normal') {\n return { allowed: true, delayed: true, delayMs: this.config.lowPriorityDelayMs }\n }\n }\n return { allowed: true }\n }\n }\n\n return { allowed: true }\n }\n\n /**\n * 獲取當前背壓狀態。\n */\n getState(): BackpressureState {\n return this.state\n }\n\n /**\n * 獲取背壓指標快照。\n */\n getMetrics(): BackpressureMetricsSnapshot {\n return {\n state: this.state,\n totalDepth: this.depthByPriority.total,\n depthByPriority: { ...this.depthByPriority },\n enqueueRate: this.rateCounter.getRate(),\n rejectedCount: this.rejectedCount,\n degradedCount: this.degradedCount,\n stateTransitions: this.stateTransitions,\n dlqRouteCount: this.dlqRouteCount,\n windowAdjustmentCount: this.windowAdjustmentHistory.length,\n }\n }\n\n /**\n * 重置背壓管理器狀態。\n */\n reset(): void {\n this.state = BackpressureState.NORMAL\n this.rejectedCount = 0\n this.degradedCount = 0\n this.stateTransitions = 0\n this.rateCounter.reset()\n this.depthByPriority = { critical: 0, high: 0, normal: 0, low: 0, total: 0 }\n this.windowAdjustmentHistory = []\n this.dlqRouteCount = 0\n }\n\n /**\n * 同步隊列深度(由 EventPriorityQueue 調用)。\n * FS-103:多優先級隊列深度監控\n */\n updateQueueDepth(depths: MultiPriorityQueueDepth): void {\n this.depthByPriority = {\n critical: depths.critical,\n high: depths.high,\n normal: depths.normal,\n low: depths.low,\n total: depths.total,\n }\n\n // 根據新的隊列深度重新計算背壓狀態\n this.updateState(depths.total)\n }\n\n /**\n * 獲取各優先級的隊列深度。\n * FS-103:提供實時隊列深度快照\n */\n getQueueDepthByPriority(): MultiPriorityQueueDepth {\n return { ...this.depthByPriority }\n }\n\n /**\n * 獲取總隊列深度。\n */\n getTotalQueueDepth(): number {\n return this.depthByPriority.total\n }\n\n /**\n * 接收來自 AggregationWindow 的窗口調整通知。\n * FS-103:背壓反饋迴路\n */\n notifyWindowAdjustment(oldWindowMs: number, newWindowMs: number): void {\n // 記錄窗口調整\n this.windowAdjustmentHistory.push({\n timestamp: Date.now(),\n from: oldWindowMs,\n to: newWindowMs,\n reason: this.state,\n })\n\n // 窗口縮小意味著加速處理,可能有助於恢復\n // 如果從 CRITICAL 調整到更大窗口,檢查是否可以降級\n if (newWindowMs > oldWindowMs && this.state === BackpressureState.CRITICAL) {\n this.checkStateRecovery()\n }\n }\n\n /**\n * 檢查是否可以從 CRITICAL 或更高級別降級。\n * FS-103:自動狀態恢復機制\n */\n private checkStateRecovery(): void {\n if (this.config.maxQueueSize === Number.POSITIVE_INFINITY) {\n return // 無限隊列,無需降級檢查\n }\n\n const totalDepth = this.depthByPriority.total\n const hysteresisRatio = 0.8 // 遲滯設計:80% 恢復比例\n\n // 檢查從 CRITICAL 到 WARNING 的降級條件\n if (this.state === BackpressureState.CRITICAL) {\n const criticalThreshold =\n this.config.maxQueueSize * (this.config.thresholds?.critical ?? 0.85)\n if (totalDepth <= criticalThreshold * hysteresisRatio) {\n this.transitionTo(BackpressureState.WARNING)\n }\n }\n\n // 檢查從 WARNING 到 NORMAL 的降級條件\n if (this.state === BackpressureState.WARNING) {\n const warningThreshold = this.config.maxQueueSize * (this.config.thresholds?.warning ?? 0.6)\n if (totalDepth <= warningThreshold * hysteresisRatio) {\n this.transitionTo(BackpressureState.NORMAL)\n }\n }\n }\n\n /**\n * 決定是否應該將事件路由到死信隊列。\n * FS-103:智能 DLQ 路由決策\n */\n makeDeadLetterDecision(\n _eventName: string,\n priority: 'critical' | 'high' | 'normal' | 'low'\n ): DeadLetterDecision {\n // 規則 1:非 OVERFLOW 狀態永不路由到 DLQ\n if (this.state !== BackpressureState.OVERFLOW) {\n return { shouldRoute: false }\n }\n\n // 規則 2:配置禁用 DLQ\n if (!this.config.dlqOnOverflow) {\n return {\n shouldRoute: false,\n reason: 'DLQ disabled in config',\n }\n }\n\n // 規則 3:優先級決策\n // LOW 優先級在 OVERFLOW 時總是路由到 DLQ\n if (priority === 'low') {\n this.dlqRouteCount++\n return {\n shouldRoute: true,\n reason: 'Low priority event during OVERFLOW state',\n retryStrategy: 'dlq-only',\n }\n }\n\n // 檢查 CRITICAL 隊列容量\n const criticalCapacity = this.config.maxSizeByPriority?.critical ?? this.config.maxQueueSize\n const criticalCapacityPercent = (this.depthByPriority.critical / criticalCapacity) * 100\n\n if (criticalCapacityPercent > 90) {\n // CRITICAL 隊列接近滿,NORMAL 優先級也路由到 DLQ\n if (priority === 'normal') {\n this.dlqRouteCount++\n return {\n shouldRoute: true,\n reason: `CRITICAL queue at ${criticalCapacityPercent.toFixed(1)}% capacity`,\n retryStrategy: 'dlq-only',\n }\n }\n }\n\n // HIGH 和 CRITICAL 優先級建議延遲重試\n return {\n shouldRoute: false,\n retryStrategy: 'delayed',\n }\n }\n\n /**\n * 更新背壓狀態。\n * 使用遲滯設計(80% 回復比例)避免邊界震盪。\n */\n private updateState(totalDepth: number): void {\n if (this.config.maxQueueSize === Number.POSITIVE_INFINITY) {\n return // 無限隊列,不進行狀態管理\n }\n\n const depthRatio = totalDepth / this.config.maxQueueSize\n const warning = this.config.thresholds?.warning ?? 0.6\n const critical = this.config.thresholds?.critical ?? 0.85\n const overflow = this.config.thresholds?.overflow ?? 1.0\n const hysteresisRatio = 0.8 // 80% 回復比例\n\n let newState = this.state\n\n // 升級路徑:總是立即升級(無遲滯)\n if (depthRatio >= overflow) {\n newState = BackpressureState.OVERFLOW\n } else if (depthRatio >= critical) {\n newState = BackpressureState.CRITICAL\n } else if (depthRatio >= warning) {\n // 在 warning 到 critical 之間\n // 檢查是否應該從 CRITICAL 或更高級別降級\n if (depthRatio < critical * hysteresisRatio && this.state === BackpressureState.CRITICAL) {\n // 從 CRITICAL 降級到 WARNING\n newState = BackpressureState.WARNING\n } else if (\n depthRatio < overflow * hysteresisRatio &&\n this.state === BackpressureState.OVERFLOW\n ) {\n // 從 OVERFLOW 降級到 CRITICAL\n newState = BackpressureState.CRITICAL\n } else if (this.state === BackpressureState.NORMAL) {\n // 從 NORMAL 升級到 WARNING\n newState = BackpressureState.WARNING\n }\n // 否則保持當前狀態(WARNING、CRITICAL、OVERFLOW 保持)\n } else {\n // depthRatio < warning,檢查進一步降級(遲滯設計)\n if (this.state === BackpressureState.WARNING && depthRatio < warning * hysteresisRatio) {\n newState = BackpressureState.NORMAL\n } else if (\n this.state === BackpressureState.CRITICAL &&\n depthRatio < critical * hysteresisRatio\n ) {\n newState = BackpressureState.WARNING\n } else if (\n this.state === BackpressureState.OVERFLOW &&\n depthRatio < overflow * hysteresisRatio\n ) {\n newState = BackpressureState.CRITICAL\n }\n // 否則保持當前狀態\n }\n\n if (newState !== this.state) {\n this.transitionTo(newState)\n }\n }\n\n /**\n * 執行狀態轉換。\n */\n private transitionTo(newState: BackpressureState): void {\n const oldState = this.state\n this.state = newState\n this.stateTransitions++\n\n if (this.onStateChange) {\n this.onStateChange(oldState, newState)\n }\n }\n\n /**\n * 建立決策結果並記錄拒絕。\n */\n private createDecision(\n allowed: boolean,\n reason: string,\n eventName: string,\n priority: string\n ): BackpressureDecision {\n if (!allowed) {\n this.rejectedCount++\n if (this.onRejected) {\n this.onRejected(eventName, priority, reason)\n }\n }\n return { allowed, reason }\n }\n}\n",
99
- "import type { EventOptions } from './EventOptions'\nimport type { EventTask } from './types'\n\n/**\n * 優先級升級管理器\n *\n * 根據事件等待時間動態調整優先級,實施優先級提升機制。\n * 確保關鍵事件不會因為隊列深度而長時間等待。\n *\n * 升級規則(可配置):\n * - LOW 等待 > 200ms → NORMAL\n * - NORMAL 等待 > 100ms → HIGH\n * - HIGH 等待 > 50ms → CRITICAL\n * - 超過 maxWaitTimeMs → 強制 CRITICAL\n *\n * @internal\n */\nexport class PriorityEscalationManager {\n /**\n * 計算事件當前應該的優先級\n * 根據等待時間動態調整\n */\n static calculateCurrentPriority(\n task: EventTask,\n config?: EventOptions['escalation']\n ): 'critical' | 'high' | 'normal' | 'low' {\n // 如果未啟用升級,返回原始優先級\n if (config?.enabled === false) {\n return (task.options.priority as any) || 'normal'\n }\n\n const nowMs = Date.now()\n const waitTimeMs = nowMs - task.enqueuedAt\n const maxWaitTimeMs = config?.maxWaitTimeMs ?? 500\n\n // 超過最大等待時間,強制 CRITICAL\n if (waitTimeMs > maxWaitTimeMs) {\n return 'critical'\n }\n\n const defaultThresholds = {\n lowToNormal: 200,\n normalToHigh: 100,\n highToCritical: 50,\n }\n const thresholds = { ...defaultThresholds, ...config?.thresholds }\n\n const currentPriority = (task.options.priority as any) || 'normal'\n\n // LOW → NORMAL(等待 > 200ms)\n if (currentPriority === 'low' && waitTimeMs > thresholds.lowToNormal) {\n return 'normal'\n }\n\n // NORMAL → HIGH(等待 > 100ms)\n if (currentPriority === 'normal' && waitTimeMs > thresholds.normalToHigh) {\n return 'high'\n }\n\n // HIGH → CRITICAL(等待 > 50ms)\n if (currentPriority === 'high' && waitTimeMs > thresholds.highToCritical) {\n return 'critical'\n }\n\n return currentPriority\n }\n\n /**\n * 比較兩個事件的優先級\n * @returns 負數表示 task1 優先級更高,正數表示 task2 優先級更高\n */\n static comparePriority(task1: EventTask, task2: EventTask): number {\n const priority1 = (task1.options.priority as any) || 'normal'\n const priority2 = (task2.options.priority as any) || 'normal'\n\n const priorityOrder: Record<string, number> = {\n critical: 0,\n high: 1,\n normal: 2,\n low: 3,\n }\n\n // 按優先級排序\n const priorityDiff = priorityOrder[priority1] - priorityOrder[priority2]\n if (priorityDiff !== 0) {\n return priorityDiff\n }\n\n // 優先級相同時,按入隊時間排序(先進先出)\n return task1.enqueuedAt - task2.enqueuedAt\n }\n\n /**\n * 判斷事件是否應該立即處理(跳過隊列)\n */\n static shouldProcessImmediately(task: EventTask, config?: EventOptions['escalation']): boolean {\n const currentPriority = this.calculateCurrentPriority(task, config)\n return currentPriority === 'critical'\n }\n\n /**\n * 獲取事件當前的超期時間(毫秒)\n * 正數表示已超期,0 表示未超期\n */\n static calculateOverdueTime(task: EventTask, config?: EventOptions['escalation']): number {\n const nowMs = Date.now()\n const waitTimeMs = nowMs - task.enqueuedAt\n const currentPriority = this.calculateCurrentPriority(task, config)\n\n const expectedDelays: Record<string, number> = {\n critical: 1,\n high: 50,\n normal: 200,\n low: 500,\n }\n\n const expectedDelay = expectedDelays[currentPriority] ?? 500\n return Math.max(0, waitTimeMs - expectedDelay)\n }\n}\n\n/**\n * 優先級統計器\n * 追蹤優先級分布和升級事件\n *\n * @internal\n */\nexport class PriorityStatistics {\n private eventCounts: Record<'critical' | 'high' | 'normal' | 'low', number> = {\n critical: 0,\n high: 0,\n normal: 0,\n low: 0,\n }\n\n private escalationCounts: Map<string, number> = new Map()\n private totalEscalations = 0\n\n /**\n * 記錄一個優先級的事件\n */\n recordEvent(priority: 'critical' | 'high' | 'normal' | 'low'): void {\n this.eventCounts[priority] = (this.eventCounts[priority] ?? 0) + 1\n }\n\n /**\n * 記錄優先級升級\n */\n recordEscalation(\n fromPriority: 'critical' | 'high' | 'normal' | 'low',\n toPriority: 'critical' | 'high' | 'normal' | 'low'\n ): void {\n if (fromPriority === toPriority) {\n return\n }\n const key = `${fromPriority}->${toPriority}`\n this.escalationCounts.set(key, (this.escalationCounts.get(key) ?? 0) + 1)\n this.totalEscalations++\n }\n\n /**\n * 獲取優先級分布\n */\n getDistribution(): Record<'critical' | 'high' | 'normal' | 'low', string> {\n const total = Object.values(this.eventCounts).reduce((a, b) => a + b, 0)\n if (total === 0) {\n return {\n critical: '0%',\n high: '0%',\n normal: '0%',\n low: '0%',\n }\n }\n\n return {\n critical: `${((this.eventCounts.critical / total) * 100).toFixed(2)}%`,\n high: `${((this.eventCounts.high / total) * 100).toFixed(2)}%`,\n normal: `${((this.eventCounts.normal / total) * 100).toFixed(2)}%`,\n low: `${((this.eventCounts.low / total) * 100).toFixed(2)}%`,\n }\n }\n\n /**\n * 獲取升級統計\n */\n getEscalationStats(): {\n total: number\n byTransition: Record<string, number>\n } {\n return {\n total: this.totalEscalations,\n byTransition: Object.fromEntries(this.escalationCounts),\n }\n }\n\n /**\n * 重置統計信息\n */\n reset(): void {\n this.eventCounts = {\n critical: 0,\n high: 0,\n normal: 0,\n low: 0,\n }\n this.escalationCounts.clear()\n this.totalEscalations = 0\n }\n\n /**\n * 獲取所有統計信息\n */\n getStats(): {\n eventCounts: Record<'critical' | 'high' | 'normal' | 'low', number>\n escalationStats: {\n total: number\n byTransition: Record<string, number>\n }\n distribution: Record<'critical' | 'high' | 'normal' | 'low', string>\n } {\n return {\n eventCounts: this.eventCounts,\n escalationStats: this.getEscalationStats(),\n distribution: this.getDistribution(),\n }\n }\n}\n",
100
- "import { BackpressureManager } from './BackpressureManager'\nimport type { DeadLetterQueue } from './DeadLetterQueue'\nimport type { OTelEventMetrics } from './observability/OTelEventMetrics'\nimport { PriorityEscalationManager, type PriorityStatistics } from './PriorityEscalationManager'\nimport type {\n BackpressureStrategy,\n EventQueueConfig,\n EventTask,\n MultiPriorityQueueDepth,\n} from './types'\n\n/**\n * Result of an enqueue operation.\n *\n * - `{ status: 'queued', id }` - Task successfully queued\n * - `{ status: 'dropped' }` - Task dropped due to backpressure\n * - `{ status: 'delayed', id, delayMs }` - Task should be re-enqueued after delayMs\n *\n * @internal\n */\nexport type EnqueueResult =\n | { status: 'queued'; id: string }\n | { status: 'dropped' }\n | { status: 'delayed'; id: string; delayMs: number }\n\n/**\n * Priority queue core: manages event task queues and backpressure.\n *\n * Handles enqueueing, dequeuing, backpressure logic, and priority escalation.\n * This class is used internally by EventPriorityQueue as a composition target.\n *\n * @internal\n */\nexport class QueueCore {\n criticalPriority: EventTask[] = []\n highPriority: EventTask[] = []\n normalPriority: EventTask[] = []\n lowPriority: EventTask[] = []\n processingPartitions: Set<string> = new Set()\n\n private taskIdCounter = 0\n private dlq?: DeadLetterQueue\n private otelEventMetrics?: OTelEventMetrics\n private backpressureManager?: BackpressureManager\n private priorityStats?: PriorityStatistics\n private config: EventQueueConfig\n\n constructor(config: EventQueueConfig = {}) {\n this.config = config\n if (config.backpressure?.enabled !== false && config.backpressure) {\n this.backpressureManager = new BackpressureManager(config.backpressure)\n }\n }\n\n setDeadLetterQueue(dlq: DeadLetterQueue): void {\n this.dlq = dlq\n }\n\n setOTelEventMetrics(metrics: OTelEventMetrics): void {\n this.otelEventMetrics = metrics\n }\n\n setPriorityStatistics(stats: PriorityStatistics): void {\n this.priorityStats = stats\n }\n\n getPriorityStatistics(): PriorityStatistics | undefined {\n return this.priorityStats\n }\n\n getBackpressureManager(): BackpressureManager | undefined {\n return this.backpressureManager\n }\n\n getConfig(): EventQueueConfig {\n return this.config\n }\n\n getDLQ(): DeadLetterQueue | undefined {\n return this.dlq\n }\n\n createTaskId(): string {\n return `task-${++this.taskIdCounter}-${Date.now()}`\n }\n\n /**\n * Enqueue a task into the appropriate priority queue.\n * Applies priority escalation and backpressure logic.\n */\n enqueue(task: EventTask): EnqueueResult {\n // === Apply priority escalation if enabled ===\n if (task.options.escalation?.enabled !== false) {\n const originalPriority = task.options.priority || 'normal'\n const escalatedPriority = PriorityEscalationManager.calculateCurrentPriority(\n task,\n task.options.escalation\n )\n\n if (escalatedPriority !== originalPriority) {\n this.priorityStats?.recordEscalation(originalPriority, escalatedPriority)\n this.otelEventMetrics?.recordPriorityEscalation(\n task.hook,\n originalPriority,\n escalatedPriority\n )\n }\n\n task.options.priority = escalatedPriority\n }\n\n const priority = task.options.priority || 'normal'\n this.priorityStats?.recordEvent(priority as any)\n\n // === Evaluate advanced backpressure if enabled ===\n if (this.backpressureManager) {\n const decision = this.backpressureManager.evaluate(\n task.hook,\n priority as 'critical' | 'high' | 'normal' | 'low',\n this.getDepth(),\n {\n critical: this.criticalPriority.length,\n high: this.highPriority.length,\n normal: this.normalPriority.length,\n low: this.lowPriority.length,\n }\n )\n\n if (!decision.allowed) {\n this.otelEventMetrics?.recordBackpressureRejection(\n task.hook,\n priority,\n decision.reason || 'unknown'\n )\n\n if (decision.isOverflow && this.config.backpressure?.dlqOnOverflow && this.dlq) {\n const overflowError = new Error(`Backpressure OVERFLOW: ${decision.reason}`)\n this.dlq.add(\n task.hook,\n task.args,\n task.options,\n overflowError,\n task.retryCount || 0,\n Date.now(),\n 'backpressure_overflow'\n )\n this.otelEventMetrics?.recordDLQEntry(task.hook, 'backpressure_overflow')\n }\n\n if (this.config.backpressure?.rejectionPolicy === 'throw') {\n throw new Error(`[BackpressureManager] Event rejected: ${decision.reason}`)\n }\n return { status: 'dropped' }\n }\n\n if (decision.delayed && decision.delayMs) {\n return { status: 'delayed', id: task.id, delayMs: decision.delayMs }\n }\n }\n\n // === Fall back to simple backpressure (maxSize + strategy) ===\n if (this.config.maxSize && this.getDepth() >= this.config.maxSize) {\n if (!this.handleBackpressure(task.hook)) {\n return { status: 'dropped' }\n }\n }\n\n const finalPriority = task.options.priority || 'normal'\n\n switch (finalPriority) {\n case 'critical':\n this.criticalPriority.push(task)\n break\n case 'high':\n this.highPriority.push(task)\n break\n case 'normal':\n this.normalPriority.push(task)\n break\n case 'low':\n this.lowPriority.push(task)\n break\n }\n\n this.syncBackpressure()\n return { status: 'queued', id: task.id }\n }\n\n /**\n * Dequeue the next task based on priority and partition ordering.\n * Priority order: CRITICAL > HIGH > NORMAL > LOW\n */\n dequeue(): EventTask | undefined {\n return (\n this.dequeueFromPriority(this.criticalPriority) ||\n this.dequeueFromPriority(this.highPriority) ||\n this.dequeueFromPriority(this.normalPriority) ||\n this.dequeueFromPriority(this.lowPriority)\n )\n }\n\n /**\n * Re-enqueue a task for retry.\n */\n enqueueRetry(task: EventTask): void {\n const priority = task.options.priority || 'normal'\n\n switch (priority) {\n case 'high':\n this.highPriority.push(task)\n break\n case 'normal':\n this.normalPriority.push(task)\n break\n case 'low':\n this.lowPriority.push(task)\n break\n }\n }\n\n getDepth(): number {\n return (\n this.criticalPriority.length +\n this.highPriority.length +\n this.normalPriority.length +\n this.lowPriority.length\n )\n }\n\n getDepthByPriority(priority: 'critical' | 'high' | 'normal' | 'low'): number {\n switch (priority) {\n case 'critical':\n return this.criticalPriority.length\n case 'high':\n return this.highPriority.length\n case 'normal':\n return this.normalPriority.length\n case 'low':\n return this.lowPriority.length\n }\n }\n\n getQueueDepthByPriority(): MultiPriorityQueueDepth {\n return {\n critical: this.criticalPriority.length,\n high: this.highPriority.length,\n normal: this.normalPriority.length,\n low: this.lowPriority.length,\n total: this.getDepth(),\n }\n }\n\n clear(): void {\n this.highPriority = []\n this.normalPriority = []\n this.lowPriority = []\n }\n\n syncBackpressure(): void {\n if (!this.backpressureManager) {\n return\n }\n const depths = this.getQueueDepthByPriority()\n this.backpressureManager.updateQueueDepth(depths)\n }\n\n private handleBackpressure(hook: string): boolean {\n const strategy = this.config.strategy || 'reject'\n\n switch (strategy) {\n case 'reject':\n throw new Error(\n `[EventPriorityQueue] Queue full (size: ${this.config.maxSize}). Rejected event '${hook}'.`\n )\n case 'drop-newest':\n console.warn(`[EventPriorityQueue] Queue full. Dropping new event '${hook}' (drop-newest).`)\n return false\n case 'ignore':\n return false\n case 'drop-oldest':\n this.dropOldest()\n return true\n default:\n throw new Error(\n `[EventPriorityQueue] Queue full (size: ${this.config.maxSize}). Rejected event '${hook}'.`\n )\n }\n }\n\n private dropOldest(): void {\n if (this.lowPriority.length > 0) {\n const dropped = this.lowPriority.shift()\n console.warn(\n `[EventPriorityQueue] Queue full. Dropped oldest LOW priority event '${dropped?.hook}'.`\n )\n return\n }\n if (this.normalPriority.length > 0) {\n const dropped = this.normalPriority.shift()\n console.warn(\n `[EventPriorityQueue] Queue full. Dropped oldest NORMAL priority event '${dropped?.hook}'.`\n )\n return\n }\n if (this.highPriority.length > 0) {\n const dropped = this.highPriority.shift()\n console.warn(\n `[EventPriorityQueue] Queue full. Dropped oldest HIGH priority event '${dropped?.hook}'.`\n )\n return\n }\n if (this.criticalPriority.length > 0) {\n const dropped = this.criticalPriority.shift()\n console.warn(\n `[EventPriorityQueue] Queue full. Dropped oldest CRITICAL priority event '${dropped?.hook}'.`\n )\n return\n }\n }\n\n private dequeueFromPriority(queue: EventTask[]): EventTask | undefined {\n const taskIndex = queue.findIndex((task) => {\n if (task.options.ordering !== 'partition' || !task.partitionKey) {\n return true\n }\n return !this.processingPartitions.has(task.partitionKey)\n })\n\n if (taskIndex === -1) {\n return undefined\n }\n\n return queue.splice(taskIndex, 1)[0]\n }\n}\n\nexport type { BackpressureStrategy, EventQueueConfig, EventTask }\n",
101
- "/**\n * Circuit Breaker state enum.\n * @public\n */\nexport enum CircuitBreakerState {\n CLOSED = 'CLOSED',\n OPEN = 'OPEN',\n HALF_OPEN = 'HALF_OPEN',\n}\n\n/**\n * Circuit Breaker metrics snapshot.\n * @public\n */\nexport interface CircuitBreakerMetrics {\n /**\n * Current state of the circuit breaker\n */\n state: CircuitBreakerState\n\n /**\n * Number of failures in the current window\n */\n failures: number\n\n /**\n * Number of successes in the current window\n */\n successes: number\n\n /**\n * Timestamp of the last failure\n */\n lastFailureAt?: Date\n\n /**\n * Timestamp of the last success\n */\n lastSuccessAt?: Date\n\n /**\n * Timestamp when the circuit was opened\n */\n openedAt?: Date\n\n /**\n * Total requests processed\n */\n totalRequests: number\n\n /**\n * Total failures recorded\n */\n totalFailures: number\n\n /**\n * Total successes recorded\n */\n totalSuccesses: number\n}\n\n/**\n * Circuit Breaker metrics recorder interface.\n * @public\n */\nexport interface CircuitBreakerMetricsRecorder {\n /**\n * Record current state of the circuit breaker.\n * @param eventName - Name of the event\n * @param state - State as number (0=CLOSED, 1=HALF_OPEN, 2=OPEN)\n */\n recordState: (eventName: string, state: number) => void\n\n /**\n * Record state transition.\n */\n recordTransition: (eventName: string, fromState: string, toState: string) => void\n\n /**\n * Record a failure.\n */\n recordFailure: (eventName: string) => void\n\n /**\n * Record a success.\n */\n recordSuccess: (eventName: string) => void\n\n /**\n * Record OPEN state duration.\n */\n recordOpenDuration: (eventName: string, seconds: number) => void\n}\n\n/**\n * Circuit Breaker configuration options.\n * @public\n */\nexport interface CircuitBreakerOptions {\n /**\n * Number of consecutive failures before opening the circuit.\n * @default 5\n */\n failureThreshold?: number\n\n /**\n * Time in milliseconds to wait before attempting to close the circuit (move to HALF_OPEN).\n * @default 30000\n */\n resetTimeout?: number\n\n /**\n * Number of test requests to allow given the circuit is in HALF_OPEN state.\n * If these succeed, the circuit closes. If any fail, it opens again.\n * @default 3\n */\n halfOpenRequests?: number\n\n /**\n * Number of successes required in HALF_OPEN state to close the circuit.\n * @default 2\n */\n successThreshold?: number\n\n /**\n * Time in milliseconds for the sliding window to track failures.\n * Failures outside this window are not counted.\n * @default 60000\n */\n windowSize?: number\n\n /**\n * Enable or disable the circuit breaker.\n * @default true\n */\n enabled?: boolean\n\n /**\n * Callback when circuit opens.\n */\n onOpen?: (name?: string) => void\n\n /**\n * Callback when circuit moves to half-open.\n */\n onHalfOpen?: (name?: string) => void\n\n /**\n * Callback when circuit closes.\n */\n onClose?: (name?: string) => void\n\n /**\n * Metrics recorder for recording circuit breaker events.\n * Optional - if not provided, metrics will not be recorded.\n */\n metricsRecorder?: CircuitBreakerMetricsRecorder | undefined\n}\n\n/**\n * Required Circuit Breaker configuration (with defaults applied).\n * @internal\n */\nexport interface RequiredCircuitBreakerOptions\n extends Required<Omit<CircuitBreakerOptions, 'metricsRecorder'>> {\n metricsRecorder?: CircuitBreakerMetricsRecorder\n}\n\n/**\n * Circuit Breaker implementation for fault tolerance.\n *\n * Prevents cascading failures by stopping execution of a failing operation\n * for a specified period after a threshold of failures is reached.\n *\n * Supports sliding window algorithm, enabling/disabling, and detailed metrics.\n *\n * @public\n */\nexport class CircuitBreaker {\n private state: CircuitBreakerState = CircuitBreakerState.CLOSED\n private failureCount = 0\n private successCount = 0\n private name: string\n private config: RequiredCircuitBreakerOptions\n private metricsRecorder?: CircuitBreakerMetricsRecorder\n\n // Advanced tracking\n private lastFailureAt?: Date\n private lastSuccessAt?: Date\n private openedAt?: Date\n private totalRequests = 0\n private totalFailures = 0\n private totalSuccesses = 0\n private halfOpenAttempts = 0\n\n /**\n * Create a new Circuit Breaker.\n *\n * Supports two signatures for backward compatibility:\n * - CircuitBreaker(options?: CircuitBreakerOptions) - anonymous breaker\n * - CircuitBreaker(name: string, options?: CircuitBreakerOptions) - named breaker\n *\n * @param nameOrOptions - Circuit breaker name or options\n * @param maybeOptions - Options (used when first param is a string)\n */\n constructor(\n nameOrOptions?: string | CircuitBreakerOptions,\n maybeOptions?: CircuitBreakerOptions\n ) {\n // Parse overloaded constructor\n let options: CircuitBreakerOptions = {}\n\n if (typeof nameOrOptions === 'string') {\n this.name = nameOrOptions\n options = maybeOptions || {}\n } else if (typeof nameOrOptions === 'object' && nameOrOptions !== null) {\n this.name = 'circuit-breaker'\n options = nameOrOptions\n } else {\n this.name = 'circuit-breaker'\n }\n\n // Store metrics recorder if provided\n this.metricsRecorder = options.metricsRecorder\n\n // Apply defaults\n this.config = {\n failureThreshold: 5,\n resetTimeout: 30000,\n halfOpenRequests: 3,\n successThreshold: 2,\n windowSize: 60000,\n enabled: true,\n onOpen: options.onOpen || (() => {}),\n onHalfOpen: options.onHalfOpen || (() => {}),\n onClose: options.onClose || (() => {}),\n ...options,\n }\n }\n\n /**\n * Execute an operation through the circuit breaker.\n *\n * @param operation - Async operation to execute\n * @returns Operation result\n * @throws Error if circuit is open or operation fails\n */\n async execute<T>(operation: () => Promise<T>): Promise<T> {\n if (!this.config.enabled) {\n return await operation()\n }\n\n this.checkStateTransition()\n\n const now = Date.now()\n\n if (this.state === CircuitBreakerState.OPEN) {\n throw new Error(`Circuit is OPEN for ${this.name}`)\n }\n\n this.totalRequests++\n\n if (this.lastFailureAt) {\n const elapsed = now - this.lastFailureAt.getTime()\n if (elapsed >= this.config.windowSize) {\n this.failureCount = 0\n }\n }\n\n try {\n const result = await operation()\n this.onSuccess()\n return result\n } catch (error) {\n this.onFailure()\n throw error\n }\n }\n\n /**\n * Check if the circuit breaker is currently OPEN.\n */\n isOpen(): boolean {\n this.checkStateTransition()\n return this.state === CircuitBreakerState.OPEN\n }\n\n /**\n * Check if the circuit breaker is currently HALF_OPEN.\n */\n isHalfOpen(): boolean {\n this.checkStateTransition()\n return this.state === CircuitBreakerState.HALF_OPEN\n }\n\n /**\n * Check if the circuit breaker is currently CLOSED.\n */\n isClosed(): boolean {\n this.checkStateTransition()\n return this.state === CircuitBreakerState.CLOSED\n }\n\n /**\n * Get current state of the circuit breaker.\n */\n getState(): CircuitBreakerState {\n return this.state\n }\n\n /**\n * Get failure count (deprecated, use getMetrics for complete information).\n */\n getFailureCount(): number {\n return this.failureCount\n }\n\n /**\n * Get the name of this circuit breaker.\n */\n getName(): string {\n return this.name\n }\n\n /**\n * Get detailed metrics snapshot of the circuit breaker.\n */\n getMetrics(): CircuitBreakerMetrics {\n return {\n state: this.state,\n failures: this.failureCount,\n successes: this.successCount,\n lastFailureAt: this.lastFailureAt,\n lastSuccessAt: this.lastSuccessAt,\n openedAt: this.openedAt,\n totalRequests: this.totalRequests,\n totalFailures: this.totalFailures,\n totalSuccesses: this.totalSuccesses,\n }\n }\n\n /**\n * Manually reset the circuit breaker to CLOSED state.\n */\n reset(): void {\n this.failureCount = 0\n this.successCount = 0\n this.halfOpenAttempts = 0\n this.openedAt = undefined\n this.transitionTo(CircuitBreakerState.CLOSED)\n }\n\n /**\n * Forcefully reset the circuit breaker (alias for reset).\n */\n manualReset(): void {\n this.reset()\n }\n\n /**\n * Check for automatic state transitions based on time and sliding window.\n */\n checkStateTransition(): void {\n if (this.state === CircuitBreakerState.OPEN && this.openedAt) {\n const elapsed = Date.now() - this.openedAt.getTime()\n if (elapsed >= this.config.resetTimeout) {\n this.transitionTo(CircuitBreakerState.HALF_OPEN)\n this.halfOpenAttempts = 0\n }\n }\n\n if (this.lastFailureAt) {\n const elapsed = Date.now() - this.lastFailureAt.getTime()\n if (elapsed >= this.config.windowSize) {\n this.failureCount = 0\n }\n }\n }\n\n private onSuccess(): void {\n this.lastSuccessAt = new Date()\n this.successCount++\n this.totalSuccesses++\n\n this.metricsRecorder?.recordSuccess(this.name)\n\n if (this.state === CircuitBreakerState.HALF_OPEN) {\n this.halfOpenAttempts++\n if (this.halfOpenAttempts >= this.config.successThreshold) {\n this.transitionTo(CircuitBreakerState.CLOSED)\n this.reset()\n }\n } else if (this.state === CircuitBreakerState.CLOSED) {\n this.failureCount = 0\n }\n }\n\n private onFailure(): void {\n this.lastFailureAt = new Date()\n this.totalFailures++\n this.failureCount++\n\n this.metricsRecorder?.recordFailure(this.name)\n\n if (this.state === CircuitBreakerState.HALF_OPEN) {\n this.transitionTo(CircuitBreakerState.OPEN)\n this.openedAt = new Date()\n } else if (this.state === CircuitBreakerState.CLOSED) {\n if (this.failureCount >= this.config.failureThreshold) {\n this.transitionTo(CircuitBreakerState.OPEN)\n this.openedAt = new Date()\n }\n } else if (this.state === CircuitBreakerState.OPEN) {\n this.openedAt = new Date()\n }\n }\n\n private transitionTo(newState: CircuitBreakerState): void {\n const oldState = this.state\n\n if (this.metricsRecorder && oldState !== newState) {\n this.metricsRecorder.recordTransition(this.name, oldState, newState)\n this.metricsRecorder.recordState(this.name, this.stateToNumber(newState))\n }\n\n if (oldState === CircuitBreakerState.OPEN && this.openedAt && this.metricsRecorder) {\n const duration = (Date.now() - this.openedAt.getTime()) / 1000\n this.metricsRecorder.recordOpenDuration(this.name, duration)\n }\n\n this.state = newState\n\n switch (newState) {\n case CircuitBreakerState.OPEN:\n this.config.onOpen(this.name)\n break\n case CircuitBreakerState.HALF_OPEN:\n this.halfOpenAttempts = 0\n this.config.onHalfOpen(this.name)\n break\n case CircuitBreakerState.CLOSED:\n this.failureCount = 0\n this.successCount = 0\n this.halfOpenAttempts = 0\n this.openedAt = undefined\n this.config.onClose(this.name)\n break\n }\n }\n\n private stateToNumber(state: CircuitBreakerState): number {\n switch (state) {\n case CircuitBreakerState.CLOSED:\n return 0\n case CircuitBreakerState.HALF_OPEN:\n return 1\n case CircuitBreakerState.OPEN:\n return 2\n default:\n return 0\n }\n }\n}\n",
102
- "import type { Span } from '@opentelemetry/api'\nimport type { ActionCallback } from '../HookManager'\nimport { CircuitBreaker } from './CircuitBreaker'\nimport type { DeadLetterQueue, DLQEntrySource } from './DeadLetterQueue'\nimport type { EventOptions } from './EventOptions'\nimport type { EventMetrics } from './observability/EventMetrics'\nimport type { EventTracing } from './observability/EventTracing'\nimport type { OTelEventMetrics } from './observability/OTelEventMetrics'\nimport type { RetryScheduler } from './RetryScheduler'\nimport type { EventTask } from './types'\n\n/**\n * Executes event tasks with circuit breaker protection, retry logic,\n * exponential backoff, DLQ integration, and distributed tracing.\n *\n * @internal\n */\nexport class TaskExecutor {\n private eventCircuitBreakers: Map<string, CircuitBreaker> = new Map()\n private eventMetrics?: EventMetrics\n private otelEventMetrics?: OTelEventMetrics\n private eventTracing?: EventTracing\n private currentDispatchSpan?: Span\n private retryScheduler?: RetryScheduler\n\n private dlq?: DeadLetterQueue\n private persistentDLQHandler?: (\n hook: string,\n args: unknown,\n options: EventOptions,\n error: Error,\n retryCount: number,\n firstFailedAt: number\n ) => Promise<void>\n\n private enqueueRetryFn?: (task: EventTask) => void\n\n setDeadLetterQueue(dlq: DeadLetterQueue): void {\n this.dlq = dlq\n }\n\n setPersistentDLQHandler(\n handler: (\n hook: string,\n args: unknown,\n options: EventOptions,\n error: Error,\n retryCount: number,\n firstFailedAt: number\n ) => Promise<void>\n ): void {\n this.persistentDLQHandler = handler\n }\n\n setEventMetrics(metrics: EventMetrics): void {\n this.eventMetrics = metrics\n }\n\n setOTelEventMetrics(metrics: OTelEventMetrics): void {\n this.otelEventMetrics = metrics\n }\n\n setEventTracing(tracing: EventTracing): void {\n this.eventTracing = tracing\n }\n\n setCurrentDispatchSpan(span: Span | undefined): void {\n this.currentDispatchSpan = span\n }\n\n getCurrentDispatchSpan(): Span | undefined {\n return this.currentDispatchSpan\n }\n\n setRetryScheduler(scheduler: RetryScheduler): void {\n this.retryScheduler = scheduler\n }\n\n getRetryScheduler(): RetryScheduler | undefined {\n return this.retryScheduler\n }\n\n /**\n * Set the callback to use when re-enqueueing a task after a retry delay.\n */\n setEnqueueRetryFn(fn: (task: EventTask) => void): void {\n this.enqueueRetryFn = fn\n }\n\n getCircuitBreaker(hook: string) {\n return this.eventCircuitBreakers.get(hook)\n }\n\n getCircuitBreakers() {\n return this.eventCircuitBreakers\n }\n\n resetCircuitBreaker(hook: string): boolean {\n const breaker = this.eventCircuitBreakers.get(hook)\n if (!breaker) {\n return false\n }\n breaker.reset()\n return true\n }\n\n /**\n * Execute an event task by running all its callbacks.\n * Implements circuit breaker protection, retry logic, and DLQ integration.\n */\n async executeTask(task: EventTask, processingPartitions: Set<string>): Promise<void> {\n const { callbacks, args, options, hook, partitionKey } = task\n const timeout = options.timeout || 5000\n const retryConfig = options.retry || {}\n const maxRetries = retryConfig.maxRetries || 0\n const circuitBreakerConfig = options.circuitBreaker\n\n const circuitBreaker = this.getOrCreateEventCircuitBreaker(hook, circuitBreakerConfig)\n\n if (options.ordering === 'partition' && partitionKey) {\n processingPartitions.add(partitionKey)\n }\n\n try {\n let lastError: Error | undefined\n let listenerIndex = 0\n\n for (const callback of callbacks) {\n let listenerSpan: Span | undefined\n const listenerStartTime = performance.now()\n\n if (this.eventTracing && this.currentDispatchSpan) {\n const listenerName = callback.name || `listener_${listenerIndex}`\n listenerSpan = this.eventTracing.startListenerSpan(\n this.currentDispatchSpan,\n hook,\n listenerName,\n listenerIndex\n )\n }\n\n try {\n if (circuitBreaker) {\n await circuitBreaker.execute(async () => {\n return await this.executeWithTimeout(callback, args, timeout)\n })\n } else {\n await this.executeWithTimeout(callback, args, timeout)\n }\n\n if (listenerSpan && this.eventTracing) {\n const duration = performance.now() - listenerStartTime\n this.eventTracing.endListenerSpan(listenerSpan, 'ok', duration)\n }\n } catch (error) {\n if (listenerSpan && this.eventTracing) {\n const duration = performance.now() - listenerStartTime\n this.eventTracing.endListenerSpan(listenerSpan, 'error', duration, error as Error)\n }\n lastError = error as Error\n\n const isCircuitBreakerOpen = lastError.message.includes('Circuit is OPEN')\n\n if (isCircuitBreakerOpen) {\n console.warn(\n `[EventPriorityQueue] Circuit breaker is open for event '${hook}'. Rejecting event.`\n )\n\n if (retryConfig.dlqAfterMaxRetries) {\n if (!task.firstFailedAt) {\n task.firstFailedAt = Date.now()\n }\n\n await this.sendToDLQ(\n hook,\n args,\n options,\n lastError,\n task.retryCount || 0,\n task.firstFailedAt!,\n 'circuit_breaker'\n )\n\n console.error(\n `[EventPriorityQueue] Event '${hook}' sent to DLQ due to circuit breaker`\n )\n }\n\n break\n }\n\n console.error(`[EventPriorityQueue] Error in callback for event '${hook}':`, error)\n\n if (!task.firstFailedAt) {\n task.firstFailedAt = Date.now()\n }\n\n task.lastError = lastError\n task.retryCount = (task.retryCount || 0) + 1\n\n this.otelEventMetrics?.recordRetryAttempt(hook, task.retryCount)\n\n if (task.retryCount <= maxRetries) {\n console.warn(\n `[EventPriorityQueue] Retrying event '${hook}' (attempt ${task.retryCount}/${maxRetries})`\n )\n\n if (this.retryScheduler?.isEnabled()) {\n try {\n await this.retryScheduler.scheduleRetry(\n hook,\n args,\n options,\n lastError,\n task.retryCount\n )\n return\n } catch (schedulerError) {\n console.warn(\n '[EventPriorityQueue] RetryScheduler failed, falling back to setTimeout:',\n schedulerError instanceof Error ? schedulerError.message : String(schedulerError)\n )\n }\n }\n\n const delay = this.calculateRetryDelay(\n task.retryCount,\n retryConfig.backoff || 'exponential',\n retryConfig.initialDelayMs || 1000,\n retryConfig.maxDelayMs || 30000\n )\n\n setTimeout(() => {\n this.enqueueRetryFn?.(task)\n }, delay)\n\n return\n }\n\n if (retryConfig.dlqAfterMaxRetries) {\n await this.sendToDLQ(\n hook,\n args,\n options,\n lastError,\n task.retryCount,\n task.firstFailedAt!,\n 'retry_exhausted'\n )\n\n console.error(\n `[EventPriorityQueue] Event '${hook}' sent to DLQ after ${task.retryCount} failed attempts`\n )\n } else {\n console.error(\n `[EventPriorityQueue] Event '${hook}' permanently failed after ${task.retryCount} attempts`\n )\n }\n\n break\n }\n\n listenerIndex++\n }\n } finally {\n if (options.ordering === 'partition' && partitionKey) {\n processingPartitions.delete(partitionKey)\n }\n }\n }\n\n private async sendToDLQ(\n hook: string,\n args: unknown,\n options: EventOptions,\n error: Error,\n retryCount: number,\n firstFailedAt: number,\n reason: DLQEntrySource\n ): Promise<void> {\n if (this.dlq) {\n this.dlq.add(hook, args, options, error, retryCount, firstFailedAt, reason)\n this.otelEventMetrics?.recordDLQEntry(hook, reason as string)\n }\n\n if (this.persistentDLQHandler) {\n try {\n await this.persistentDLQHandler(hook, args, options, error, retryCount, firstFailedAt)\n } catch (dlqHandlerError) {\n console.error(`[EventPriorityQueue] Error handling persistent DLQ:`, dlqHandlerError)\n }\n }\n }\n\n private getOrCreateEventCircuitBreaker(\n hook: string,\n config?: EventOptions['circuitBreaker']\n ): CircuitBreaker | undefined {\n if (!config) {\n return undefined\n }\n\n if (this.eventCircuitBreakers.has(hook)) {\n return this.eventCircuitBreakers.get(hook)!\n }\n\n const breaker = new CircuitBreaker(hook, {\n failureThreshold: config.failureThreshold,\n resetTimeout: config.resetTimeout,\n halfOpenRequests: config.halfOpenRequests,\n onOpen: () => {\n console.warn(`[EventPriorityQueue] Circuit breaker opened for event '${hook}'`)\n },\n onHalfOpen: () => {\n console.info(`[EventPriorityQueue] Circuit breaker half-open for event '${hook}'`)\n },\n onClose: () => {\n console.info(`[EventPriorityQueue] Circuit breaker closed for event '${hook}'`)\n },\n metricsRecorder: this.eventMetrics\n ? {\n recordState: (name, state) => this.eventMetrics?.recordCircuitBreakerState(name, state),\n recordTransition: (name, from, to) =>\n this.eventMetrics?.recordCircuitBreakerTransition(name, from, to),\n recordFailure: (name) => this.eventMetrics?.recordCircuitBreakerFailure(name),\n recordSuccess: (name) => this.eventMetrics?.recordCircuitBreakerSuccess(name),\n recordOpenDuration: (name, seconds) =>\n this.eventMetrics?.recordCircuitBreakerOpenDuration(name, seconds),\n }\n : undefined,\n })\n\n this.eventCircuitBreakers.set(hook, breaker)\n return breaker\n }\n\n private calculateRetryDelay(\n retryCount: number,\n backoff: 'exponential' | 'linear',\n initialDelay: number,\n maxDelay: number\n ): number {\n let delay: number\n\n if (backoff === 'exponential') {\n delay = initialDelay * 2 ** (retryCount - 1)\n } else {\n delay = initialDelay * retryCount\n }\n\n return Math.min(delay, maxDelay)\n }\n\n private async executeWithTimeout(\n callback: ActionCallback,\n args: unknown,\n timeoutMs: number\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Callback timeout after ${timeoutMs}ms`))\n }, timeoutMs)\n\n Promise.resolve(callback(args))\n .then(() => {\n clearTimeout(timer)\n resolve()\n })\n .catch((error) => {\n clearTimeout(timer)\n reject(error)\n })\n })\n }\n}\n",
103
- "import type { Span } from '@opentelemetry/api'\nimport type { ActionCallback } from '../HookManager'\nimport type { BackpressureManager } from './BackpressureManager'\nimport type { DeadLetterQueue } from './DeadLetterQueue'\nimport type { EventBackend } from './EventBackend'\nimport type { EventOptions } from './EventOptions'\nimport type { EventMetrics } from './observability/EventMetrics'\nimport type { EventTracing } from './observability/EventTracing'\nimport type { OTelEventMetrics } from './observability/OTelEventMetrics'\nimport type { PriorityStatistics } from './PriorityEscalationManager'\nimport { QueueCore } from './queue-core'\nimport type { RetryScheduler } from './RetryScheduler'\nimport { TaskExecutor } from './task-executor'\nimport type {\n BackpressureStrategy,\n EventQueueConfig,\n EventTask,\n MultiPriorityQueueDepth,\n} from './types'\nimport type { WorkerPool } from './WorkerPool'\n\nexport type { EventTask, EventQueueConfig, BackpressureStrategy }\n\n/**\n * Priority queue for event processing.\n * Events are processed based on their priority level:\n * - Critical priority events are processed first (< 1ms)\n * - High priority events are processed second (< 50ms)\n * - Normal priority events are processed third (< 200ms)\n * - Low priority events are processed last (< 500ms)\n *\n * Supports automatic priority escalation based on wait time.\n *\n * Composed of:\n * - {@link QueueCore}: queue data structures and backpressure logic\n * - {@link TaskExecutor}: task execution, retry, circuit breaker, DLQ\n *\n * @internal\n */\nexport class EventPriorityQueue implements EventBackend {\n private queueCore: QueueCore\n private taskExecutor: TaskExecutor\n private processing = false\n private workerPool?: WorkerPool\n\n constructor(config: EventQueueConfig = {}) {\n this.queueCore = new QueueCore(config)\n this.taskExecutor = new TaskExecutor()\n this.taskExecutor.setEnqueueRetryFn((task) => {\n this.queueCore.enqueueRetry(task)\n if (!this.processing) {\n this.processNext()\n }\n })\n }\n\n // ========== DLQ ==========\n\n setDeadLetterQueue(dlq: DeadLetterQueue): void {\n this.queueCore.setDeadLetterQueue(dlq)\n this.taskExecutor.setDeadLetterQueue(dlq)\n }\n\n setPersistentDLQHandler(\n handler: (\n hook: string,\n args: unknown,\n options: EventOptions,\n error: Error,\n retryCount: number,\n firstFailedAt: number\n ) => Promise<void>\n ): void {\n this.taskExecutor.setPersistentDLQHandler(handler)\n }\n\n // ========== Observability ==========\n\n setEventMetrics(metrics: EventMetrics): void {\n this.taskExecutor.setEventMetrics(metrics)\n }\n\n setOTelEventMetrics(metrics: OTelEventMetrics): void {\n this.queueCore.setOTelEventMetrics(metrics)\n this.taskExecutor.setOTelEventMetrics(metrics)\n }\n\n setPriorityStatistics(stats: PriorityStatistics): void {\n this.queueCore.setPriorityStatistics(stats)\n }\n\n getPriorityStatistics(): PriorityStatistics | undefined {\n return this.queueCore.getPriorityStatistics()\n }\n\n setEventTracing(tracing: EventTracing): void {\n this.taskExecutor.setEventTracing(tracing)\n }\n\n setCurrentDispatchSpan(span: Span | undefined): void {\n this.taskExecutor.setCurrentDispatchSpan(span)\n }\n\n getCurrentDispatchSpan(): Span | undefined {\n return this.taskExecutor.getCurrentDispatchSpan()\n }\n\n // ========== Retry Scheduler ==========\n\n setRetryScheduler(scheduler: RetryScheduler): void {\n this.taskExecutor.setRetryScheduler(scheduler)\n }\n\n getRetryScheduler(): RetryScheduler | undefined {\n return this.taskExecutor.getRetryScheduler()\n }\n\n // ========== Circuit Breaker ==========\n\n getCircuitBreaker(hook: string) {\n return this.taskExecutor.getCircuitBreaker(hook)\n }\n\n getCircuitBreakers() {\n return this.taskExecutor.getCircuitBreakers()\n }\n\n resetCircuitBreaker(hook: string): boolean {\n return this.taskExecutor.resetCircuitBreaker(hook)\n }\n\n // ========== Worker Pool ==========\n\n setWorkerPool(pool: WorkerPool): void {\n this.workerPool = pool\n }\n\n getWorkerPool(): WorkerPool | undefined {\n return this.workerPool\n }\n\n // ========== Backpressure ==========\n\n getBackpressureManager(): BackpressureManager | undefined {\n return this.queueCore.getBackpressureManager()\n }\n\n // ========== Enqueue ==========\n\n /*\n * Enqueue an event task.\n */\n enqueue(task: EventTask): string\n enqueue(hook: string, args: unknown, callbacks: ActionCallback[], options: EventOptions): string\n enqueue(\n hookOrTask: string | EventTask,\n args?: unknown,\n callbacks?: ActionCallback[],\n options?: EventOptions\n ): string {\n let task: EventTask\n\n if (typeof hookOrTask !== 'string') {\n task = hookOrTask\n } else {\n const taskId = this.queueCore.createTaskId()\n const nowMs = Date.now()\n task = {\n id: taskId,\n hook: hookOrTask,\n args,\n options: options!,\n callbacks: callbacks!,\n createdAt: nowMs,\n enqueuedAt: nowMs,\n partitionKey: options?.partitionKey,\n retryCount: 0,\n }\n }\n\n const result = this.queueCore.enqueue(task)\n\n if (result.status === 'dropped') {\n return 'dropped'\n }\n\n if (result.status === 'delayed') {\n setTimeout(() => {\n this.enqueue(task)\n }, result.delayMs)\n return result.id\n }\n\n // Task was successfully queued - trigger processing\n const finalPriority = task.options.priority || 'normal'\n if (finalPriority === 'critical') {\n if (!this.processing) {\n setImmediate(() => this.processNext())\n }\n } else if (!this.processing) {\n this.processNext()\n }\n\n return result.id\n }\n\n enqueueBatch(tasks: EventTask[]): string[] {\n const taskIds: string[] = []\n\n for (const task of tasks) {\n const id = this.enqueue(task)\n taskIds.push(id)\n }\n\n if (tasks.length > 0 && !this.processing) {\n setImmediate(() => this.processNext())\n }\n\n return taskIds\n }\n\n // ========== Depth ==========\n\n getDepth(): number {\n return this.queueCore.getDepth()\n }\n\n getDepthByPriority(priority: 'critical' | 'high' | 'normal' | 'low'): number {\n return this.queueCore.getDepthByPriority(priority)\n }\n\n getQueueDepthByPriority(): MultiPriorityQueueDepth {\n return this.queueCore.getQueueDepthByPriority()\n }\n\n clear(): void {\n this.queueCore.clear()\n }\n\n dequeue(): EventTask | undefined {\n return this.queueCore.dequeue()\n }\n\n // ========== Internal Processing ==========\n\n private async processNext(): Promise<void> {\n if (this.processing) {\n return\n }\n\n const task = this.queueCore.dequeue()\n if (!task) {\n return\n }\n\n this.processing = true\n\n try {\n if (this.workerPool) {\n await this.workerPool.submitTask(task)\n } else {\n await this.taskExecutor.executeTask(task, this.queueCore.processingPartitions)\n }\n } catch (error) {\n console.error(`[EventPriorityQueue] Error processing task ${task.id}:`, error)\n } finally {\n this.processing = false\n this.queueCore.syncBackpressure()\n setImmediate(() => this.processNext())\n }\n }\n}\n",
104
- "/**\n * Event aggregation and deduplication types (FS-102)\n * @internal\n */\n\nimport { BackpressureState } from '../BackpressureManager'\n\n/**\n * Deduplication statistics.\n */\nexport interface DeduplicationStats {\n /** Total events submitted */\n totalEvents: number\n /** Events after deduplication */\n deduplicatedEvents: number\n /** Events removed by deduplication */\n removedCount: number\n /** Number of patterns aggregated */\n patternsAggregated: number\n /** Deduplication rate (%) */\n deduplicationRate: number\n}\n\n/**\n * Batch submission statistics.\n */\nexport interface BatchStats {\n /** Total batches submitted */\n totalBatches: number\n /** Total events submitted */\n totalEvents: number\n /** Average batch size */\n averageBatchSize: number\n /** Average batch latency (ms) */\n averageBatchLatency: number\n /** Last flush timestamp */\n lastFlushTime: number\n /** Pending events in queue */\n pendingEvents: number\n /** Auto-triggered flushes */\n autoFlushCount: number\n /** Manual flushes */\n manualFlushCount: number\n}\n\n/**\n * Aggregation window statistics.\n */\nexport interface WindowStats {\n /** Current window size (ms) */\n currentWindowMs: number\n /** Minimum window size (ms) */\n minWindowMs: number\n /** Maximum window size (ms) */\n maxWindowMs: number\n /** Last window adjustment reason */\n lastAdjustmentReason?: string\n /** Window adjustment count */\n adjustmentCount: number\n}\n\n/**\n * Complete aggregation statistics.\n */\nexport interface AggregationStats {\n deduplication: DeduplicationStats\n batching: BatchStats\n window: WindowStats\n timestamp: number\n}\n\n/**\n * Aggregation configuration options.\n */\nexport interface AggregationConfig {\n /** Enable aggregation (default: false) */\n enabled: boolean\n\n /** Window size in milliseconds (default: 200) */\n windowMs?: number\n\n /** Batch size threshold (default: 50) */\n batchSize?: number\n\n /** Deduplication strategy */\n deduplication?: 'pattern' | 'idempotencyKey' | 'off'\n\n /** Deduplication pattern (string or function) */\n pattern?: string | ((args: unknown) => string)\n\n /** Merge priority when deduplicating */\n mergePriority?: 'highest' | 'earliest' | 'latest'\n\n /** Enable background cleanup (default: true) */\n enableCleanup?: boolean\n\n /** Cleanup interval (ms, default: 5 minutes) */\n cleanupIntervalMs?: number\n\n /** TTL for deduplication entries (ms, default: 10 minutes) */\n ttlMs?: number\n}\n\n/**\n * Default aggregation configuration.\n */\nexport const DEFAULT_AGGREGATION_CONFIG: Required<AggregationConfig> = {\n enabled: false,\n windowMs: 200,\n batchSize: 50,\n deduplication: 'pattern',\n pattern: (args: unknown) => {\n if (!args || typeof args !== 'object') {\n return 'default'\n }\n const keys = Object.keys(args as Record<string, unknown>).sort()\n return keys.join(':')\n },\n mergePriority: 'highest',\n enableCleanup: true,\n cleanupIntervalMs: 5 * 60 * 1000, // 5 minutes\n ttlMs: 10 * 60 * 1000, // 10 minutes\n}\n\n/**\n * Priority order for merge decisions.\n */\nexport const PRIORITY_ORDER: Record<string, number> = {\n critical: 0,\n high: 1,\n normal: 2,\n low: 3,\n}\n\n/**\n * Backpressure-aware window configuration.\n */\nexport interface WindowAdjustmentConfig {\n /** Window for NORMAL backpressure state */\n normalMs: number\n /** Window for WARNING backpressure state */\n warningMs: number\n /** Window for CRITICAL backpressure state */\n criticalMs: number\n /** Window for OVERFLOW backpressure state */\n overflowMs: number\n}\n\n/**\n * Default window adjustment configuration based on backpressure.\n */\nexport const DEFAULT_WINDOW_ADJUSTMENT: WindowAdjustmentConfig = {\n normalMs: 200,\n warningMs: 150,\n criticalMs: 100,\n overflowMs: 50,\n}\n\n/**\n * Get suggested window size based on backpressure state.\n */\nexport function getSuggestedWindow(\n state: BackpressureState,\n config: WindowAdjustmentConfig = DEFAULT_WINDOW_ADJUSTMENT\n): number {\n switch (state) {\n case BackpressureState.NORMAL:\n return config.normalMs\n case BackpressureState.WARNING:\n return config.warningMs\n case BackpressureState.CRITICAL:\n return config.criticalMs\n case BackpressureState.OVERFLOW:\n return config.overflowMs\n default:\n return config.normalMs\n }\n}\n",
105
- "/**\n * Aggregation window with backpressure awareness (FS-102)\n *\n * Adjusts batching window based on backpressure state:\n * - NORMAL: 200ms (optimal aggregation)\n * - WARNING: 150ms (accelerate processing)\n * - CRITICAL: 100ms (fast drain)\n * - OVERFLOW: 50ms (minimum latency)\n *\n * FS-103 增強:\n * - 與 BackpressureManager 雙向反饋\n * - 窗口調整通知機制\n */\n\nimport type { BackpressureManager } from '../BackpressureManager'\nimport { BackpressureState } from '../BackpressureManager'\nimport type { WindowStats } from './types'\nimport { DEFAULT_WINDOW_ADJUSTMENT } from './types'\n\n/**\n * Aggregation window manager with backpressure awareness.\n */\nexport class AggregationWindow {\n // Current window size (ms)\n private currentWindowMs: number\n\n // Minimum and maximum bounds\n private readonly minWindowMs: number = 50\n private readonly maxWindowMs: number = 500\n\n // Adjustment statistics\n private stats = {\n adjustmentCount: 0,\n lastAdjustmentReason: '' as string | undefined,\n }\n\n // FS-103:BackpressureManager 引用用於反饋\n private backpressureManager?: BackpressureManager\n\n /**\n * Create an aggregation window.\n *\n * @param initialWindowMs - Initial window size (default 200ms)\n */\n constructor(initialWindowMs = 200) {\n this.currentWindowMs = Math.max(this.minWindowMs, Math.min(this.maxWindowMs, initialWindowMs))\n }\n\n /**\n * Set the BackpressureManager for feedback loop (FS-103).\n *\n * @param manager - BackpressureManager instance\n */\n setBackpressureManager(manager: BackpressureManager): void {\n this.backpressureManager = manager\n }\n\n /**\n * Adjust window based on backpressure state.\n *\n * @param state - Current backpressure state\n */\n adjustWindow(state: BackpressureState): number {\n const oldWindow = this.currentWindowMs\n let newWindow = this.currentWindowMs\n let reason = 'unknown'\n\n switch (state) {\n case BackpressureState.NORMAL:\n newWindow = DEFAULT_WINDOW_ADJUSTMENT.normalMs\n reason = 'normal_backpressure'\n break\n case BackpressureState.WARNING:\n newWindow = DEFAULT_WINDOW_ADJUSTMENT.warningMs\n reason = 'warning_backpressure'\n break\n case BackpressureState.CRITICAL:\n newWindow = DEFAULT_WINDOW_ADJUSTMENT.criticalMs\n reason = 'critical_backpressure'\n break\n case BackpressureState.OVERFLOW:\n newWindow = DEFAULT_WINDOW_ADJUSTMENT.overflowMs\n reason = 'overflow_backpressure'\n break\n default:\n reason = `unknown_state_${String(state)}`\n }\n\n // Ensure bounds\n newWindow = Math.max(this.minWindowMs, Math.min(this.maxWindowMs, newWindow))\n\n // Update if changed\n if (newWindow !== oldWindow) {\n this.currentWindowMs = newWindow\n this.stats.adjustmentCount++\n this.stats.lastAdjustmentReason = `${reason} (${oldWindow}ms → ${newWindow}ms)`\n\n // === FS-103:Notify BackpressureManager of window adjustment ===\n this.notifyBackpressureManager(oldWindow, newWindow)\n }\n\n return this.currentWindowMs\n }\n\n /**\n * Notify BackpressureManager of window adjustment (FS-103).\n * Part of the backpressure feedback loop for automatic state recovery.\n *\n * @param oldWindowMs - Previous window size\n * @param newWindowMs - New window size\n * @private\n */\n private notifyBackpressureManager(oldWindowMs: number, newWindowMs: number): void {\n if (!this.backpressureManager) {\n return\n }\n\n this.backpressureManager.notifyWindowAdjustment(oldWindowMs, newWindowMs)\n }\n\n /**\n * Get current window size.\n */\n getCurrentWindow(): number {\n return this.currentWindowMs\n }\n\n /**\n * Get minimum window size.\n */\n getMinWindow(): number {\n return this.minWindowMs\n }\n\n /**\n * Get maximum window size.\n */\n getMaxWindow(): number {\n return this.maxWindowMs\n }\n\n /**\n * Get statistics.\n */\n getStats(): WindowStats {\n return {\n currentWindowMs: this.currentWindowMs,\n minWindowMs: this.minWindowMs,\n maxWindowMs: this.maxWindowMs,\n lastAdjustmentReason: this.stats.lastAdjustmentReason,\n adjustmentCount: this.stats.adjustmentCount,\n }\n }\n\n /**\n * Reset statistics.\n */\n resetStats(): void {\n this.stats.adjustmentCount = 0\n this.stats.lastAdjustmentReason = undefined\n }\n\n /**\n * Reset window to initial size.\n */\n reset(windowMs?: number): void {\n this.currentWindowMs = Math.max(\n this.minWindowMs,\n Math.min(this.maxWindowMs, windowMs ?? DEFAULT_WINDOW_ADJUSTMENT.normalMs)\n )\n this.resetStats()\n }\n}\n",
106
- "/**\n * Event deduplication manager (FS-102)\n *\n * Merges events with the same pattern/idempotency key to reduce duplicates.\n * - Pattern-based deduplication\n * - Priority-aware merge strategy\n * - Wildcard pattern aggregation\n * - Deduplication rate tracking\n *\n * Ported from: examples/flash-sale-fullstack/src/cache/events/EventDeduplicator.ts\n */\n\nimport type { EventTask } from '../types'\nimport type { AggregationConfig, DeduplicationStats } from './types'\nimport { DEFAULT_AGGREGATION_CONFIG, PRIORITY_ORDER } from './types'\n\n/**\n * Event deduplication manager using pattern matching.\n */\nexport class DeduplicationManager {\n // Pattern -> EventTask mapping for deduplication\n private patternMap: Map<string, EventTask> = new Map()\n\n // Statistics\n private stats: DeduplicationStats = {\n totalEvents: 0,\n deduplicatedEvents: 0,\n removedCount: 0,\n patternsAggregated: 0,\n deduplicationRate: 0,\n }\n\n // Pattern regex cache\n private regexCache = new Map<string, RegExp>()\n\n // Cached deduplicated result\n private cachedDeduplicated: EventTask[] | null = null\n private deduplicatedDirty = true\n\n // Configuration\n private config: Required<AggregationConfig>\n\n // TTL tracking for cleanup\n private patternTimestamps: Map<string, number> = new Map()\n\n // Cleanup timer\n private cleanupTimer: NodeJS.Timeout | null = null\n\n /**\n * Create a deduplication manager.\n */\n constructor(config?: Partial<AggregationConfig>) {\n this.config = {\n ...DEFAULT_AGGREGATION_CONFIG,\n ...config,\n }\n\n if (this.config.enableCleanup) {\n this.startCleanup()\n }\n }\n\n /**\n * Add an event for deduplication.\n *\n * Rules:\n * 1. Events with same pattern are merged into one\n * 2. Higher priority events are kept, lower priority removed\n * 3. If new event has higher priority, it replaces old event\n */\n addEvent(event: EventTask): void {\n this.stats.totalEvents++\n this.deduplicatedDirty = true\n\n // Generate deduplication pattern\n const pattern = this.generatePattern(event)\n\n const existing = this.patternMap.get(pattern)\n\n if (!existing) {\n // New pattern, add directly\n this.patternMap.set(pattern, event)\n this.patternTimestamps.set(pattern, Date.now())\n } else {\n // Pattern exists, compare priorities\n const existingPriority = PRIORITY_ORDER[existing.options.priority ?? 'normal'] ?? 2\n const newPriority = PRIORITY_ORDER[event.options.priority ?? 'normal'] ?? 2\n\n if (newPriority < existingPriority) {\n // New event has higher priority, replace\n this.patternMap.set(pattern, event)\n this.patternTimestamps.set(pattern, Date.now())\n this.stats.removedCount++\n } else if (newPriority === existingPriority) {\n // Same priority, keep the earliest\n if (event.createdAt < existing.createdAt) {\n this.patternMap.set(pattern, event)\n this.patternTimestamps.set(pattern, Date.now())\n }\n this.stats.removedCount++\n } else {\n // Existing event has higher priority, discard new event\n this.stats.removedCount++\n }\n }\n\n // Update statistics\n this.stats.deduplicatedEvents = this.patternMap.size\n this.stats.patternsAggregated = this.patternMap.size\n this.updateDeduplicationRate()\n }\n\n /**\n * Add multiple events.\n */\n addEvents(events: EventTask[]): void {\n for (const event of events) {\n this.addEvent(event)\n }\n }\n\n /**\n * Get all deduplicated events.\n * Result is cached until next addEvent() call.\n */\n getDeduplicated(): EventTask[] {\n // Return cached result if valid\n if (!this.deduplicatedDirty && this.cachedDeduplicated !== null) {\n return this.cachedDeduplicated\n }\n\n // Build deduplication result\n const eventMap = new Map<string, EventTask>()\n\n for (const event of this.patternMap.values()) {\n const existing = eventMap.get(event.id)\n\n if (!existing) {\n // First occurrence of this event ID\n eventMap.set(event.id, { ...event })\n }\n }\n\n // Cache result\n this.cachedDeduplicated = Array.from(eventMap.values())\n this.deduplicatedDirty = false\n\n return this.cachedDeduplicated\n }\n\n /**\n * Optimize patterns by merging overlapping patterns.\n *\n * Example: ['product:1', 'product:2', 'product:3'] -> ['product:*']\n */\n optimizePatterns(patterns: string[]): string[] {\n if (patterns.length < 3) {\n return patterns\n }\n\n const optimized: string[] = []\n const byPrefix = new Map<string, string[]>()\n\n // Group by prefix\n for (const pattern of patterns) {\n const parts = pattern.split(':')\n const prefix = parts[0]\n\n if (!byPrefix.has(prefix)) {\n byPrefix.set(prefix, [])\n }\n byPrefix.get(prefix)?.push(pattern)\n }\n\n // If a prefix has >50% of patterns, use wildcard\n const threshold = Math.ceil(patterns.length * 0.5)\n\n for (const [prefix, patternList] of byPrefix.entries()) {\n if (patternList.length >= threshold) {\n // Use wildcard\n optimized.push(`${prefix}:*`)\n } else {\n // Keep original patterns\n optimized.push(...patternList)\n }\n }\n\n return optimized\n }\n\n /**\n * Clear the deduplication manager.\n */\n clear(): void {\n this.patternMap.clear()\n this.patternTimestamps.clear()\n this.cachedDeduplicated = null\n this.deduplicatedDirty = true\n this.regexCache.clear()\n this.stats.totalEvents = 0\n this.stats.deduplicatedEvents = 0\n this.stats.removedCount = 0\n this.stats.patternsAggregated = 0\n this.stats.deduplicationRate = 0\n }\n\n /**\n * Get statistics.\n */\n getStats(): DeduplicationStats {\n return { ...this.stats }\n }\n\n /**\n * Reset statistics (but keep deduplication data).\n */\n resetStats(): void {\n this.stats.totalEvents = 0\n this.stats.removedCount = 0\n this.stats.deduplicationRate = 0\n this.updateDeduplicationRate()\n }\n\n /**\n * Get deduplication rate percentage.\n */\n getDeduplicationRate(): number {\n return this.stats.deduplicationRate\n }\n\n /**\n * Get pattern count.\n */\n getPatternCount(): number {\n return this.patternMap.size\n }\n\n /**\n * Get event for specific pattern.\n */\n getEventForPattern(pattern: string): EventTask | undefined {\n return this.patternMap.get(pattern)\n }\n\n /**\n * Check if pattern exists.\n */\n hasPattern(pattern: string): boolean {\n return this.patternMap.has(pattern)\n }\n\n /**\n * Remove specific pattern.\n */\n removePattern(pattern: string): boolean {\n const removed = this.patternMap.delete(pattern)\n if (removed) {\n this.patternTimestamps.delete(pattern)\n this.deduplicatedDirty = true\n }\n return removed\n }\n\n /**\n * Remove patterns by prefix.\n */\n removePatternByPrefix(prefix: string): number {\n let removed = 0\n const toDelete: string[] = []\n\n for (const pattern of this.patternMap.keys()) {\n if (pattern.startsWith(prefix)) {\n toDelete.push(pattern)\n }\n }\n\n for (const pattern of toDelete) {\n this.patternMap.delete(pattern)\n this.patternTimestamps.delete(pattern)\n removed++\n }\n\n if (removed > 0) {\n this.deduplicatedDirty = true\n }\n\n return removed\n }\n\n /**\n * Get all patterns.\n */\n getPatterns(): string[] {\n return Array.from(this.patternMap.keys())\n }\n\n /**\n * Find events matching invalidation pattern.\n * Supports wildcard patterns.\n */\n findEventsByPattern(invalidationPattern: string): EventTask[] {\n const result: Set<EventTask> = new Set()\n\n // Exact match\n const exact = this.patternMap.get(invalidationPattern)\n if (exact) {\n result.add(exact)\n }\n\n // Wildcard match\n if (invalidationPattern.includes('*')) {\n const regex = this.getPatternRegex(invalidationPattern)\n for (const [pattern, event] of this.patternMap.entries()) {\n if (regex.test(pattern)) {\n result.add(event)\n }\n }\n }\n\n return Array.from(result)\n }\n\n /**\n * Shutdown the manager (cleanup resources).\n */\n shutdown(): void {\n this.stopCleanup()\n this.clear()\n }\n\n /**\n * Generate deduplication pattern from event.\n */\n private generatePattern(event: EventTask): string {\n if (this.config.deduplication === 'idempotencyKey' && event.options.idempotencyKey) {\n return `idempotency:${event.options.idempotencyKey}`\n }\n\n if (typeof this.config.pattern === 'function') {\n try {\n return this.config.pattern(event.args) ?? 'default'\n } catch (_e) {\n return `${event.hook}:default`\n }\n }\n\n if (typeof this.config.pattern === 'string') {\n // Use hook and pattern as base\n return `${event.hook}:${this.config.pattern}`\n }\n\n // Default: use hook as pattern\n return event.hook\n }\n\n /**\n * Get pattern regex (cached).\n */\n private getPatternRegex(pattern: string): RegExp {\n if (!this.regexCache.has(pattern)) {\n this.regexCache.set(pattern, this.patternToRegex(pattern))\n }\n return this.regexCache.get(pattern)!\n }\n\n /**\n * Convert pattern to regex.\n */\n private patternToRegex(pattern: string): RegExp {\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '.*')\n return new RegExp(`^${escaped}$`)\n }\n\n /**\n * Update deduplication rate.\n */\n private updateDeduplicationRate(): void {\n if (this.stats.totalEvents === 0) {\n this.stats.deduplicationRate = 0\n } else {\n this.stats.deduplicationRate = Math.round(\n (this.stats.removedCount / this.stats.totalEvents) * 100\n )\n }\n }\n\n /**\n * Start automatic cleanup timer.\n */\n private startCleanup(): void {\n this.cleanupTimer = setInterval(() => this.performCleanup(), this.config.cleanupIntervalMs)\n }\n\n /**\n * Stop cleanup timer.\n */\n private stopCleanup(): void {\n if (this.cleanupTimer !== null) {\n clearInterval(this.cleanupTimer)\n this.cleanupTimer = null\n }\n }\n\n /**\n * Perform TTL-based cleanup.\n */\n private performCleanup(): void {\n const now = Date.now()\n const ttl = this.config.ttlMs\n\n const toDelete: string[] = []\n for (const [pattern, timestamp] of this.patternTimestamps.entries()) {\n if (now - timestamp > ttl) {\n toDelete.push(pattern)\n }\n }\n\n for (const pattern of toDelete) {\n this.patternMap.delete(pattern)\n this.patternTimestamps.delete(pattern)\n }\n\n if (toDelete.length > 0) {\n this.deduplicatedDirty = true\n this.stats.deduplicatedEvents = this.patternMap.size\n }\n }\n\n /**\n * Internal method for testing.\n */\n __getPatternMap(): Map<string, EventTask> {\n return new Map(this.patternMap)\n }\n}\n",
107
- "/**\n * Event batcher for microbatching optimization (FS-102)\n *\n * Implements dual-trigger batching:\n * - Time window trigger (default 50ms)\n * - Batch size trigger (default 50 events)\n *\n * Expected improvements: 10-15% throughput increase\n *\n * Ported from: examples/flash-sale-fullstack/src/cache/events/BatchSubmitter.ts\n */\n\nimport type { EventTask } from '../types'\nimport type { BatchStats } from './types'\n\n/**\n * Event batcher for optimizing submission throughput.\n */\nexport class EventBatcher {\n // Event submission queue\n private queue: EventTask[] = []\n\n // Batch size threshold\n private readonly batchSize: number\n\n // Flush interval (ms)\n private readonly flushIntervalMs: number\n\n // Flush timer\n private flushTimer: NodeJS.Timeout | null = null\n\n // Statistics\n private stats = {\n totalBatches: 0,\n totalEvents: 0,\n totalLatency: 0,\n autoFlushCount: 0,\n manualFlushCount: 0,\n lastFlushTime: Date.now(),\n }\n\n // Submission function\n private submitFn: (tasks: EventTask[]) => Promise<void>\n\n /**\n * Create an event batcher.\n *\n * @param batchSize - Batch size threshold (default 50)\n * @param flushIntervalMs - Time window (ms, default 50)\n * @param submitFn - Function to submit batches\n */\n constructor(\n batchSize = 50,\n flushIntervalMs = 50,\n submitFn: (tasks: EventTask[]) => Promise<void>\n ) {\n this.batchSize = batchSize\n this.flushIntervalMs = flushIntervalMs\n this.submitFn = submitFn\n }\n\n /**\n * Enqueue an event.\n *\n * Automatically triggers flush if:\n * 1. Batch size is reached\n * 2. Time window expires\n */\n async enqueue(task: EventTask): Promise<void> {\n this.queue.push(task)\n\n // Trigger 1: Batch size reached\n if (this.queue.length >= this.batchSize) {\n await this.flush(true) // Mark as auto-triggered\n } else if (this.flushTimer === null && this.queue.length > 0) {\n // Trigger 2: Start time-window timer\n this.startTimer()\n }\n }\n\n /**\n * Enqueue multiple events.\n */\n async enqueueBatch(tasks: EventTask[]): Promise<void> {\n for (const task of tasks) {\n await this.enqueue(task)\n }\n }\n\n /**\n * Flush queued events.\n *\n * @param auto - Whether this is an auto-triggered flush\n * @returns Array of flushed events\n */\n async flush(auto = false): Promise<EventTask[]> {\n if (this.queue.length === 0) {\n return []\n }\n\n // Clear timer\n this.clearTimer()\n\n // Extract all events\n const tasks = this.queue.splice(0, this.queue.length)\n\n // Record statistics\n const latency = Date.now() - this.stats.lastFlushTime\n this.stats.totalBatches++\n this.stats.totalEvents += tasks.length\n this.stats.totalLatency += latency\n this.stats.lastFlushTime = Date.now()\n\n if (auto) {\n this.stats.autoFlushCount++\n } else {\n this.stats.manualFlushCount++\n }\n\n // Submit events\n try {\n await this.submitFn(tasks)\n } catch (error) {\n // Put events back if submission fails\n this.queue.unshift(...tasks)\n throw error\n }\n\n return tasks\n }\n\n /**\n * Get statistics.\n */\n getStats(): BatchStats {\n const avgBatchSize =\n this.stats.totalBatches > 0 ? this.stats.totalEvents / this.stats.totalBatches : 0\n const avgLatency =\n this.stats.totalBatches > 0 ? this.stats.totalLatency / this.stats.totalBatches : 0\n\n return {\n totalBatches: this.stats.totalBatches,\n totalEvents: this.stats.totalEvents,\n averageBatchSize: Math.round(avgBatchSize * 100) / 100,\n averageBatchLatency: Math.round(avgLatency * 100) / 100,\n lastFlushTime: this.stats.lastFlushTime,\n pendingEvents: this.queue.length,\n autoFlushCount: this.stats.autoFlushCount,\n manualFlushCount: this.stats.manualFlushCount,\n }\n }\n\n /**\n * Get pending event count.\n */\n getPendingCount(): number {\n return this.queue.length\n }\n\n /**\n * Check if there are pending events.\n */\n hasPending(): boolean {\n return this.queue.length > 0\n }\n\n /**\n * Clear the queue.\n */\n clear(): void {\n this.queue = []\n this.clearTimer()\n }\n\n /**\n * Reset statistics.\n */\n resetStats(): void {\n this.stats = {\n totalBatches: 0,\n totalEvents: 0,\n totalLatency: 0,\n autoFlushCount: 0,\n manualFlushCount: 0,\n lastFlushTime: Date.now(),\n }\n }\n\n /**\n * Stop the batcher and flush remaining events.\n */\n async stop(): Promise<EventTask[]> {\n this.clearTimer()\n if (this.queue.length > 0) {\n return this.flush(false)\n }\n return []\n }\n\n /**\n * Start time-window timer.\n */\n private startTimer(): void {\n if (this.flushTimer !== null) {\n return\n }\n\n this.flushTimer = setTimeout(() => {\n this.flushTimer = null\n if (this.queue.length > 0) {\n // Async flush, non-blocking\n this.flush(true).catch((error) => {\n console.error('[EventBatcher] Flush error:', error)\n })\n }\n }, this.flushIntervalMs)\n }\n\n /**\n * Clear timer.\n */\n private clearTimer(): void {\n if (this.flushTimer !== null) {\n clearTimeout(this.flushTimer)\n this.flushTimer = null\n }\n }\n\n /**\n * Adjust batch size.\n */\n setBatchSize(newSize: number): void {\n // Check if immediate flush is needed\n if (this.queue.length >= newSize && newSize < this.batchSize) {\n this.flush(true).catch((error) => {\n console.error('[EventBatcher] Flush error:', error)\n })\n }\n }\n\n /**\n * Adjust flush interval.\n */\n setFlushInterval(_newIntervalMs: number): void {\n // Restart timer with new interval\n this.clearTimer()\n if (this.queue.length > 0) {\n this.startTimer()\n }\n }\n\n /**\n * Get batch size.\n */\n getBatchSize(): number {\n return this.batchSize\n }\n\n /**\n * Get flush interval.\n */\n getFlushInterval(): number {\n return this.flushIntervalMs\n }\n}\n",
108
- "/**\n * Event aggregation manager (FS-102)\n *\n * Coordinates deduplication and batching for optimal event processing:\n * - Event deduplication (pattern-based or idempotency-key based)\n * - Micro-batching (time and size dual-trigger)\n * - Backpressure-aware window adjustment\n * - Complete statistics tracking\n *\n * Ported from: examples/flash-sale-fullstack/src/cache/events/EventAggregator.ts\n */\n\nimport type { BackpressureManager } from '../BackpressureManager'\nimport { BackpressureState } from '../BackpressureManager'\nimport type { EventTask } from '../types'\nimport { AggregationWindow } from './AggregationWindow'\nimport { DeduplicationManager } from './DeduplicationManager'\nimport { EventBatcher } from './EventBatcher'\nimport type { AggregationConfig, AggregationStats } from './types'\nimport { DEFAULT_AGGREGATION_CONFIG, DEFAULT_WINDOW_ADJUSTMENT, getSuggestedWindow } from './types'\n\n/**\n * Event aggregation manager.\n */\nexport class EventAggregationManager {\n // Core components\n private deduplicator: DeduplicationManager\n private batcher: EventBatcher\n private window: AggregationWindow\n\n // Configuration\n private config: Required<AggregationConfig>\n\n // Backpressure manager reference (optional)\n private backpressureManager?: BackpressureManager\n\n // Submission function to queue\n private submitToQueueFn?: (tasks: EventTask[]) => Promise<void>\n\n // Disabled flag\n private disabled = false\n\n /**\n * Create an event aggregation manager.\n */\n constructor(config?: Partial<AggregationConfig>) {\n this.config = {\n ...DEFAULT_AGGREGATION_CONFIG,\n ...config,\n }\n\n // Initialize components\n this.deduplicator = new DeduplicationManager(this.config)\n\n // Initialize batcher with default submit function (override later)\n this.batcher = new EventBatcher(\n this.config.batchSize ?? 50,\n this.config.windowMs ?? 200,\n (tasks) => this.submitToQueue(tasks)\n )\n\n this.window = new AggregationWindow(this.config.windowMs ?? 200)\n }\n\n /**\n * Set backpressure manager for window adjustment.\n * FS-103:Also sets BackpressureManager on AggregationWindow for feedback loop.\n */\n setBackpressureManager(backpressure: BackpressureManager): void {\n this.backpressureManager = backpressure\n // === FS-103:Enable bidirectional feedback between AggregationWindow and BackpressureManager ===\n this.window.setBackpressureManager(backpressure)\n }\n\n /**\n * Set the actual queue submission function.\n */\n setSubmitToQueueFn(fn: (tasks: EventTask[]) => Promise<void>): void {\n this.submitToQueueFn = fn\n }\n\n /**\n * Submit an event for aggregation.\n *\n * Returns true if accepted, false if rejected due to backpressure.\n */\n async submit(task: EventTask): Promise<boolean> {\n if (this.disabled) {\n throw new Error('[EventAggregationManager] Manager is disabled')\n }\n\n // Check backpressure state\n if (this.backpressureManager) {\n const state = this.backpressureManager.getState()\n\n // Adjust window based on backpressure\n const suggestedWindow = getSuggestedWindow(state, DEFAULT_WINDOW_ADJUSTMENT)\n if (suggestedWindow !== this.window.getCurrentWindow()) {\n this.window.adjustWindow(state)\n this.batcher.setFlushInterval(this.window.getCurrentWindow())\n }\n\n // Reject if overflow\n if (state === BackpressureState.OVERFLOW) {\n return false\n }\n }\n\n // Add to deduplicator\n this.deduplicator.addEvent(task)\n\n // Get deduplicated events\n const deduplicated = this.deduplicator.getDeduplicated()\n\n // Submit to batcher\n for (const event of deduplicated) {\n await this.batcher.enqueue(event)\n }\n\n return true\n }\n\n /**\n * Submit multiple events.\n */\n async submitBatch(tasks: EventTask[]): Promise<number> {\n let accepted = 0\n\n for (const task of tasks) {\n const result = await this.submit(task)\n if (result) {\n accepted++\n }\n }\n\n return accepted\n }\n\n /**\n * Flush current batch to queue.\n */\n async flush(): Promise<EventTask[]> {\n return this.batcher.flush(false)\n }\n\n /**\n * Get aggregation statistics.\n */\n getStats(): AggregationStats {\n return {\n deduplication: this.deduplicator.getStats(),\n batching: this.batcher.getStats(),\n window: this.window.getStats(),\n timestamp: Date.now(),\n }\n }\n\n /**\n * Reset statistics.\n */\n resetStats(): void {\n this.deduplicator.resetStats()\n this.batcher.resetStats()\n }\n\n /**\n * Clear aggregation state.\n */\n clear(): void {\n this.deduplicator.clear()\n this.batcher.clear()\n }\n\n /**\n * Check if there are pending events.\n */\n hasPending(): boolean {\n return this.batcher.hasPending()\n }\n\n /**\n * Get pending event count.\n */\n getPendingCount(): number {\n return this.batcher.getPendingCount()\n }\n\n /**\n * Disable the aggregation manager.\n */\n disable(): void {\n this.disabled = true\n }\n\n /**\n * Enable the aggregation manager.\n */\n enable(): void {\n this.disabled = false\n }\n\n /**\n * Check if aggregation manager is enabled.\n */\n isEnabled(): boolean {\n return !this.disabled\n }\n\n /**\n * Shutdown the aggregation manager.\n */\n async shutdown(): Promise<EventTask[]> {\n const pending = await this.batcher.stop()\n this.deduplicator.shutdown()\n return pending\n }\n\n /**\n * Submit deduplicated events to queue.\n */\n private async submitToQueue(tasks: EventTask[]): Promise<void> {\n if (!this.submitToQueueFn) {\n throw new Error('[EventAggregationManager] Queue submission function not configured')\n }\n\n await this.submitToQueueFn(tasks)\n }\n\n /**\n * Get deduplication manager (for testing).\n */\n __getDeduplicator(): DeduplicationManager {\n return this.deduplicator\n }\n\n /**\n * Get event batcher (for testing).\n */\n __getBatcher(): EventBatcher {\n return this.batcher\n }\n\n /**\n * Get aggregation window (for testing).\n */\n __getWindow(): AggregationWindow {\n return this.window\n }\n}\n",
109
- "/**\n * Event dispatch options for async event handling.\n * @public\n */\nexport interface EventOptions {\n /**\n * Whether to dispatch the event asynchronously.\n * @default false\n */\n async?: boolean\n\n /**\n * Priority level for event processing.\n * - 'critical': Immediate processing, bypass queue (< 1ms)\n * - 'high': High priority events (< 50ms)\n * - 'normal': Standard events (< 200ms)\n * - 'low': Non-critical events (< 500ms)\n * @default 'normal'\n */\n priority?: 'critical' | 'high' | 'normal' | 'low'\n\n /**\n * Automatic priority escalation configuration.\n * Events can be automatically upgraded to higher priority based on wait time.\n */\n escalation?: {\n /**\n * Whether to enable automatic priority escalation.\n * @default true\n */\n enabled?: boolean\n\n /**\n * Escalation thresholds in milliseconds.\n * Events exceeding these wait times are promoted.\n */\n thresholds?: {\n /**\n * Wait time before LOW events are promoted to NORMAL.\n * @default 200\n */\n lowToNormal?: number\n /**\n * Wait time before NORMAL events are promoted to HIGH.\n * @default 100\n */\n normalToHigh?: number\n /**\n * Wait time before HIGH events are promoted to CRITICAL.\n * @default 50\n */\n highToCritical?: number\n }\n\n /**\n * Maximum wait time before forcing CRITICAL priority.\n * @default 500\n */\n maxWaitTimeMs?: number\n }\n\n /**\n * Execution timeout in milliseconds.\n * If a listener exceeds this timeout, it will be terminated.\n * @default 5000\n */\n timeout?: number\n\n /**\n * Ordering guarantee strategy.\n * - 'strict': Global strict ordering (slow, serialized)\n * - 'partition': Partition-based ordering (recommended, balanced)\n * - 'none': No ordering guarantee (fastest, parallel)\n * @default 'none'\n */\n ordering?: 'strict' | 'partition' | 'none'\n\n /**\n * Partition key for partition-based ordering.\n * Events with the same partition key are processed in order.\n * Only used when ordering is 'partition'.\n * @example 'order:123' or 'user:456'\n */\n partitionKey?: string\n\n /**\n * Idempotency key for deduplication.\n * Events with the same idempotency key within the TTL window\n * will be processed only once.\n * @example 'order:123:created'\n */\n idempotencyKey?: string\n\n /**\n * Time-to-live for idempotency key in milliseconds.\n * @default 3600000 (1 hour)\n */\n ttl?: number\n\n /**\n * Retry policy for failed event processing.\n */\n retry?: {\n /**\n * Maximum number of retry attempts.\n * @default 0\n */\n maxRetries?: number\n\n /**\n * Backoff strategy for retries.\n * - 'exponential': Delay doubles with each retry (1s, 2s, 4s, 8s...)\n * - 'linear': Fixed delay between retries\n * @default 'exponential'\n */\n backoff?: 'exponential' | 'linear'\n\n /**\n * Initial delay in milliseconds before first retry.\n * @default 1000\n */\n initialDelayMs?: number\n\n /**\n * Maximum delay in milliseconds between retries.\n * @default 30000\n */\n maxDelayMs?: number\n\n /**\n * Whether to send failed events to Dead Letter Queue after max retries.\n * @default false\n */\n dlqAfterMaxRetries?: boolean\n }\n\n /**\n * Circuit breaker options for this event.\n */\n circuitBreaker?: {\n /**\n * Number of consecutive failures before opening the circuit.\n * @default 5\n */\n failureThreshold?: number\n\n /**\n * Time in milliseconds to wait before attempting to close the circuit.\n * @default 30000\n */\n resetTimeout?: number\n\n /**\n * Number of test requests to allow in half-open state.\n * @default 3\n */\n halfOpenRequests?: number\n }\n\n /**\n * Event aggregation configuration (FS-102).\n * Enables deduplication and micro-batching for improved throughput.\n * @default undefined (disabled)\n */\n aggregation?: {\n /**\n * Enable event aggregation.\n * @default false\n */\n enabled?: boolean\n\n /**\n * Aggregation window size in milliseconds.\n * Backpressure-aware adjustment: 50-500ms\n * @default 200\n */\n windowMs?: number\n\n /**\n * Batch size threshold for auto-flush.\n * @default 50\n */\n batchSize?: number\n\n /**\n * Deduplication strategy.\n * @default 'pattern'\n */\n deduplication?: 'pattern' | 'idempotencyKey' | 'off'\n\n /**\n * Deduplication pattern (string or function).\n * String: hook-based pattern\n * Function: custom pattern from event args\n */\n pattern?: string | ((args: unknown) => string)\n\n /**\n * Priority merge strategy.\n * - 'highest': keep highest priority event\n * - 'earliest': keep earliest event\n * - 'latest': keep latest event\n * @default 'highest'\n */\n mergePriority?: 'highest' | 'earliest' | 'latest'\n\n /**\n * Enable automatic cleanup of expired entries.\n * @default true\n */\n enableCleanup?: boolean\n\n /**\n * Cleanup interval in milliseconds.\n * @default 300000 (5 minutes)\n */\n cleanupIntervalMs?: number\n\n /**\n * TTL for entries in milliseconds.\n * @default 600000 (10 minutes)\n */\n ttlMs?: number\n }\n}\n\n/**\n * Default event options.\n * @internal\n */\nexport const DEFAULT_EVENT_OPTIONS: Required<EventOptions> = {\n async: false,\n priority: 'normal',\n timeout: 5000,\n ordering: 'none',\n partitionKey: '',\n idempotencyKey: '',\n ttl: 3600000, // 1 hour\n escalation: {\n enabled: true,\n thresholds: {\n lowToNormal: 200,\n normalToHigh: 100,\n highToCritical: 50,\n },\n maxWaitTimeMs: 500,\n },\n retry: {\n maxRetries: 0,\n backoff: 'exponential',\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n dlqAfterMaxRetries: false,\n },\n circuitBreaker: {\n failureThreshold: 5,\n resetTimeout: 30000,\n halfOpenRequests: 3,\n },\n aggregation: {\n enabled: false,\n windowMs: 200,\n batchSize: 50,\n deduplication: 'pattern',\n pattern: undefined,\n mergePriority: 'highest',\n enableCleanup: true,\n cleanupIntervalMs: 300000,\n ttlMs: 600000,\n },\n}\n",
110
- "/**\n * Idempotency cache for deduplicating events.\n * Prevents duplicate events from being processed within a configurable TTL window.\n * @internal\n */\nexport class IdempotencyCache {\n private cache: Map<string, { timestamp: number }> = new Map()\n private cleanupInterval: NodeJS.Timer | null = null\n private readonly defaultCleanupIntervalMs = 60000 // 1 minute\n\n constructor() {\n // Start periodic cleanup\n this.startCleanup()\n }\n\n /**\n * Check if an event with the given idempotency key is a duplicate.\n * @param key - Idempotency key\n * @param ttlMs - Time-to-live in milliseconds\n * @returns True if this is a duplicate, false if it's a new event\n */\n isDuplicate(key: string, ttlMs: number): boolean {\n if (!key) {\n return false\n }\n\n const entry = this.cache.get(key)\n\n if (!entry) {\n // New key, record it and return false (not a duplicate)\n this.recordEvent(key)\n return false\n }\n\n // Check if the previous entry is still within TTL\n const elapsed = Date.now() - entry.timestamp\n if (elapsed < ttlMs) {\n // Within TTL, this is a duplicate\n return true\n }\n\n // TTL expired, treat as new event\n this.recordEvent(key)\n return false\n }\n\n /**\n * Record an event in the cache.\n * @param key - Idempotency key\n */\n recordEvent(key: string): void {\n if (!key) {\n return\n }\n this.cache.set(key, { timestamp: Date.now() })\n }\n\n /**\n * Remove an entry from the cache.\n * @param key - Idempotency key\n * @returns True if entry was removed, false if not found\n */\n remove(key: string): boolean {\n if (!key) {\n return false\n }\n return this.cache.delete(key)\n }\n\n /**\n * Clear all entries from the cache.\n */\n clear(): void {\n this.cache.clear()\n }\n\n /**\n * Get the current cache size.\n * @returns Number of entries in cache\n */\n getSize(): number {\n return this.cache.size\n }\n\n /**\n * Start periodic cleanup of expired entries.\n * @internal\n */\n private startCleanup(): void {\n if (this.cleanupInterval) {\n return // Already running\n }\n\n this.cleanupInterval = setInterval(() => {\n this.cleanup()\n }, this.defaultCleanupIntervalMs)\n\n // Prevent Node.js from exiting due to this interval\n if (this.cleanupInterval.unref) {\n this.cleanupInterval.unref()\n }\n }\n\n /**\n * Stop the periodic cleanup.\n * @internal\n */\n stopCleanup(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval)\n this.cleanupInterval = null\n }\n }\n\n /**\n * Clean up expired entries from the cache.\n * This is called periodically and doesn't use strict TTL checking,\n * so entries older than a reasonable default (24 hours) are removed.\n * @internal\n */\n private cleanup(): void {\n const maxAge = 24 * 60 * 60 * 1000 // 24 hours\n const now = Date.now()\n\n for (const [key, entry] of this.cache.entries()) {\n if (now - entry.timestamp > maxAge) {\n this.cache.delete(key)\n }\n }\n }\n\n /**\n * Destructor to clean up resources.\n * @internal\n */\n destroy(): void {\n this.stopCleanup()\n this.clear()\n }\n}\n",
111
- "import { EventAggregationManager } from '../events/aggregation/EventAggregationManager'\nimport { CircuitBreaker } from '../events/CircuitBreaker'\nimport type { EventBackend } from '../events/EventBackend'\nimport type { EventOptions } from '../events/EventOptions'\nimport { DEFAULT_EVENT_OPTIONS } from '../events/EventOptions'\nimport { EventPriorityQueue } from '../events/EventPriorityQueue'\nimport { IdempotencyCache } from '../events/IdempotencyCache'\nimport type { EventTask } from '../events/types'\nimport type { AsyncDetector } from './AsyncDetector'\nimport type { MigrationWarner } from './MigrationWarner'\nimport type { ActionCallback, HookManagerConfig, ListenerInfo, ListenerOptions } from './types'\n\n/**\n * 管理 action hook 的登記與執行。\n *\n * Action hook 用於觸發副作用(例如發送 email、記錄日誌)。\n * 支援同步和非同步執行模式,以及透過 EventPriorityQueue 的優先級佇列處理。\n *\n * @internal\n */\nexport class ActionManager {\n /**\n * 儲存所有已登記的 action callbacks。\n */\n private actions: Map<string, ActionCallback[]> = new Map()\n\n private backend: EventBackend\n private idempotencyCache: IdempotencyCache\n private config: HookManagerConfig\n private asyncDetector: AsyncDetector\n private migrationWarner: MigrationWarner\n private aggregationManager?: EventAggregationManager\n\n constructor(\n backend: EventBackend,\n config: HookManagerConfig,\n asyncDetector: AsyncDetector,\n migrationWarner: MigrationWarner\n ) {\n this.backend = backend\n this.config = config\n this.asyncDetector = asyncDetector\n this.migrationWarner = migrationWarner\n this.idempotencyCache = new IdempotencyCache()\n\n // 初始化事件聚合管理器(FS-102)\n if (config.aggregation?.enabled) {\n this.aggregationManager = new EventAggregationManager(config.aggregation)\n this.aggregationManager.setSubmitToQueueFn((tasks) => {\n for (const task of tasks) {\n this.backend.enqueue(task)\n }\n return Promise.resolve()\n })\n // 連接 backpressure manager 以調整窗口\n if (this.backend instanceof EventPriorityQueue) {\n const backpressure = this.backend.getBackpressureManager()\n if (backpressure) {\n this.aggregationManager.setBackpressureManager(backpressure)\n }\n }\n }\n }\n\n /**\n * 更新設定。\n */\n updateConfig(config: HookManagerConfig): void {\n this.config = config\n }\n\n /**\n * 更新 backend。\n */\n setBackend(backend: EventBackend): void {\n this.backend = backend\n }\n\n /**\n * Register an action hook.\n *\n * Actions are used to trigger side effects (e.g., logging, sending emails)\n * at specific points in the application lifecycle.\n *\n * @template TArgs - The type of arguments passed to the action.\n * @param hook - The unique name of the hook.\n * @param callback - The callback function to execute.\n * @param options - Optional listener options (type override, circuit breaker).\n *\n * @example\n * ```typescript\n * actionManager.addAction('user_registered', async (user: User) => {\n * await sendWelcomeEmail(user)\n * })\n * ```\n */\n addAction<TArgs = unknown>(\n hook: string,\n callback: ActionCallback<TArgs>,\n options?: ListenerOptions\n ): void {\n if (!this.actions.has(hook)) {\n this.actions.set(hook, [])\n }\n\n let finalCallback = callback\n\n if (options?.circuitBreaker) {\n const breaker = new CircuitBreaker(options.circuitBreaker)\n\n finalCallback = async (args: TArgs) => {\n return breaker.execute(async () => {\n const result = callback(args)\n if (result instanceof Promise) {\n await result\n }\n })\n }\n }\n\n // 如有 type override,儲存至 AsyncDetector\n if (options?.type && options.type !== 'auto') {\n this.asyncDetector.setTypeOverride(finalCallback as unknown as ActionCallback, options.type)\n }\n\n // Generic type erasure for storage\n this.actions.get(hook)?.push(finalCallback as unknown as ActionCallback)\n }\n\n /**\n * 判斷是否需要使用非同步 dispatch,並在需要時發出遷移警告。\n *\n * 此方法僅判斷 dispatch 模式和發出警告,不執行實際的 dispatch。\n * 實際執行由 HookManager.doAction 負責,以確保 ObservableHookManager 等子類別\n * 的多型覆寫(override)能正確攔截 doActionSync / doActionAsync 呼叫。\n *\n * @param hook - Hook name\n * @param args - Event args (unused here, kept for API consistency)\n * @param options - Event options\n * @returns 'async' if async dispatch should be used, 'sync' otherwise\n */\n resolveDispatchMode<TArgs = unknown>(\n hook: string,\n _args: TArgs,\n options?: EventOptions\n ): 'async' | 'sync' {\n const callbacks = this.actions.get(hook) || []\n const shouldUseAsync = this.shouldUseAsyncDispatch(callbacks, options)\n\n if (!shouldUseAsync) {\n // 同步 dispatch(legacy mode)—發出遷移警告\n if (this.config.showDeprecationWarnings || this.config.migrationMode === 'hybrid') {\n if (this.config.migrationMode === 'hybrid' || this.config.showDeprecationWarnings) {\n this.migrationWarner.warn(\n hook,\n 'Consider migrating to async mode for better performance and reliability.'\n )\n }\n }\n }\n\n return shouldUseAsync ? 'async' : 'sync'\n }\n\n /**\n * Run all registered actions synchronously (legacy mode).\n *\n * @template TArgs - The type of arguments passed to the action.\n * @param hook - The name of the hook.\n * @param args - The arguments to pass to the callbacks.\n */\n async doActionSync<TArgs = unknown>(hook: string, args: TArgs): Promise<void> {\n const callbacks = this.actions.get(hook) || []\n\n for (const callback of callbacks) {\n try {\n await callback(args)\n } catch (error) {\n console.error(`[HookManager] Error in action '${hook}':`, error)\n }\n }\n }\n\n /**\n * Run all registered actions asynchronously via priority queue.\n *\n * 透過 EventPriorityQueue 進行非同步 dispatch,支援:\n * - 優先級處理(high > normal > low)\n * - 超時處理\n * - 順序保證(strict、partition、none)\n * - 冪等性\n *\n * @template TArgs - The type of arguments passed to the action.\n * @param hook - The name of the hook.\n * @param args - The arguments to pass to the callbacks.\n * @param options - Event options for async dispatch.\n */\n async doActionAsync<TArgs = unknown>(\n hook: string,\n args: TArgs,\n options: EventOptions = {}\n ): Promise<void> {\n const callbacks = this.actions.get(hook) || []\n\n if (callbacks.length === 0) {\n return\n }\n\n // 與預設選項合併\n const mergedOptions: EventOptions = {\n ...DEFAULT_EVENT_OPTIONS,\n ...options,\n async: true,\n }\n\n // 冪等性檢查\n if (mergedOptions.idempotencyKey) {\n const ttl = mergedOptions.ttl || DEFAULT_EVENT_OPTIONS.ttl\n const isDuplicate = this.idempotencyCache.isDuplicate(mergedOptions.idempotencyKey, ttl)\n\n if (isDuplicate) {\n console.warn(\n `[HookManager] Event '${hook}' with idempotency key '${mergedOptions.idempotencyKey}' was skipped (duplicate within TTL window)`\n )\n return\n }\n }\n\n // 使用 backend 加入佇列\n const nowMs = Date.now()\n const task: EventTask = {\n id: `task-${nowMs}-${Math.random().toString(36).substr(2, 9)}`,\n hook,\n args,\n callbacks: callbacks as ActionCallback[],\n options: mergedOptions,\n createdAt: nowMs,\n enqueuedAt: nowMs,\n partitionKey: mergedOptions.partitionKey,\n retryCount: 0,\n }\n\n // === FS-102: Aggregation layer interception ===\n if (this.aggregationManager && mergedOptions.aggregation?.enabled) {\n try {\n const accepted = await this.aggregationManager.submit(task)\n if (!accepted) {\n console.warn(\n `[HookManager] Event '${hook}' was rejected due to backpressure (aggregation overflow)`\n )\n }\n } catch (error) {\n console.error(`[HookManager] Aggregation error for event '${hook}':`, error)\n // 錯誤時降級至直接加入佇列\n this.backend.enqueue(task)\n }\n } else {\n // 直接加入佇列,不使用聚合\n this.backend.enqueue(task)\n }\n\n // 注意:此處不 await 佇列處理\n // 事件在背景非同步處理\n }\n\n /**\n * Determine if async dispatch should be used.\n *\n * @param callbacks - Callbacks to check\n * @param options - Event options\n * @returns True if async dispatch should be used\n */\n shouldUseAsyncDispatch(callbacks: ActionCallback[], options?: EventOptions): boolean {\n // 明確指定 async 選項\n if (options?.async === true) {\n return true\n }\n\n // 明確指定 sync 選項\n if (options?.async === false) {\n return false\n }\n\n // Migration mode: async\n if (this.config.migrationMode === 'async') {\n return true\n }\n\n // Migration mode: sync\n if (this.config.migrationMode === 'sync') {\n return false\n }\n\n // Migration mode: hybrid(自動偵測)\n if (this.config.migrationMode === 'hybrid') {\n const hasAsyncListeners = callbacks.some((cb) => this.asyncDetector.isEffectivelyAsync(cb))\n return hasAsyncListeners || this.config.asyncByDefault === true\n }\n\n return false\n }\n\n /**\n * Determine the dispatch mode for an event.\n *\n * @param hook - Hook name\n * @param options - Optional event options\n * @returns The dispatch mode: 'sync' or 'async'\n */\n detectMode(hook: string, options?: EventOptions): 'sync' | 'async' {\n const callbacks = this.getListeners(hook)\n const shouldUseAsync = this.shouldUseAsyncDispatch(callbacks, options)\n return shouldUseAsync ? 'async' : 'sync'\n }\n\n /**\n * Check if any listener for a hook is async (including type overrides).\n *\n * @param hook - Hook name\n * @returns True if any listener is async\n */\n hasAsyncListeners(hook: string): boolean {\n const callbacks = this.getListeners(hook)\n return callbacks.some((cb) => this.asyncDetector.isEffectivelyAsync(cb))\n }\n\n /**\n * Get detailed information about all listeners for a hook.\n *\n * @param hook - Hook name\n * @returns Array of listener info objects\n */\n getListenerInfo(hook: string): ListenerInfo[] {\n const callbacks = this.getListeners(hook)\n\n return callbacks.map((callback) => {\n const typeOverride = this.asyncDetector.getTypeOverride(callback)\n const isAsync = this.asyncDetector.isEffectivelyAsync(callback)\n\n return {\n callback,\n isAsync,\n typeOverride,\n }\n })\n }\n\n /**\n * Get all registered listeners for a hook.\n *\n * @param hook - Hook name\n * @returns Array of callbacks\n */\n getListeners(hook: string): ActionCallback[] {\n return this.actions.get(hook) || []\n }\n\n /**\n * Remove all listeners for a specific action hook.\n *\n * @param hook - Hook name\n */\n removeAction(hook: string): void {\n this.actions.delete(hook)\n }\n}\n",
112
- "import type { ActionCallback } from './types'\n\n/**\n * 負責偵測 callback 函數是否為非同步(async)。\n *\n * 提供靜態偵測(透過函數簽名)和運行時偵測(透過執行函數)兩種方式,\n * 並包含快取機制以提升重複偵測的性能。\n *\n * @internal\n */\nexport class AsyncDetector {\n /**\n * 快取非同步偵測結果(WeakMap 以自動垃圾回收)。\n */\n private asyncDetectionCache: WeakMap<ActionCallback, boolean> = new WeakMap()\n\n /**\n * 快取中的項目計數(供測試/偵錯使用)。\n */\n private asyncDetectionCacheCount = 0\n\n /**\n * 儲存 listener type override(callback -> type)。\n */\n private listenerTypeOverrides: WeakMap<ActionCallback, 'sync' | 'async' | 'auto'> = new WeakMap()\n\n /**\n * 設定 listener 的 type override。\n *\n * @param callback - 目標 callback\n * @param type - Type override 值\n */\n setTypeOverride(callback: ActionCallback, type: 'sync' | 'async' | 'auto'): void {\n this.listenerTypeOverrides.set(callback, type)\n }\n\n /**\n * 取得 listener 的 type override。\n *\n * @param callback - 目標 callback\n * @returns Type override 或 undefined\n */\n getTypeOverride(callback: ActionCallback): 'sync' | 'async' | 'auto' | undefined {\n return this.listenerTypeOverrides.get(callback)\n }\n\n /**\n * Check if a callback is an async function (with caching).\n *\n * Detection methods:\n * 1. Check cache first\n * 2. Check type override\n * 3. Check constructor.name === 'AsyncFunction'\n * 4. Fallback: Check function string representation\n *\n * @param callback - The callback to check\n * @returns True if the callback is async\n * @public\n */\n isAsyncListener(callback: ActionCallback): boolean {\n // 先檢查快取\n const cachedResult = this.asyncDetectionCache.get(callback)\n if (cachedResult !== undefined) {\n return cachedResult\n }\n\n // 檢查 type override\n const typeOverride = this.listenerTypeOverrides.get(callback)\n if (typeOverride === 'async') {\n this.cacheResult(callback, true)\n return true\n }\n if (typeOverride === 'sync') {\n this.cacheResult(callback, false)\n return false\n }\n\n // 主要偵測:constructor name\n let isAsync = callback.constructor.name === 'AsyncFunction'\n\n // 備用偵測:函數字串表示\n // 處理邊緣情況,例如轉譯代碼或 bound functions\n if (!isAsync) {\n const fnStr = callback.toString()\n // 檢查起始的 async 關鍵字(處理 async arrow functions 和 async function expressions)\n isAsync = /^async\\s/.test(fnStr) || fnStr.startsWith('async ')\n }\n\n // 快取結果\n this.cacheResult(callback, isAsync)\n\n return isAsync\n }\n\n /**\n * Check if a listener is effectively async (considering type override).\n *\n * @param callback - The callback to check\n * @returns True if the listener should be treated as async\n */\n isEffectivelyAsync(callback: ActionCallback): boolean {\n const typeOverride = this.listenerTypeOverrides.get(callback)\n\n if (typeOverride === 'async') {\n return true\n }\n if (typeOverride === 'sync') {\n return false\n }\n\n // 自動偵測\n return this.isAsyncListener(callback)\n }\n\n /**\n * Runtime detection for functions that return Promises but aren't declared async.\n *\n * 此方法會實際執行 callback 來檢查是否回傳 Promise,請謹慎使用。\n *\n * @param callback - The callback to check\n * @param testArgs - Arguments to pass to the callback for testing\n * @returns True if the callback returns a Promise\n * @public\n */\n async isAsyncListenerRuntime<TArgs = unknown>(\n callback: ActionCallback<TArgs>,\n testArgs: TArgs\n ): Promise<boolean> {\n try {\n const result = callback(testArgs)\n const isPromise = result instanceof Promise\n\n // 用運行時結果更新快取\n if (isPromise) {\n this.cacheResult(callback as ActionCallback, true)\n // 等待 promise 結算(避免懸掛的 promise)\n await result.catch(() => {\n // 刻意吞掉錯誤 - 我們只關心 Promise 偵測\n })\n }\n\n return isPromise\n } catch {\n // 如果 callback 拋出例外,視為 sync(錯誤由正常流程處理)\n return false\n }\n }\n\n /**\n * Get the size of the async detection cache (for testing/debugging).\n *\n * @returns Number of cached detection results\n */\n getCacheSize(): number {\n return this.asyncDetectionCacheCount\n }\n\n /**\n * Clear the async detection cache.\n */\n clearCache(): void {\n this.asyncDetectionCache = new WeakMap()\n this.asyncDetectionCacheCount = 0\n }\n\n /**\n * 快取非同步偵測結果。\n * @internal\n */\n private cacheResult(callback: ActionCallback, isAsync: boolean): void {\n if (!this.asyncDetectionCache.has(callback)) {\n this.asyncDetectionCacheCount++\n }\n this.asyncDetectionCache.set(callback, isAsync)\n }\n}\n",
113
- "import type { DeadLetterQueue } from '../events/DeadLetterQueue'\nimport type { EventOptions } from '../events/EventOptions'\nimport type { DeadLetterQueueManager } from '../reliability/DeadLetterQueueManager'\n\n/**\n * DLQ 操作輔助函式模組。\n *\n * 提取自 HookManager 的 DLQ 管理邏輯,以降低 HookManager 複雜度。\n * 這些函式接受所需依賴作為參數,便於測試與重用。\n *\n * @internal\n */\n\n/**\n * 重新加入單一 DLQ 項目到事件佇列。\n *\n * @param dlqEntryId - DLQ 項目 ID\n * @param dlq - 記憶體內 DLQ 實例\n * @param requeue - 重新加入佇列的回調函式\n * @returns 是否成功重新加入\n */\nexport async function requeueDLQEntry(\n dlqEntryId: string,\n dlq: DeadLetterQueue,\n requeue: (eventName: string, payload: unknown, options: EventOptions) => Promise<void>\n): Promise<boolean> {\n const entry = dlq.get(dlqEntryId)\n\n if (!entry) {\n return false\n }\n\n // 更新最後重試時間戳\n dlq.updateLastRetried(dlqEntryId)\n\n // 重新加入佇列\n await requeue(entry.eventName, entry.payload, entry.options)\n\n // 成功重新加入後從 DLQ 刪除\n dlq.delete(dlqEntryId)\n\n return true\n}\n\n/**\n * 批次重新加入指定事件名稱的所有 DLQ 項目。\n *\n * @param eventName - 事件名稱\n * @param dlq - 記憶體內 DLQ 實例\n * @param requeue - 重新加入佇列的回調函式\n * @returns 成功重新加入的項目數\n */\nexport async function requeueDLQBatch(\n eventName: string,\n dlq: DeadLetterQueue,\n requeue: (entryId: string) => Promise<boolean>\n): Promise<number> {\n const entries = dlq.list({ eventName })\n let requeuedCount = 0\n\n for (const entry of entries) {\n const success = await requeue(entry.id)\n if (success) {\n requeuedCount++\n }\n }\n\n return requeuedCount\n}\n\n/**\n * 建立 EventPriorityQueue 持久化 DLQ 處理器。\n *\n * @param persistentDlqManager - 持久化 DLQ 管理器\n * @returns 持久化 DLQ 處理器函式\n */\nexport function createPersistentDLQHandler(persistentDlqManager: DeadLetterQueueManager) {\n return async (\n hook: string,\n args: unknown,\n options: EventOptions,\n error: Error,\n retryCount: number,\n _firstFailedAt: number\n ): Promise<void> => {\n try {\n // 將 event options 轉換為 retry policy\n const retryPolicy = options.retry\n ? {\n maxRetries: options.retry.maxRetries || 3,\n backoff: options.retry.backoff || 'exponential',\n initialDelayMs: options.retry.initialDelayMs || 1000,\n maxDelayMs: options.retry.maxDelayMs || 30000,\n }\n : undefined\n\n // 移至持久化 DLQ\n await persistentDlqManager.moveToDlq(hook, args, options, error, retryCount, retryPolicy)\n } catch (dlqError) {\n console.error(`[HookManager] Error moving event to persistent DLQ:`, dlqError)\n }\n }\n}\n\n/**\n * 重新加入持久化 DLQ 單一項目到事件佇列。\n *\n * @param dlqId - 持久化 DLQ 項目 UUID\n * @param persistentDlqManager - 持久化 DLQ 管理器\n * @param doActionAsync - 重新加入佇列的回調函式\n * @returns 是否成功重新加入\n */\nexport async function requeuePersistentDLQEntry(\n dlqId: string,\n persistentDlqManager: DeadLetterQueueManager,\n doActionAsync: (event: string, args: unknown, options: EventOptions) => Promise<void>\n): Promise<boolean> {\n try {\n const event = await persistentDlqManager.getById(dlqId)\n if (!event) {\n return false\n }\n\n // 重新加入佇列\n await doActionAsync(event.event_name, event.event_payload, event.event_options as EventOptions)\n\n // 標記為已重新加入佇列\n await persistentDlqManager.requeue(dlqId)\n\n return true\n } catch (error) {\n console.error(`[HookManager] Error requeuing persistent DLQ entry:`, error)\n return false\n }\n}\n\n/**\n * 批次重新加入持久化 DLQ 項目。\n *\n * @param filter - 過濾條件\n * @param persistentDlqManager - 持久化 DLQ 管理器\n * @returns 批次操作結果統計\n */\nexport async function requeuePersistentDLQBatch(\n filter:\n | { eventName?: string; status?: 'pending' | 'requeued' | 'resolved' | 'abandoned' }\n | undefined,\n persistentDlqManager: DeadLetterQueueManager\n): Promise<{ total: number; succeeded: number; failed: number }> {\n try {\n return await persistentDlqManager.retryBatch(filter)\n } catch (error) {\n console.error(`[HookManager] Error in persistent DLQ batch retry:`, error)\n return { total: 0, succeeded: 0, failed: 0 }\n }\n}\n",
114
- "import type { FilterCallback } from './types'\n\n/**\n * 管理 filter hook 的登記與執行。\n *\n * Filter hook 用於轉換數值:每個 callback 接收前一個 callback 的回傳值,\n * 並返回新的轉換後數值。所有 callback 按登記順序依次執行。\n *\n * @internal\n */\nexport class FilterManager {\n /**\n * 儲存所有已登記的 filter callbacks。\n * Map key 為 hook 名稱,value 為 callback 陣列。\n */\n private filters: Map<string, FilterCallback[]> = new Map()\n\n /**\n * Register a filter hook.\n *\n * Filters are used to transform a value (input/output) through a chain of\n * callbacks. Each callback must return the modified value.\n *\n * @template T - The type of value being filtered.\n * @param hook - The unique name of the hook.\n * @param callback - The callback function to execute.\n *\n * @example\n * ```typescript\n * filterManager.addFilter('content', async (content: string) => {\n * return content.toUpperCase()\n * })\n * ```\n */\n addFilter<T = unknown>(hook: string, callback: FilterCallback<T>): void {\n if (!this.filters.has(hook)) {\n this.filters.set(hook, [])\n }\n // Generic type erasure for storage\n this.filters.get(hook)?.push(callback as unknown as FilterCallback)\n }\n\n /**\n * Apply all registered filters sequentially.\n *\n * Each callback receives the previous callback's return value.\n *\n * @template T - The type of value being filtered.\n * @param hook - The name of the hook.\n * @param initialValue - The initial value to filter.\n * @param args - Additional arguments to pass to the callbacks.\n * @returns The final filtered value.\n *\n * @example\n * ```typescript\n * const content = await filterManager.applyFilters('content', 'hello world')\n * ```\n */\n async applyFilters<T = unknown>(hook: string, initialValue: T, ...args: unknown[]): Promise<T> {\n const callbacks = this.filters.get(hook) || []\n let value = initialValue\n\n for (const callback of callbacks) {\n try {\n value = (await callback(value, ...args)) as T\n } catch (error) {\n console.error(`[HookManager] Error in filter '${hook}':`, error)\n // 錯誤處理策略:記錄錯誤並繼續使用當前值\n }\n }\n\n return value\n }\n\n /**\n * Check if any filters are registered for a hook.\n *\n * @param hook - Hook name\n * @returns True if at least one filter is registered\n */\n hasFilters(hook: string): boolean {\n const callbacks = this.filters.get(hook)\n return callbacks !== undefined && callbacks.length > 0\n }\n\n /**\n * Get count of registered filters for a hook.\n *\n * @param hook - Hook name\n * @returns Number of registered filters\n */\n getFilterCount(hook: string): number {\n return this.filters.get(hook)?.length ?? 0\n }\n\n /**\n * Remove all filters for a specific hook.\n *\n * @param hook - Hook name\n */\n removeFilters(hook: string): void {\n this.filters.delete(hook)\n }\n}\n",
115
- "/**\n * Migration warning manager for deprecation warnings.\n *\n * 管理遷移警告訊息,支援透過環境變數抑制特定事件的警告。\n *\n * @internal\n */\nexport class MigrationWarner {\n private suppressedWarnings: Set<string> = new Set()\n\n constructor() {\n // 從環境變數載入已抑制的警告\n const suppressed = process.env.GRAVITO_SUPPRESS_MIGRATION_WARNING\n if (suppressed) {\n suppressed.split(',').forEach((event) => {\n this.suppressedWarnings.add(event.trim())\n })\n }\n }\n\n /**\n * 發出遷移警告訊息。\n *\n * @param eventName - 事件名稱\n * @param message - 警告訊息\n */\n warn(eventName: string, message: string): void {\n if (this.suppressedWarnings.has(eventName)) {\n return\n }\n\n console.warn(`[Gravito Migration] Event \"${eventName}\" using synchronous dispatch`)\n console.warn(` ${message}`)\n console.warn(` Reference: https://gravito.dev/docs/events/async-migration`)\n console.warn(` To suppress this warning: GRAVITO_SUPPRESS_MIGRATION_WARNING=\"${eventName}\"`)\n }\n\n /**\n * 抑制特定事件的遷移警告。\n *\n * @param eventName - 要抑制警告的事件名稱\n */\n suppress(eventName: string): void {\n this.suppressedWarnings.add(eventName)\n }\n}\n",
116
- "/**\n * Universal Crypto wrapper.\n * Automatically switches between node:crypto and globalThis.crypto.\n */\n\nlet randomUUIDFn: () => string\nlet randomBytesFn: (size: number) => any\n\nconst tryGetNodeCrypto = () => {\n try {\n if (\n typeof window === 'undefined' &&\n typeof process !== 'undefined' &&\n !(process as any).browser\n ) {\n // biome-ignore lint/security/noGlobalEval: specialized case for hiding node built-ins\n return eval('require')('node:crypto')\n }\n } catch (_e) {\n return null\n }\n}\n\nconst nodeCrypto = tryGetNodeCrypto()\n\nif (nodeCrypto) {\n randomUUIDFn = nodeCrypto.randomUUID\n randomBytesFn = nodeCrypto.randomBytes\n} else {\n // Browser implementations\n randomUUIDFn = () => {\n if (typeof globalThis.crypto?.randomUUID === 'function') {\n return globalThis.crypto.randomUUID()\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0\n const v = c === 'x' ? r : (r & 0x3) | 0x8\n return v.toString(16)\n })\n }\n\n randomBytesFn = (size: number) => {\n const bytes = new Uint8Array(size)\n if (typeof globalThis.crypto?.getRandomValues === 'function') {\n globalThis.crypto.getRandomValues(bytes)\n } else {\n for (let i = 0; i < size; i++) {\n bytes[i] = Math.floor(Math.random() * 256)\n }\n }\n // Return a Buffer-like object\n return {\n ...Array.from(bytes),\n length: size,\n [Symbol.iterator]: () => bytes[Symbol.iterator](),\n toString: (encoding: string) => {\n if (encoding === 'base64') {\n let binary = ''\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i])\n }\n return btoa(binary)\n }\n if (encoding === 'hex') {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n }\n return ''\n },\n }\n }\n}\n\nexport const randomUUID = randomUUIDFn\nexport const randomBytes = randomBytesFn\n",
117
- "/**\n * @gravito/core - Retry Policy\n *\n * 重試策略和退避算法的實現\n * 支持指數和線性退避,包含 Jitter 防止雷鳴羊群\n */\n\n/**\n * 重試策略配置接口\n *\n * @example\n * ```typescript\n * const policy: RetryPolicy = {\n * maxRetries: 3,\n * backoff: 'exponential',\n * initialDelayMs: 1000,\n * maxDelayMs: 30000,\n * dlqAfterMaxRetries: true\n * }\n * ```\n */\nexport interface RetryPolicy {\n /** 最大重試次數 */\n maxRetries: number\n\n /** 退避策略:指數或線性 */\n backoff: 'exponential' | 'linear'\n\n /** 初始延遲時間(毫秒) */\n initialDelayMs: number\n\n /** 最大延遲時間(毫秒) */\n maxDelayMs: number\n\n /** 超過最大重試次數後是否發送到死信隊列 */\n dlqAfterMaxRetries?: boolean\n}\n\n/**\n * 重試引擎\n *\n * 負責計算重試延遲、判斷是否應該重試等邏輯\n *\n * @example\n * ```typescript\n * const engine = new RetryEngine()\n * const delay = engine.calculateDelay(1, policy)\n * const shouldRetry = engine.shouldRetry(3, policy)\n * ```\n */\nexport class RetryEngine {\n /**\n * 計算下次重試的延遲時間(毫秒)\n *\n * @param attemptCount - 當前嘗試次數(從 1 開始)\n * @param policy - 重試策略配置\n * @returns 延遲時間(毫秒)\n *\n * @description\n * - 指數退避:delay = initialDelay * 2^(attemptCount - 1)\n * - 線性退避:delay = initialDelay * attemptCount\n * - 添加隨機抖動(Jitter),防止雷鳴羊群問題\n * - 結果不超過 maxDelayMs\n *\n * @example\n * ```typescript\n * const policy: RetryPolicy = {\n * maxRetries: 3,\n * backoff: 'exponential',\n * initialDelayMs: 1000,\n * maxDelayMs: 30000\n * }\n *\n * // 第 1 次重試:1000ms * 2^0 = 1000ms (加抖動)\n * const delay1 = engine.calculateDelay(1, policy) // ~1100ms\n *\n * // 第 2 次重試:1000ms * 2^1 = 2000ms (加抖動)\n * const delay2 = engine.calculateDelay(2, policy) // ~2200ms\n *\n * // 第 3 次重試:1000ms * 2^2 = 4000ms (加抖動)\n * const delay3 = engine.calculateDelay(3, policy) // ~4400ms\n * ```\n */\n calculateDelay(attemptCount: number, policy: RetryPolicy): number {\n const { backoff, initialDelayMs, maxDelayMs } = policy\n\n // 計算基礎延遲\n let delay: number\n\n if (backoff === 'exponential') {\n // 指數退避:delay = initialDelay * 2^(attemptCount - 1)\n // 確保 attemptCount >= 1\n const exponent = Math.max(0, attemptCount - 1)\n delay = initialDelayMs * 2 ** exponent\n } else {\n // 線性退避:delay = initialDelay * attemptCount\n delay = initialDelayMs * attemptCount\n }\n\n // 添加隨機抖動(Jitter),避免雷鳴羊群問題\n // 抖動範圍:0 到 delay 的 10%\n const jitter = Math.random() * delay * 0.1\n delay = delay + jitter\n\n // 限制最大延遲\n return Math.min(Math.ceil(delay), maxDelayMs)\n }\n\n /**\n * 判斷是否應該重試\n *\n * @param attemptCount - 當前嘗試次數(從 1 開始)\n * @param policy - 重試策略配置\n * @returns 是否應該重試\n *\n * @description\n * 當 attemptCount < maxRetries 時返回 true\n *\n * @example\n * ```typescript\n * const policy = { maxRetries: 3, ... }\n *\n * engine.shouldRetry(1, policy) // true(1 < 3)\n * engine.shouldRetry(3, policy) // false(3 >= 3)\n * engine.shouldRetry(4, policy) // false(4 >= 3)\n * ```\n */\n shouldRetry(attemptCount: number, policy: RetryPolicy): boolean {\n return attemptCount < policy.maxRetries\n }\n\n /**\n * 獲取退避時間(包含延遲計算和 Jitter)\n *\n * @param retryCount - 重試次數(從 0 開始)\n * @param policy - 重試策略配置\n * @returns 退避時間(毫秒)\n *\n * @description\n * 這是 calculateDelay 的別名,但接收的是從 0 開始的重試計數\n *\n * @example\n * ```typescript\n * const policy = { maxRetries: 3, initialDelayMs: 1000, maxDelayMs: 30000, backoff: 'exponential' }\n *\n * // 第 0 次重試(第 1 次嘗試失敗)\n * const time1 = engine.getBackoffTime(0, policy) // ~1100ms\n *\n * // 第 1 次重試(第 2 次嘗試失敗)\n * const time2 = engine.getBackoffTime(1, policy) // ~2200ms\n * ```\n */\n getBackoffTime(retryCount: number, policy: RetryPolicy): number {\n // retryCount 從 0 開始,而 calculateDelay 使用 attemptCount 從 1 開始\n return this.calculateDelay(retryCount + 1, policy)\n }\n\n /**\n * 計算下次重試的絕對時間\n *\n * @param retryCount - 重試次數(從 0 開始)\n * @param policy - 重試策略配置\n * @param baseTime - 基礎時間戳(默認為當前時間)\n * @returns 下次重試的時間戳(毫秒)\n *\n * @example\n * ```typescript\n * const policy = { maxRetries: 3, initialDelayMs: 1000, maxDelayMs: 30000, backoff: 'exponential' }\n *\n * const now = Date.now()\n * const nextRetryTime = engine.getNextRetryTime(0, policy, now)\n * // 返回大約 now + 1000 + jitter\n * ```\n */\n getNextRetryTime(retryCount: number, policy: RetryPolicy, baseTime: number = Date.now()): number {\n const delay = this.getBackoffTime(retryCount, policy)\n return baseTime + delay\n }\n\n /**\n * 驗證重試策略配置\n *\n * @param policy - 重試策略配置\n * @returns 是否有效\n *\n * @description\n * 檢查配置是否合理:\n * - maxRetries >= 0\n * - initialDelayMs > 0\n * - maxDelayMs >= initialDelayMs\n *\n * @example\n * ```typescript\n * const validPolicy = { maxRetries: 3, initialDelayMs: 1000, maxDelayMs: 30000, backoff: 'exponential' }\n * engine.isValidPolicy(validPolicy) // true\n *\n * const invalidPolicy = { maxRetries: 3, initialDelayMs: 5000, maxDelayMs: 1000, backoff: 'exponential' }\n * engine.isValidPolicy(invalidPolicy) // false (maxDelayMs < initialDelayMs)\n * ```\n */\n isValidPolicy(policy: RetryPolicy): boolean {\n if (policy.maxRetries < 0) {\n return false\n }\n\n if (policy.initialDelayMs <= 0) {\n return false\n }\n\n if (policy.maxDelayMs < policy.initialDelayMs) {\n return false\n }\n\n if (!['exponential', 'linear'].includes(policy.backoff)) {\n return false\n }\n\n return true\n }\n\n /**\n * 獲取人類可讀的重試信息\n *\n * @param attemptCount - 當前嘗試次數(從 1 開始)\n * @param policy - 重試策略配置\n * @returns 描述性文本\n *\n * @example\n * ```typescript\n * const policy = { maxRetries: 3, initialDelayMs: 1000, maxDelayMs: 30000, backoff: 'exponential' }\n *\n * engine.getRetryInfo(1, policy) // \"Retry 1 of 3, will retry in ~1100ms\"\n * engine.getRetryInfo(3, policy) // \"Retry 3 of 3 (final attempt), will retry in ~4400ms\"\n * engine.getRetryInfo(4, policy) // \"Max retries exceeded (4 >= 3)\"\n * ```\n */\n getRetryInfo(attemptCount: number, policy: RetryPolicy): string {\n if (attemptCount > policy.maxRetries) {\n return `Max retries exceeded (${attemptCount} > ${policy.maxRetries})`\n }\n\n if (!this.shouldRetry(attemptCount, policy)) {\n return `Max retries reached (${attemptCount} of ${policy.maxRetries})`\n }\n\n const delay = this.calculateDelay(attemptCount, policy)\n const isFinal = attemptCount === policy.maxRetries - 1\n const finalNote = isFinal ? ' (final attempt)' : ''\n\n return `Retry ${attemptCount} of ${policy.maxRetries}${finalNote}, will retry in ~${delay}ms`\n }\n}\n\n/**\n * 創建默認的重試策略\n *\n * @returns 默認重試策略\n *\n * @description\n * 默認配置:\n * - 最多重試 3 次\n * - 指數退避\n * - 初始延遲 1 秒\n * - 最大延遲 30 秒\n * - 超過最大重試後發送 DLQ\n *\n * @example\n * ```typescript\n * const policy = getDefaultRetryPolicy()\n * // { maxRetries: 3, backoff: 'exponential', initialDelayMs: 1000, maxDelayMs: 30000, dlqAfterMaxRetries: true }\n * ```\n */\nexport function getDefaultRetryPolicy(): RetryPolicy {\n return {\n maxRetries: 3,\n backoff: 'exponential',\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n dlqAfterMaxRetries: true,\n }\n}\n\n/**\n * 為不同類型的操作獲取預設的重試策略\n *\n * @param type - 操作類型\n * @returns 推薦的重試策略\n *\n * @example\n * ```typescript\n * // 外部 API 調用:更多重試,更長延遲\n * const apiPolicy = getPresetRetryPolicy('external-api')\n *\n * // 數據庫操作:較少重試,短延遲\n * const dbPolicy = getPresetRetryPolicy('database')\n *\n * // 消息隊列:適中重試\n * const mqPolicy = getPresetRetryPolicy('message-queue')\n * ```\n */\nexport function getPresetRetryPolicy(\n type: 'external-api' | 'database' | 'message-queue' | 'default'\n): RetryPolicy {\n switch (type) {\n case 'external-api':\n // 外部 API 調用:更多重試,更長延遲\n return {\n maxRetries: 5,\n backoff: 'exponential',\n initialDelayMs: 1000,\n maxDelayMs: 60000,\n dlqAfterMaxRetries: true,\n }\n\n case 'database':\n // 數據庫操作:較少重試,短延遲\n return {\n maxRetries: 2,\n backoff: 'linear',\n initialDelayMs: 100,\n maxDelayMs: 1000,\n dlqAfterMaxRetries: false,\n }\n\n case 'message-queue':\n // 消息隊列:適中重試,指數退避\n return {\n maxRetries: 3,\n backoff: 'exponential',\n initialDelayMs: 500,\n maxDelayMs: 15000,\n dlqAfterMaxRetries: true,\n }\n default:\n return getDefaultRetryPolicy()\n }\n}\n",
118
- "/**\n * @gravito/core - Dead Letter Queue Manager\n *\n * 管理失敗事件的持久化存儲\n * 支持 CRUD、重新入隊、批量重試和統計功能\n */\n\n// import type { ConnectionContract } from '@gravito/atlas'\nimport { randomUUID } from '../compat/crypto'\nimport type { EventOptions } from '../events/EventOptions'\nimport type { RetryPolicy } from './RetryPolicy'\nimport { RetryEngine } from './RetryPolicy'\n\n/**\n * DLQ 事件的數據庫記錄\n */\nexport interface DLQRecord {\n id: number\n dlq_id: string\n event_name: string\n event_payload: unknown\n event_options: unknown\n attempt_count: number\n max_retries: number\n next_retry_at: string | null\n last_error: unknown\n status: 'pending' | 'requeued' | 'resolved' | 'abandoned'\n resolution_notes: string | null\n failed_at: string\n created_at: string\n updated_at: string\n}\n\n/**\n * DLQ 事件查詢過濾選項(for DeadLetterQueueManager)\n */\nexport interface DLQManagerFilter {\n /** 按事件名稱篩選 */\n eventName?: string\n\n /** 按狀態篩選 */\n status?: 'pending' | 'requeued' | 'resolved' | 'abandoned'\n\n /** 開始時間 */\n from?: Date\n\n /** 結束時間 */\n to?: Date\n\n /** 結果數量限制 */\n limit?: number\n\n /** 分頁偏移 */\n offset?: number\n}\n\n/**\n * DLQ 統計信息\n */\nexport interface DLQStats {\n /** 事件總數 */\n total: number\n\n /** 按事件名稱的統計 */\n byEvent: Record<string, number>\n\n /** 按狀態的統計 */\n byStatus: Record<string, number>\n}\n\n/**\n * Dead Letter Queue 管理器\n *\n * 負責管理失敗事件的持久化存儲,支持:\n * - 自動將失敗事件移至 DLQ\n * - 查詢和篩選 DLQ 事件\n * - 重新入隊單個或批量事件\n * - 標記事件為已解決或已放棄\n * - 查看統計信息\n *\n * @example\n * ```typescript\n * const db = container.make('db') as any\n * const dlqManager = new DeadLetterQueueManager(db)\n *\n * // 將失敗事件移至 DLQ\n * const dlqId = await dlqManager.moveToDlq(\n * 'order:created',\n * { orderId: '123' },\n * { retry: {...} },\n * error,\n * 3\n * )\n *\n * // 查詢 DLQ 事件\n * const events = await dlqManager.list({ event: 'order:created', status: 'pending' })\n *\n * // 重新入隊\n * await dlqManager.requeue(dlqId)\n *\n * // 批量重試\n * const result = await dlqManager.retryBatch({ eventName: 'order:created' })\n *\n * // 統計\n * const stats = await dlqManager.getStats()\n * ```\n */\nexport class DeadLetterQueueManager {\n private retryEngine: RetryEngine\n\n constructor(private db: any) {\n this.retryEngine = new RetryEngine()\n }\n\n /**\n * 將失敗事件移至死信隊列\n *\n * @param eventName - 事件名稱\n * @param payload - 事件負載\n * @param options - 事件選項\n * @param error - 導致失敗的錯誤\n * @param attemptCount - 當前嘗試次數\n * @param retryPolicy - 重試策略配置\n * @returns DLQ 記錄的 UUID\n *\n * @example\n * ```typescript\n * const dlqId = await dlqManager.moveToDlq(\n * 'order:created',\n * { orderId: 'ORD-123' },\n * { retry: { maxRetries: 3, backoff: 'exponential' } },\n * new Error('Service unavailable'),\n * 3,\n * { maxRetries: 3, backoff: 'exponential', initialDelayMs: 1000, maxDelayMs: 30000 }\n * )\n * ```\n */\n async moveToDlq(\n eventName: string,\n payload: unknown,\n options: EventOptions,\n error: Error,\n attemptCount: number,\n retryPolicy?: RetryPolicy\n ): Promise<string> {\n const dlqId = randomUUID()\n\n // 如果提供了重試策略,計算下次重試時間\n let nextRetryAt: string | null = null\n if (retryPolicy && this.retryEngine.shouldRetry(attemptCount + 1, retryPolicy)) {\n const delayMs = this.retryEngine.calculateDelay(attemptCount + 1, retryPolicy)\n nextRetryAt = new Date(Date.now() + delayMs).toISOString()\n }\n\n const record = {\n dlq_id: dlqId,\n event_name: eventName,\n event_payload: payload,\n event_options: options,\n attempt_count: attemptCount,\n max_retries: retryPolicy?.maxRetries || 3,\n next_retry_at: nextRetryAt,\n last_error: {\n message: error.message,\n code: (error as any).code,\n stack: error.stack,\n timestamp: new Date().toISOString(),\n },\n status: 'pending',\n resolution_notes: null,\n failed_at: new Date(),\n }\n\n await this.db.table('event_dlq').insert(record)\n\n return dlqId\n }\n\n /**\n * 按 DLQ ID 獲取單個事件\n *\n * @param dlqId - DLQ 事件的 UUID\n * @returns DLQ 記錄,若不存在則返回 undefined\n *\n * @example\n * ```typescript\n * const event = await dlqManager.getById('550e8400-e29b-41d4-a716-446655440000')\n * if (event) {\n * console.log(event.event_name, event.status)\n * }\n * ```\n */\n async getById(dlqId: string): Promise<DLQRecord | undefined> {\n const result = await this.db.table('event_dlq').where('dlq_id', dlqId).first()\n return (result as DLQRecord | null) || undefined\n }\n\n /**\n * 查詢 DLQ 事件\n *\n * @param filter - 查詢過濾條件\n * @returns DLQ 記錄列表(按失敗時間倒序)\n *\n * @example\n * ```typescript\n * // 查詢特定事件的待處理事件\n * const events = await dlqManager.list({\n * eventName: 'order:created',\n * status: 'pending',\n * limit: 50\n * })\n *\n * // 查詢時間範圍內的所有失敗事件\n * const eventsInRange = await dlqManager.list({\n * from: new Date('2026-02-01'),\n * to: new Date('2026-02-03'),\n * limit: 100\n * })\n * ```\n */\n async list(filter: DLQManagerFilter = {}): Promise<DLQRecord[]> {\n let query = this.db.table('event_dlq')\n\n // 按事件名稱篩選\n if (filter.eventName) {\n query = query.where('event_name', filter.eventName)\n }\n\n // 按狀態篩選\n if (filter.status) {\n query = query.where('status', filter.status)\n }\n\n // 按時間範圍篩選\n if (filter.from) {\n query = query.where('failed_at', '>=', filter.from)\n }\n\n if (filter.to) {\n query = query.where('failed_at', '<=', filter.to)\n }\n\n // 排序並分頁\n const results = await query\n .orderBy('failed_at', 'desc')\n .limit(filter.limit || 100)\n .offset(filter.offset || 0)\n .get()\n\n return results as unknown as DLQRecord[]\n }\n\n /**\n * 重新入隊單個 DLQ 事件\n *\n * 重新入隊不會自動派發事件,而是標記狀態為 'requeued'\n * 實際的事件派發應由調用者負責處理\n *\n * @param dlqId - DLQ 事件的 UUID\n * @throws 如果事件不存在\n *\n * @example\n * ```typescript\n * const event = await dlqManager.getById(dlqId)\n * if (event) {\n * // 由調用者決定如何派發事件\n * await eventSystem.doActionAsync(\n * event.event_name,\n * event.event_payload,\n * event.event_options\n * )\n *\n * // 標記為已重新入隊\n * await dlqManager.requeue(dlqId)\n * }\n * ```\n */\n async requeue(dlqId: string): Promise<void> {\n const event = await this.getById(dlqId)\n\n if (!event) {\n throw new Error(`DLQ event not found: ${dlqId}`)\n }\n\n await this.updateStatus(dlqId, 'requeued', `Manual requeue at ${new Date().toISOString()}`)\n }\n\n /**\n * 批量重新入隊 DLQ 事件\n *\n * @param filter - 查詢過濾條件\n * @returns 包含處理結果的統計對象\n *\n * @example\n * ```typescript\n * const result = await dlqManager.retryBatch({\n * eventName: 'order:created',\n * status: 'pending'\n * })\n *\n * console.log(`Success: ${result.succeeded}, Failed: ${result.failed}`)\n * ```\n */\n async retryBatch(\n filter: DLQManagerFilter = {}\n ): Promise<{ total: number; succeeded: number; failed: number }> {\n const events = await this.list(filter)\n let succeeded = 0\n let failed = 0\n\n for (const event of events) {\n try {\n await this.requeue(event.dlq_id)\n succeeded++\n } catch (error) {\n console.error(`Failed to requeue ${event.dlq_id}:`, error)\n failed++\n }\n }\n\n return { total: events.length, succeeded, failed }\n }\n\n /**\n * 標記 DLQ 事件為已解決\n *\n * @param dlqId - DLQ 事件的 UUID\n * @param notes - 解決說明\n *\n * @example\n * ```typescript\n * await dlqManager.resolve(dlqId, 'Manual fix applied: Database issue resolved')\n * ```\n */\n async resolve(dlqId: string, notes?: string): Promise<void> {\n await this.updateStatus(dlqId, 'resolved', notes || `Resolved at ${new Date().toISOString()}`)\n }\n\n /**\n * 放棄 DLQ 事件(不再重試)\n *\n * @param dlqId - DLQ 事件的 UUID\n * @param reason - 放棄原因\n *\n * @example\n * ```typescript\n * await dlqManager.abandon(dlqId, 'Data corrupted, cannot recover')\n * ```\n */\n async abandon(dlqId: string, reason?: string): Promise<void> {\n await this.updateStatus(\n dlqId,\n 'abandoned',\n reason || `Abandoned at ${new Date().toISOString()}`\n )\n }\n\n /**\n * 更新 DLQ 事件狀態\n *\n * @param dlqId - DLQ 事件的 UUID\n * @param status - 新狀態\n * @param notes - 狀態變更說明\n * @throws 如果事件不存在\n *\n * @internal\n */\n async updateStatus(\n dlqId: string,\n status: 'pending' | 'requeued' | 'resolved' | 'abandoned',\n notes?: string\n ): Promise<void> {\n const event = await this.getById(dlqId)\n\n if (!event) {\n throw new Error(`DLQ event not found: ${dlqId}`)\n }\n\n await this.db\n .table('event_dlq')\n .where('dlq_id', dlqId)\n .update({\n status,\n resolution_notes: notes || event.resolution_notes,\n updated_at: new Date(),\n })\n }\n\n /**\n * 刪除單個 DLQ 事件\n *\n * @param dlqId - DLQ 事件的 UUID\n * @returns true 如果刪除成功,false 如果事件不存在\n *\n * @example\n * ```typescript\n * const deleted = await dlqManager.deleteEntry(dlqId)\n * if (deleted) {\n * console.log('Event deleted')\n * }\n * ```\n */\n async deleteEntry(dlqId: string): Promise<boolean> {\n const result = await this.db.table('event_dlq').where('dlq_id', dlqId).delete()\n\n return result > 0\n }\n\n /**\n * 刪除多個 DLQ 事件\n *\n * @param dlqIds - DLQ 事件 UUID 列表\n * @returns 刪除的事件數量\n *\n * @example\n * ```typescript\n * const deletedCount = await dlqManager.deleteEntries([id1, id2, id3])\n * ```\n */\n async deleteEntries(dlqIds: string[]): Promise<number> {\n if (dlqIds.length === 0) {\n return 0\n }\n\n return this.db.table('event_dlq').whereIn('dlq_id', dlqIds).delete()\n }\n\n /**\n * 獲取 DLQ 統計信息\n *\n * @returns 包含總數、按事件名稱和狀態的統計信息\n *\n * @example\n * ```typescript\n * const stats = await dlqManager.getStats()\n *\n * console.log(`Total events: ${stats.total}`)\n * console.log('By event:', stats.byEvent)\n * // Output: { 'order:created': 145, 'payment:succeeded': 23 }\n *\n * console.log('By status:', stats.byStatus)\n * // Output: { pending: 120, requeued: 15, resolved: 8, abandoned: 2 }\n * ```\n */\n async getStats(): Promise<DLQStats> {\n // 獲取總數\n const total = await this.db.table('event_dlq').count()\n\n // 按事件名稱分組統計(使用 raw SQL 以確保跨數據庫兼容)\n const byEventResult = await this.db.raw(\n 'SELECT event_name, COUNT(*) as count FROM event_dlq GROUP BY event_name'\n )\n\n const byEvent: Record<string, number> = {}\n for (const row of byEventResult.rows) {\n byEvent[row.event_name] = Number(row.count)\n }\n\n // 按狀態分組統計(使用 raw SQL 以確保跨數據庫兼容)\n const byStatusResult = await this.db.raw(\n 'SELECT status, COUNT(*) as count FROM event_dlq GROUP BY status'\n )\n\n const byStatus: Record<string, number> = {}\n for (const row of byStatusResult.rows) {\n byStatus[row.status] = Number(row.count)\n }\n\n return {\n total,\n byEvent,\n byStatus,\n }\n }\n\n /**\n * 獲取某個事件名稱的 DLQ 事件數\n *\n * @param eventName - 事件名稱\n * @returns 事件數量\n *\n * @example\n * ```typescript\n * const count = await dlqManager.getCountByEvent('order:created')\n * ```\n */\n async getCountByEvent(eventName: string): Promise<number> {\n return this.db.table('event_dlq').where('event_name', eventName).count()\n }\n\n /**\n * 清空所有 DLQ 事件(慎用!)\n *\n * @param includeResolved - 是否包含已解決的事件\n * @returns 清空的事件數量\n *\n * @example\n * ```typescript\n * // 只清空待處理的事件\n * const count = await dlqManager.clear(false)\n *\n * // 清空所有事件(包括已解決和已放棄)\n * const countAll = await dlqManager.clear(true)\n * ```\n */\n async clear(includeResolved = false): Promise<number> {\n let query = this.db.table('event_dlq')\n\n if (!includeResolved) {\n query = query.where('status', 'pending')\n }\n\n return query.delete()\n }\n\n /**\n * 通過 Bull Job ID 查找 DLQ 記錄\n *\n * 用於 MessageQueueBridge 集成:當 Bull Queue job 失敗時,\n * 通過 Job ID 查找相應的 DLQ 記錄。\n *\n * @param bullJobId - Bull Queue Job ID\n * @returns DLQ 記錄或 undefined\n *\n * @example\n * ```typescript\n * const record = await dlqManager.findByBullJobId('job-abc123')\n * if (record) {\n * console.log(`Event ${record.event_name} is in DLQ`)\n * }\n * ```\n */\n async findByBullJobId(bullJobId: string): Promise<DLQRecord | undefined> {\n try {\n const records = (await this.db\n .table('event_dlq')\n .whereRaw('event_options LIKE ?', [`%\"bullJobId\":\"${bullJobId}\"%`])\n .limit(1)\n .get()) as unknown as DLQRecord[]\n\n return records && records.length > 0 ? records[0] : undefined\n } catch (error) {\n console.error(`[DeadLetterQueueManager] Error finding record by Bull Job ID:`, error)\n return undefined\n }\n }\n\n /**\n * 調度延遲重試(整合 Bull Queue delayed jobs)\n *\n * 從 DLQ 中提取事件,通過 Bull Queue 的延遲 job 功能進行重試。\n *\n * @param dlqId - DLQ 記錄 ID\n * @param delayMs - 延遲時間(毫秒)\n * @throws 如果記錄不存在\n *\n * @example\n * ```typescript\n * // 延遲 1 小時後重試\n * await dlqManager.scheduleRetry('dlq-uuid-123', 3600000)\n * ```\n */\n async scheduleRetry(dlqId: string, delayMs: number): Promise<void> {\n // 1. 從 DLQ 獲取事件\n const record = await this.getById(dlqId)\n if (!record) {\n throw new Error(`[DeadLetterQueueManager] DLQ record not found: ${dlqId}`)\n }\n\n // 2. 使用 Bull Queue 創建延遲任務\n // TODO: Phase 4 Task 3 - 整合 MessageQueueBridge.dispatchDeferredQueued()\n // 當前作為 stub 實現,在完整實現中應該通過 HookManager 調用 dispatchDeferredQueued\n\n console.info(\n `[DeadLetterQueueManager] Scheduled retry for event ${record.event_name} (dlq_id: ${dlqId}) with delay ${delayMs}ms`\n )\n\n // 3. 更新 DLQ 狀態\n await this.requeue(dlqId)\n }\n}\n",
119
- "import { DeadLetterQueue } from './events/DeadLetterQueue'\nimport type { EventBackend } from './events/EventBackend'\nimport type { EventOptions } from './events/EventOptions'\nimport { EventPriorityQueue } from './events/EventPriorityQueue'\nimport { ActionManager } from './hooks/ActionManager'\nimport { AsyncDetector } from './hooks/AsyncDetector'\nimport {\n createPersistentDLQHandler,\n requeueDLQBatch as dlqRequeueBatch,\n requeueDLQEntry as dlqRequeueEntry,\n requeuePersistentDLQBatch as persistentDlqRequeueBatch,\n requeuePersistentDLQEntry as persistentDlqRequeueEntry,\n} from './hooks/dlq-operations'\nimport { FilterManager } from './hooks/FilterManager'\nimport { MigrationWarner } from './hooks/MigrationWarner'\nimport { DeadLetterQueueManager } from './reliability/DeadLetterQueueManager'\n\n// 重新匯出所有 hook 相關型別,維持向後相容性\nexport type {\n ActionCallback,\n FilterCallback,\n HookManagerConfig,\n ListenerInfo,\n ListenerOptions,\n} from './hooks/types'\n\n// 導入類型供內部使用\nimport type {\n ActionCallback,\n FilterCallback,\n HookManagerConfig,\n ListenerInfo,\n ListenerOptions,\n} from './hooks/types'\n\n/**\n * Manager for WordPress-style hooks (actions and filters).\n *\n * 此為 facade 類別,將職責委派給專門的管理器:\n * - FilterManager:處理 filter hook 的登記與執行\n * - ActionManager:處理 action hook 的登記與執行\n * - AsyncDetector:非同步偵測快取\n * - MigrationWarner:遷移警告管理\n *\n * @public\n */\nexport class HookManager {\n private filterManager: FilterManager\n private actionManager: ActionManager\n private asyncDetector: AsyncDetector\n private migrationWarner: MigrationWarner\n\n private eventQueue: EventPriorityQueue\n private backend: EventBackend\n private dlq?: DeadLetterQueue\n private persistentDlqManager?: DeadLetterQueueManager\n private messageQueueBridge?: any\n private config: HookManagerConfig\n\n constructor(config: HookManagerConfig = {}) {\n this.config = {\n asyncByDefault: false,\n migrationMode: 'sync',\n showDeprecationWarnings: false,\n enableDLQ: true,\n enablePersistentDLQ: false,\n ...config,\n }\n this.eventQueue = new EventPriorityQueue(config.queue)\n this.backend = config.backend || this.eventQueue\n\n // 初始化專門管理器\n this.asyncDetector = new AsyncDetector()\n this.migrationWarner = new MigrationWarner()\n this.filterManager = new FilterManager()\n this.actionManager = new ActionManager(\n this.backend,\n this.config,\n this.asyncDetector,\n this.migrationWarner\n )\n\n // 初始化記憶體內 DLQ\n if (config.enableDLQ ?? true) {\n if (this.backend instanceof EventPriorityQueue) {\n this.dlq = new DeadLetterQueue()\n this.eventQueue.setDeadLetterQueue(this.dlq)\n }\n }\n\n // 若有啟用,初始化持久化 DLQ\n if (config.enablePersistentDLQ && config.db) {\n this.persistentDlqManager = new DeadLetterQueueManager(config.db)\n }\n\n // 若持久化 DLQ manager 存在,設定 EventPriorityQueue 的持久化 DLQ 處理器\n if (this.persistentDlqManager && this.backend instanceof EventPriorityQueue) {\n this.eventQueue.setPersistentDLQHandler(this.createPersistentDLQHandler())\n }\n\n // 初始化 Message Queue Bridge for distributed processing\n if (config.messageQueueBridge) {\n this.messageQueueBridge = config.messageQueueBridge\n }\n }\n\n // ========== Filter Methods(委派至 FilterManager)==========\n\n /**\n * Register a filter hook.\n *\n * Filters are used to transform a value (input/output) through a chain of\n * callbacks. Each callback must return the modified value.\n *\n * @template T - The type of value being filtered.\n * @param hook - The unique name of the hook.\n * @param callback - The callback function to execute.\n *\n * @example\n * ```typescript\n * core.hooks.addFilter('content', async (content: string) => {\n * return content.toUpperCase()\n * })\n * ```\n */\n addFilter<T = unknown>(hook: string, callback: FilterCallback<T>): void {\n this.filterManager.addFilter(hook, callback)\n }\n\n /**\n * Apply all registered filters sequentially.\n *\n * Each callback receives the previous callback's return value.\n *\n * @template T - The type of value being filtered.\n * @param hook - The name of the hook.\n * @param initialValue - The initial value to filter.\n * @param args - Additional arguments to pass to the callbacks.\n * @returns The final filtered value.\n *\n * @example\n * ```typescript\n * const content = await core.hooks.applyFilters('content', 'hello world')\n * ```\n */\n async applyFilters<T = unknown>(hook: string, initialValue: T, ...args: unknown[]): Promise<T> {\n return this.filterManager.applyFilters(hook, initialValue, ...args)\n }\n\n // ========== Action Methods(委派至 ActionManager)==========\n\n /**\n * Register an action hook.\n *\n * Actions are used to trigger side effects (e.g., logging, sending emails)\n * at specific points in the application lifecycle.\n *\n * @template TArgs - The type of arguments passed to the action.\n * @param hook - The unique name of the hook.\n * @param callback - The callback function to execute.\n * @param options - Optional listener options (type override, circuit breaker).\n *\n * @example\n * ```typescript\n * core.hooks.addAction('user_registered', async (user: User) => {\n * await sendWelcomeEmail(user)\n * })\n * ```\n */\n addAction<TArgs = unknown>(\n hook: string,\n callback: ActionCallback<TArgs>,\n options?: ListenerOptions\n ): void {\n this.actionManager.addAction(hook, callback, options)\n }\n\n /**\n * Run all registered actions.\n *\n * This method supports both synchronous and asynchronous dispatch based on configuration.\n * In hybrid mode, it auto-detects async listeners and uses async dispatch.\n *\n * 注意:dispatch 模式決策在此層級完成,以確保子類別(如 ObservableHookManager)\n * 可透過多型覆寫正確攔截 doActionSync / doActionAsync 的呼叫。\n *\n * @template TArgs - The type of arguments passed to the action.\n * @param hook - The name of the hook.\n * @param args - The arguments to pass to the callbacks.\n * @param options - Optional event options for async dispatch.\n *\n * @example\n * ```typescript\n * await core.hooks.doAction('user_registered', user)\n * ```\n */\n async doAction<TArgs = unknown>(\n hook: string,\n args: TArgs,\n options?: EventOptions\n ): Promise<void> {\n const mode = this.actionManager.resolveDispatchMode(hook, args, options)\n\n if (mode === 'async') {\n return this.doActionAsync(hook, args, options)\n }\n\n return this.doActionSync(hook, args)\n }\n\n /**\n * Run all registered actions synchronously (legacy mode).\n *\n * @template TArgs - The type of arguments passed to the action.\n * @param hook - The name of the hook.\n * @param args - The arguments to pass to the callbacks.\n */\n async doActionSync<TArgs = unknown>(hook: string, args: TArgs): Promise<void> {\n return this.actionManager.doActionSync(hook, args)\n }\n\n /**\n * Run all registered actions asynchronously via priority queue.\n *\n * @template TArgs - The type of arguments passed to the action.\n * @param hook - The name of the hook.\n * @param args - The arguments to pass to the callbacks.\n * @param options - Event options for async dispatch.\n *\n * @example\n * ```typescript\n * await core.hooks.doActionAsync('order:created', order, {\n * priority: 'high',\n * ordering: 'partition',\n * partitionKey: order.id,\n * timeout: 5000,\n * })\n * ```\n */\n async doActionAsync<TArgs = unknown>(\n hook: string,\n args: TArgs,\n options: EventOptions = {}\n ): Promise<void> {\n return this.actionManager.doActionAsync(hook, args, options)\n }\n\n // ========== Dispatch Mode Detection(委派至 ActionManager)==========\n\n /**\n * Determine the dispatch mode for an event.\n *\n * @param eventName - The name of the event\n * @param options - Optional event options\n * @returns The dispatch mode: 'sync' or 'async'\n * @public\n */\n detectMode(eventName: string, options?: EventOptions): 'sync' | 'async' {\n return this.actionManager.detectMode(eventName, options)\n }\n\n // ========== Async Detection(委派至 AsyncDetector)==========\n\n /**\n * Check if a callback is an async function (with caching).\n *\n * @param callback - The callback to check\n * @returns True if the callback is async\n * @public\n */\n isAsyncListener(callback: ActionCallback): boolean {\n return this.asyncDetector.isAsyncListener(callback)\n }\n\n /**\n * Runtime detection for functions that return Promises but aren't declared async.\n *\n * @param callback - The callback to check\n * @param testArgs - Arguments to pass to the callback for testing\n * @returns True if the callback returns a Promise\n * @public\n */\n async isAsyncListenerRuntime<TArgs = unknown>(\n callback: ActionCallback<TArgs>,\n testArgs: TArgs\n ): Promise<boolean> {\n return this.asyncDetector.isAsyncListenerRuntime(callback, testArgs)\n }\n\n /**\n * Get the size of the async detection cache (for testing/debugging).\n *\n * @returns Number of cached detection results\n * @public\n */\n getAsyncDetectionCacheSize(): number {\n return this.asyncDetector.getCacheSize()\n }\n\n /**\n * Clear the async detection cache.\n *\n * @public\n */\n clearAsyncDetectionCache(): void {\n this.asyncDetector.clearCache()\n }\n\n /**\n * Check if any listener for a hook is async (including type overrides).\n *\n * @param hook - Hook name\n * @returns True if any listener is async\n * @public\n */\n hasAsyncListeners(hook: string): boolean {\n return this.actionManager.hasAsyncListeners(hook)\n }\n\n /**\n * Get detailed information about all listeners for a hook.\n *\n * @param hook - Hook name\n * @returns Array of listener info objects\n * @public\n */\n getListenerInfo(hook: string): ListenerInfo[] {\n return this.actionManager.getListenerInfo(hook)\n }\n\n // ========== Queue Methods ==========\n\n /**\n * Get the current event queue depth.\n *\n * @returns Total number of events in the queue\n */\n getQueueDepth(): number {\n return this.eventQueue.getDepth()\n }\n\n /**\n * Get the event queue depth for a specific priority.\n *\n * @param priority - Priority level\n * @returns Number of events in the specified priority queue\n */\n getQueueDepthByPriority(priority: 'high' | 'normal' | 'low'): number {\n return this.eventQueue.getDepthByPriority(priority)\n }\n\n /**\n * Get the EventPriorityQueue instance.\n *\n * @returns EventPriorityQueue instance\n * @protected\n */\n protected getEventQueue(): EventPriorityQueue {\n return this.eventQueue\n }\n\n // ========== Listener Management ==========\n\n /**\n * Get all registered listeners for a hook.\n *\n * @param hook - Hook name\n * @returns Array of callbacks\n */\n getListeners(hook: string): ActionCallback[] {\n return this.actionManager.getListeners(hook)\n }\n\n /**\n * Remove all listeners for a specific action hook.\n *\n * @param hook - Hook name\n */\n removeAction(hook: string): void {\n this.actionManager.removeAction(hook)\n }\n\n // ========== Configuration ==========\n\n /**\n * Update HookManager configuration.\n *\n * @param config - New configuration\n */\n configure(config: Partial<HookManagerConfig>): void {\n this.config = {\n ...this.config,\n ...config,\n }\n this.actionManager.updateConfig(this.config)\n }\n\n /**\n * Get current configuration.\n *\n * @returns Current configuration\n */\n getConfig(): HookManagerConfig {\n return { ...this.config }\n }\n\n /**\n * Suppress migration warnings for a specific event.\n *\n * @param eventName - The name of the event to suppress warnings for\n * @public\n */\n suppressMigrationWarning(eventName: string): void {\n this.migrationWarner.suppress(eventName)\n }\n\n /**\n * Set the event backend for distributed processing.\n *\n * @param backend - Event backend instance\n */\n setBackend(backend: EventBackend): void {\n this.backend = backend\n this.actionManager.setBackend(backend)\n }\n\n // ========== Dead Letter Queue (In-Memory) ==========\n\n /**\n * Get the Dead Letter Queue instance.\n *\n * @returns Dead Letter Queue\n */\n getDLQ(): DeadLetterQueue | undefined {\n return this.dlq\n }\n\n /**\n * Requeue a failed event from the Dead Letter Queue.\n *\n * @param dlqEntryId - DLQ entry ID\n * @returns True if requeued successfully, false if entry not found\n */\n async requeueDLQEntry(dlqEntryId: string): Promise<boolean> {\n if (!this.dlq) {\n return false\n }\n return dlqRequeueEntry(dlqEntryId, this.dlq, (eventName, payload, options) =>\n this.doActionAsync(eventName, payload, options)\n )\n }\n\n /**\n * Requeue all failed events for a specific event name.\n *\n * @param eventName - Event name to requeue\n * @returns Number of events requeued\n */\n async requeueDLQBatch(eventName: string): Promise<number> {\n if (!this.dlq) {\n return 0\n }\n return dlqRequeueBatch(eventName, this.dlq, (entryId) => this.requeueDLQEntry(entryId))\n }\n\n /**\n * Get Dead Letter Queue entries with optional filtering.\n *\n * @param filter - Filter options\n * @returns Array of DLQ entries\n */\n getDLQEntries(filter: { eventName?: string; from?: number; to?: number; limit?: number } = {}) {\n if (!this.dlq) {\n return []\n }\n return this.dlq.list(filter)\n }\n\n /**\n * Get count of Dead Letter Queue entries for an event.\n *\n * @param eventName - Event name\n * @returns Count of entries\n */\n getDLQCount(eventName: string): number {\n if (!this.dlq) {\n return 0\n }\n return this.dlq.getCountByEvent(eventName)\n }\n\n /**\n * Delete a DLQ entry.\n *\n * @param entryId - DLQ entry ID\n * @returns True if deleted, false if not found\n */\n deleteDLQEntry(entryId: string): boolean {\n if (!this.dlq) {\n return false\n }\n return this.dlq.delete(entryId)\n }\n\n // ========== Circuit Breaker ==========\n\n /**\n * Get circuit breaker statistics for all events.\n *\n * @returns Array of circuit breaker statistics\n */\n getCircuitBreakerStats(): Array<{\n eventName: string\n state: string\n failureCount: number\n successCount: number\n lastFailureAt?: Date\n lastSuccessAt?: Date\n openedAt?: Date\n totalRequests: number\n totalFailures: number\n totalSuccesses: number\n }> {\n if (!(this.backend instanceof EventPriorityQueue)) {\n return []\n }\n\n const breakers = this.backend.getCircuitBreakers()\n const stats: Array<{\n eventName: string\n state: string\n failureCount: number\n successCount: number\n lastFailureAt?: Date\n lastSuccessAt?: Date\n openedAt?: Date\n totalRequests: number\n totalFailures: number\n totalSuccesses: number\n }> = []\n\n for (const [eventName, breaker] of breakers) {\n const metrics = breaker.getMetrics()\n stats.push({\n eventName,\n state: metrics.state,\n failureCount: metrics.failures,\n successCount: metrics.successes,\n lastFailureAt: metrics.lastFailureAt,\n lastSuccessAt: metrics.lastSuccessAt,\n openedAt: metrics.openedAt,\n totalRequests: metrics.totalRequests,\n totalFailures: metrics.totalFailures,\n totalSuccesses: metrics.totalSuccesses,\n })\n }\n\n return stats\n }\n\n /**\n * Reset a circuit breaker for an event.\n *\n * @param eventName - Event name\n * @returns True if reset, false if circuit breaker not found\n */\n resetCircuitBreaker(eventName: string): boolean {\n if (!(this.backend instanceof EventPriorityQueue)) {\n return false\n }\n\n return this.backend.resetCircuitBreaker(eventName)\n }\n\n // ========== Backpressure ==========\n\n /**\n * Get the current backpressure state.\n *\n * @returns Backpressure state ('NORMAL', 'WARNING', 'CRITICAL', 'OVERFLOW') or undefined if not enabled\n */\n getBackpressureState(): string | undefined {\n if (!(this.backend instanceof EventPriorityQueue)) {\n return undefined\n }\n\n const manager = this.backend.getBackpressureManager()\n return manager ? manager.getState() : undefined\n }\n\n /**\n * Get backpressure metrics snapshot.\n *\n * @returns Backpressure metrics snapshot or undefined if not enabled\n */\n getBackpressureMetrics(): object | undefined {\n if (!(this.backend instanceof EventPriorityQueue)) {\n return undefined\n }\n\n const manager = this.backend.getBackpressureManager()\n return manager ? manager.getMetrics() : undefined\n }\n\n // ========== Persistent DLQ ==========\n\n /**\n * Get the persistent DLQ manager instance.\n *\n * @returns DeadLetterQueueManager or undefined if not configured\n * @public\n */\n getPersistentDLQManager(): DeadLetterQueueManager | undefined {\n return this.persistentDlqManager\n }\n\n /**\n * Create a handler function for persistent DLQ.\n * This handler is used by EventPriorityQueue to persist failed events.\n *\n * @returns Handler function\n * @internal\n */\n private createPersistentDLQHandler() {\n if (!this.persistentDlqManager) {\n throw new Error('[HookManager] persistentDlqManager is not initialized')\n }\n return createPersistentDLQHandler(this.persistentDlqManager)\n }\n\n /**\n * Requeue a failed event from the persistent DLQ.\n *\n * @param dlqId - DLQ entry UUID\n * @returns True if requeued successfully\n * @public\n */\n async requeuePersistentDLQEntry(dlqId: string): Promise<boolean> {\n if (!this.persistentDlqManager) {\n return false\n }\n return persistentDlqRequeueEntry(dlqId, this.persistentDlqManager, (event, args, options) =>\n this.doActionAsync(event, args, options)\n )\n }\n\n /**\n * Requeue multiple events from persistent DLQ.\n *\n * @param filter - Filter criteria\n * @returns Result statistics\n * @public\n */\n async requeuePersistentDLQBatch(filter?: {\n eventName?: string\n status?: 'pending' | 'requeued' | 'resolved' | 'abandoned'\n }): Promise<{ total: number; succeeded: number; failed: number }> {\n if (!this.persistentDlqManager) {\n return { total: 0, succeeded: 0, failed: 0 }\n }\n return persistentDlqRequeueBatch(filter, this.persistentDlqManager)\n }\n\n // ========== Message Queue Bridge(分佈式處理)==========\n\n /**\n * Dispatch an event through Bull Queue(分佈式異步處理).\n *\n * 與 doActionAsync() 不同:\n * - doActionAsync() 使用 EventPriorityQueue (Memory-based)\n * - dispatchQueued() 使用 Bull Queue (Redis-backed, 分佈式)\n *\n * 適用於需要持久化和跨進程處理的事件。\n *\n * @template TArgs - 事件參數類型\n * @param event - 事件名稱\n * @param args - 事件參數\n * @param options - 事件選項(可選)\n * @returns Job ID\n * @throws 如果未配置 MessageQueueBridge 或沒有 listeners\n *\n * @example\n * ```typescript\n * const jobId = await hookManager.dispatchQueued('order:created', {\n * orderId: 'ORD-123',\n * amount: 999.99\n * })\n * ```\n *\n * @public\n */\n async dispatchQueued<TArgs = unknown>(\n event: string,\n args: TArgs,\n options?: any\n ): Promise<string> {\n if (!this.messageQueueBridge) {\n throw new Error(\n '[HookManager] MessageQueueBridge not configured. Set messageQueueBridge in HookManagerConfig to use dispatchQueued().'\n )\n }\n\n return this.messageQueueBridge.dispatchWithQueue(event, args, options)\n }\n\n /**\n * Dispatch an event through Bull Queue with delay(延遲隊列分發).\n *\n * @template TArgs - 事件參數類型\n * @param event - 事件名稱\n * @param args - 事件參數\n * @param delay - 延遲時間(毫秒)\n * @param options - 事件選項(可選)\n * @returns Job ID\n * @throws 如果未配置 MessageQueueBridge\n *\n * @example\n * ```typescript\n * // 延遲 5 秒後處理\n * const jobId = await hookManager.dispatchDeferredQueued(\n * 'reminder:send',\n * { userId: '123' },\n * 5000\n * )\n * ```\n *\n * @public\n */\n async dispatchDeferredQueued<TArgs = unknown>(\n event: string,\n args: TArgs,\n delay: number,\n options?: any\n ): Promise<string> {\n if (!this.messageQueueBridge) {\n throw new Error(\n '[HookManager] MessageQueueBridge not configured. Set messageQueueBridge in HookManagerConfig to use dispatchDeferredQueued().'\n )\n }\n\n // 將延遲時間添加到 options\n const mergedOptions = {\n ...options,\n delay,\n }\n\n return this.messageQueueBridge.dispatchWithQueue(event, args, mergedOptions)\n }\n\n /**\n * Get the execution status of an event.\n *\n * 查詢事件執行狀態,支持查詢 Bull Queue 和 DLQ 中的事件。\n *\n * @param eventId - 事件 ID (task.id 或 jobId)\n * @returns 事件狀態信息\n * @throws 如果未配置 MessageQueueBridge\n *\n * @public\n */\n async getEventStatus(eventId: string): Promise<any> {\n if (!this.messageQueueBridge) {\n throw new Error(\n '[HookManager] MessageQueueBridge not configured. Set messageQueueBridge in HookManagerConfig to use getEventStatus().'\n )\n }\n\n return this.messageQueueBridge.getEventStatus(eventId)\n }\n\n /**\n * Get persistent DLQ statistics.\n *\n * @returns Statistics object with total, byEvent, and byStatus counts\n * @public\n */\n async getPersistentDLQStats() {\n if (!this.persistentDlqManager) {\n return undefined\n }\n\n try {\n return await this.persistentDlqManager.getStats()\n } catch (error) {\n console.error(`[HookManager] Error getting persistent DLQ stats:`, error)\n return undefined\n }\n }\n}\n",
120
- "/**\n * @gravito/core - Event System Metrics\n *\n * Manages metric collection for event dispatch and listener execution.\n */\n\nimport type { EventMetricCounter, EventMetricGauge, EventMetricHistogram } from './metrics-types'\n\n/**\n * Event metrics collector for monitoring and observability.\n *\n * Collects 6 core metrics:\n * - Event dispatch latency (Histogram)\n * - Listener execution time (Histogram)\n * - Queue depth by priority (Gauge)\n * - Failure count by error type (Counter)\n * - Timeout count (Counter)\n * - Processed event count by status (Counter)\n *\n * @public\n */\nexport class EventMetrics {\n private dispatchLatency: EventMetricHistogram\n private listenerExecutionTime: EventMetricHistogram\n private queueDepthGauge: EventMetricGauge\n private failureCounter: EventMetricCounter\n private timeoutCounter: EventMetricCounter\n private processedCounter: EventMetricCounter\n\n // CircuitBreaker metrics\n private circuitBreakerStateGauge: EventMetricGauge\n private circuitBreakerTransitionsCounter: EventMetricCounter\n private circuitBreakerFailuresCounter: EventMetricCounter\n private circuitBreakerSuccessesCounter: EventMetricCounter\n private circuitBreakerOpenDurationHistogram: EventMetricHistogram\n\n /**\n * Create a new EventMetrics instance.\n *\n * @param registry - MetricsRegistry from @gravito/monitor\n * @param prefix - Metric name prefix (default: 'gravito_event_')\n */\n constructor(\n registry: any, // MetricsRegistry type\n prefix = 'gravito_event_'\n ) {\n // Initialize histogram for event dispatch latency\n this.dispatchLatency = registry.histogram({\n name: `${prefix}dispatch_latency_seconds`,\n help: 'Event dispatch latency in seconds',\n labels: ['event_name', 'priority'],\n buckets: [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1, 2, 5],\n })\n\n // Initialize histogram for listener execution time\n this.listenerExecutionTime = registry.histogram({\n name: `${prefix}listener_execution_seconds`,\n help: 'Listener execution time in seconds',\n labels: ['event_name', 'listener_index'],\n buckets: [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1, 2, 5],\n })\n\n // Initialize gauge for queue depth\n this.queueDepthGauge = registry.gauge({\n name: `${prefix}queue_depth`,\n help: 'Current queue depth by priority',\n labels: ['priority'],\n })\n\n // Initialize counter for failures\n this.failureCounter = registry.counter({\n name: `${prefix}failures_total`,\n help: 'Total number of failed event processing',\n labels: ['event_name', 'error_type'],\n })\n\n // Initialize counter for timeouts\n this.timeoutCounter = registry.counter({\n name: `${prefix}timeouts_total`,\n help: 'Total number of event processing timeouts',\n labels: ['event_name'],\n })\n\n // Initialize counter for processed events\n this.processedCounter = registry.counter({\n name: `${prefix}processed_total`,\n help: 'Total number of processed events',\n labels: ['event_name', 'status'],\n })\n\n // Initialize CircuitBreaker metrics\n this.circuitBreakerStateGauge = registry.gauge({\n name: `${prefix}circuit_breaker_state`,\n help: 'Current circuit breaker state (0=CLOSED, 1=HALF_OPEN, 2=OPEN)',\n labels: ['event_name'],\n })\n\n this.circuitBreakerTransitionsCounter = registry.counter({\n name: `${prefix}circuit_breaker_transitions_total`,\n help: 'Total number of circuit breaker state transitions',\n labels: ['event_name', 'from_state', 'to_state'],\n })\n\n this.circuitBreakerFailuresCounter = registry.counter({\n name: `${prefix}circuit_breaker_failures_total`,\n help: 'Total number of failures tracked by circuit breaker',\n labels: ['event_name'],\n })\n\n this.circuitBreakerSuccessesCounter = registry.counter({\n name: `${prefix}circuit_breaker_successes_total`,\n help: 'Total number of successes tracked by circuit breaker',\n labels: ['event_name'],\n })\n\n this.circuitBreakerOpenDurationHistogram = registry.histogram({\n name: `${prefix}circuit_breaker_open_duration_seconds`,\n help: 'Duration of circuit breaker OPEN state in seconds',\n labels: ['event_name'],\n buckets: [1, 5, 10, 30, 60, 120, 300],\n })\n }\n\n /**\n * Record event dispatch latency.\n *\n * @param eventName - Name of the event\n * @param priority - Priority level (high, normal, low)\n * @param seconds - Duration in seconds\n */\n recordDispatchLatency(eventName: string, priority: string, seconds: number): void {\n this.dispatchLatency.observe(seconds, {\n event_name: eventName,\n priority,\n })\n }\n\n /**\n * Record listener execution time.\n *\n * @param eventName - Name of the event\n * @param index - Index of the listener in the callback list\n * @param seconds - Duration in seconds\n */\n recordListenerExecution(eventName: string, index: number, seconds: number): void {\n this.listenerExecutionTime.observe(seconds, {\n event_name: eventName,\n listener_index: String(index),\n })\n }\n\n /**\n * Update queue depth gauge for a specific priority.\n *\n * @param priority - Priority level (high, normal, low)\n * @param depth - Current queue depth\n */\n updateQueueDepth(priority: string, depth: number): void {\n this.queueDepthGauge.set(depth, {\n priority,\n })\n }\n\n /**\n * Record event processing failure.\n *\n * @param eventName - Name of the event\n * @param errorType - Type of error (e.g., 'TypeError', 'TimeoutError')\n */\n recordFailure(eventName: string, errorType: string): void {\n this.failureCounter.inc({\n event_name: eventName,\n error_type: errorType,\n })\n }\n\n /**\n * Record event processing timeout.\n *\n * @param eventName - Name of the event\n */\n recordTimeout(eventName: string): void {\n this.timeoutCounter.inc({\n event_name: eventName,\n })\n }\n\n /**\n * Record processed event (success or failure).\n *\n * @param eventName - Name of the event\n * @param status - Processing status ('success' or 'failure')\n */\n recordProcessed(eventName: string, status: 'success' | 'failure'): void {\n this.processedCounter.inc({\n event_name: eventName,\n status,\n })\n }\n\n /**\n * Get reference to dispatch latency histogram.\n * @internal\n */\n getDispatchLatencyHistogram(): EventMetricHistogram {\n return this.dispatchLatency\n }\n\n /**\n * Get reference to listener execution time histogram.\n * @internal\n */\n getListenerExecutionHistogram(): EventMetricHistogram {\n return this.listenerExecutionTime\n }\n\n /**\n * Get reference to queue depth gauge.\n * @internal\n */\n getQueueDepthGauge(): EventMetricGauge {\n return this.queueDepthGauge\n }\n\n /**\n * Record circuit breaker state change.\n *\n * @param eventName - Name of the event\n * @param state - Circuit breaker state (0=CLOSED, 1=HALF_OPEN, 2=OPEN)\n */\n recordCircuitBreakerState(eventName: string, state: number): void {\n this.circuitBreakerStateGauge.set(state, {\n event_name: eventName,\n })\n }\n\n /**\n * Record circuit breaker state transition.\n *\n * @param eventName - Name of the event\n * @param fromState - Previous state\n * @param toState - New state\n */\n recordCircuitBreakerTransition(eventName: string, fromState: string, toState: string): void {\n this.circuitBreakerTransitionsCounter.inc({\n event_name: eventName,\n from_state: fromState,\n to_state: toState,\n })\n }\n\n /**\n * Record circuit breaker failure.\n *\n * @param eventName - Name of the event\n */\n recordCircuitBreakerFailure(eventName: string): void {\n this.circuitBreakerFailuresCounter.inc({\n event_name: eventName,\n })\n }\n\n /**\n * Record circuit breaker success.\n *\n * @param eventName - Name of the event\n */\n recordCircuitBreakerSuccess(eventName: string): void {\n this.circuitBreakerSuccessesCounter.inc({\n event_name: eventName,\n })\n }\n\n /**\n * Record circuit breaker OPEN duration.\n *\n * @param eventName - Name of the event\n * @param seconds - Duration in seconds\n */\n recordCircuitBreakerOpenDuration(eventName: string, seconds: number): void {\n this.circuitBreakerOpenDurationHistogram.observe(seconds, {\n event_name: eventName,\n })\n }\n}\n",
121
- "/**\n * @gravito/core - Event System Tracer\n *\n * Manages OpenTelemetry distributed tracing for event dispatch.\n */\n\nimport type { Span, Tracer } from '@opentelemetry/api'\nimport { trace } from '@opentelemetry/api'\n\n/**\n * Event tracer for distributed tracing support.\n *\n * Integrates with OpenTelemetry to provide:\n * - Event dispatch tracing\n * - Listener execution tracing\n * - Error recording\n * - Span hierarchy\n *\n * @public\n */\nexport class EventTracer {\n private tracer: Tracer\n\n /**\n * Create a new EventTracer instance.\n *\n * @param tracerName - Name of the tracer (default: '@gravito/core')\n */\n constructor(tracerName = '@gravito/core') {\n this.tracer = trace.getTracer(tracerName)\n }\n\n /**\n * Start a span for event dispatch.\n *\n * @param eventName - Name of the event\n * @param callbackCount - Number of callbacks registered for this event\n * @param priority - Priority level (high, normal, low)\n * @returns Span for the event dispatch\n */\n startDispatchSpan(eventName: string, callbackCount: number, priority: string): Span {\n return this.tracer.startSpan(`event.dispatch.${eventName}`, {\n attributes: {\n 'event.name': eventName,\n 'event.priority': priority,\n 'event.listener_count': callbackCount,\n },\n })\n }\n\n /**\n * Start a span for listener execution.\n *\n * @param _parentSpan - Parent span for this listener\n * @param eventName - Name of the event\n * @param listenerIndex - Index of the listener in the callback list\n * @returns Child span for the listener execution\n */\n startListenerSpan(_parentSpan: Span, eventName: string, listenerIndex: number): Span {\n return this.tracer.startSpan(`event.listener.${eventName}`, {\n attributes: {\n 'event.name': eventName,\n 'event.listener_index': listenerIndex,\n },\n })\n }\n\n /**\n * Record an error in the span.\n *\n * @param span - Span to record error in\n * @param error - Error that occurred\n */\n recordError(span: Span, error: Error): void {\n span.recordException(error)\n span.setStatus({ code: 2 }) // ERROR status code\n }\n\n /**\n * End a span with a specific status.\n *\n * @param span - Span to end\n * @param status - Status ('ok' or 'error')\n */\n endSpan(span: Span, status: 'ok' | 'error' = 'ok'): void {\n if (status === 'ok') {\n span.setStatus({ code: 0 }) // OK status code\n }\n span.end()\n }\n\n /**\n * Create a timer span for measuring duration.\n *\n * @param eventName - Name of the event\n * @returns Object with span and duration recording function\n */\n startTimer(eventName: string): { span: Span; endTimer: (status?: 'ok' | 'error') => void } {\n const span = this.tracer.startSpan(`event.duration.${eventName}`)\n const startTime = performance.now()\n\n return {\n span,\n endTimer: (status?: 'ok' | 'error') => {\n const duration = (performance.now() - startTime) / 1000\n span.setAttributes({\n 'event.duration_seconds': duration,\n })\n this.endSpan(span, status)\n },\n }\n }\n}\n",
122
- "/**\n * @gravito/core - Event System Tracing\n *\n * 使用 OpenTelemetry API 實現事件系統的分佈式追蹤。\n * 提供事件派發、監聽器執行與隊列操作的端到端追蹤。\n */\n\nimport type { Span } from '@opentelemetry/api'\nimport { SpanStatusCode, trace } from '@opentelemetry/api'\n\n/**\n * 事件追蹤配置\n */\nexport interface EventTracingConfig {\n /** Tracer 名稱 */\n tracerName?: string\n /** 是否記錄詳細的 payload 信息 */\n capturePayload?: boolean\n /** 最大 payload 大小(字節) */\n maxPayloadSize?: number\n}\n\nconst DEFAULTS = {\n tracerName: '@gravito/core/events',\n capturePayload: false,\n maxPayloadSize: 1024, // 1KB\n}\n\n/**\n * 事件追蹤管理器\n *\n * 提供事件系統的分佈式追蹤能力,包括:\n * - 事件派發追蹤\n * - 監聽器執行追蹤\n * - 隊列操作追蹤\n * - 異常記錄與追蹤\n *\n * @public\n */\nexport class EventTracing {\n private tracer = trace.getTracer(DEFAULTS.tracerName)\n private config: Required<EventTracingConfig>\n\n constructor(config: EventTracingConfig = {}) {\n this.tracer = trace.getTracer(config.tracerName ?? DEFAULTS.tracerName)\n this.config = {\n tracerName: config.tracerName ?? DEFAULTS.tracerName,\n capturePayload: config.capturePayload ?? DEFAULTS.capturePayload,\n maxPayloadSize: config.maxPayloadSize ?? DEFAULTS.maxPayloadSize,\n }\n }\n\n /**\n * 為事件派發創建追蹤 Span\n *\n * @param eventName - 事件名稱\n * @param listenerCount - 監聽器數量\n * @param priority - 優先級(high, normal, low)\n * @param payload - 事件負載(可選,用於調試)\n * @returns Span 實例\n *\n * @example\n * ```typescript\n * const tracer = new EventTracing()\n * const span = tracer.startDispatchSpan('order:created', 3, 'high', orderData)\n * try {\n * // 派發事件\n * await dispatchEvent()\n * tracer.endDispatchSpan(span, 'ok')\n * } catch (error) {\n * tracer.endDispatchSpan(span, 'error', error)\n * }\n * ```\n */\n startDispatchSpan(\n eventName: string,\n listenerCount: number,\n priority: 'high' | 'normal' | 'low' = 'normal',\n payload?: unknown\n ): Span {\n const attributes: Record<string, string | number | boolean> = {\n 'event.name': eventName,\n 'event.priority': priority,\n 'event.listeners': listenerCount,\n 'event.timestamp': Date.now(),\n }\n\n // 如果啟用 payload 捕獲,添加 payload 信息\n if (this.config.capturePayload && payload) {\n const payloadStr = JSON.stringify(payload)\n if (payloadStr.length <= this.config.maxPayloadSize) {\n attributes['event.payload_size'] = payloadStr.length\n attributes['event.payload'] = payloadStr.substring(0, this.config.maxPayloadSize)\n } else {\n attributes['event.payload_size'] = payloadStr.length\n attributes['event.payload_truncated'] = true\n }\n }\n\n const span = this.tracer.startSpan(`event.dispatch.${eventName}`, {\n attributes,\n })\n\n // 添加開始事件\n span.addEvent('event.dispatch.start')\n\n return span\n }\n\n /**\n * 為監聽器執行創建追蹤 Span\n *\n * @param _parentSpan - 父 Span\n * @param eventName - 事件名稱\n * @param listenerName - 監聽器名稱/標識\n * @param listenerIndex - 監聽器索引\n * @returns 子 Span 實例\n */\n startListenerSpan(\n _parentSpan: Span,\n eventName: string,\n listenerName: string,\n listenerIndex: number\n ): Span {\n const span = this.tracer.startSpan(`listener.execute.${eventName}`, {\n attributes: {\n 'event.name': eventName,\n 'listener.name': listenerName,\n 'listener.index': listenerIndex,\n 'listener.start_time': Date.now(),\n },\n })\n\n span.addEvent('listener.execute.start')\n\n return span\n }\n\n /**\n * 為隊列操作創建追蹤 Span\n *\n * @param _parentSpan - 父 Span\n * @param operationType - 操作類型(enqueue, dequeue, requeue)\n * @param eventName - 事件名稱\n * @param priority - 優先級\n * @returns Span 實例\n */\n startQueueOperationSpan(\n _parentSpan: Span,\n operationType: 'enqueue' | 'dequeue' | 'requeue',\n eventName: string,\n priority: 'high' | 'normal' | 'low'\n ): Span {\n const span = this.tracer.startSpan(`queue.${operationType}`, {\n attributes: {\n 'event.name': eventName,\n 'queue.operation': operationType,\n 'queue.priority': priority,\n 'queue.timestamp': Date.now(),\n },\n })\n\n return span\n }\n\n /**\n * 結束事件派發 Span\n *\n * @param span - Span 實例\n * @param status - 完成狀態(ok, error)\n * @param error - 如果 status 為 error,傳遞錯誤對象\n */\n endDispatchSpan(span: Span, status: 'ok' | 'error' = 'ok', error?: Error): void {\n if (status === 'ok') {\n span.setStatus({ code: SpanStatusCode.OK })\n span.addEvent('event.dispatch.success')\n } else {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error?.message || 'Event dispatch failed',\n })\n if (error) {\n span.recordException(error)\n }\n span.addEvent('event.dispatch.error')\n }\n\n span.end()\n }\n\n /**\n * 結束監聽器執行 Span\n *\n * @param span - Span 實例\n * @param status - 完成狀態(ok, error)\n * @param duration - 執行時間(毫秒)\n * @param error - 如果發生錯誤,傳遞錯誤對象\n */\n endListenerSpan(\n span: Span,\n status: 'ok' | 'error' = 'ok',\n duration?: number,\n error?: Error\n ): void {\n if (duration !== undefined) {\n span.setAttributes({\n 'listener.duration_ms': duration,\n 'listener.duration_seconds': duration / 1000,\n })\n }\n\n if (status === 'ok') {\n span.setStatus({ code: SpanStatusCode.OK })\n span.addEvent('listener.execute.success')\n } else {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error?.message || 'Listener execution failed',\n })\n if (error) {\n span.recordException(error)\n }\n span.addEvent('listener.execute.error')\n }\n\n span.end()\n }\n\n /**\n * 結束隊列操作 Span\n *\n * @param span - Span 實例\n * @param status - 完成狀態(ok, error)\n * @param queueDepth - 當前隊列深度\n * @param error - 如果發生錯誤,傳遞錯誤對象\n */\n endQueueOperationSpan(\n span: Span,\n status: 'ok' | 'error' = 'ok',\n queueDepth?: number,\n error?: Error\n ): void {\n if (queueDepth !== undefined) {\n span.setAttributes({\n 'queue.depth': queueDepth,\n })\n }\n\n if (status === 'ok') {\n span.setStatus({ code: SpanStatusCode.OK })\n span.addEvent('queue.operation.success')\n } else {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error?.message || 'Queue operation failed',\n })\n if (error) {\n span.recordException(error)\n }\n span.addEvent('queue.operation.error')\n }\n\n span.end()\n }\n\n /**\n * 在 Span 中添加自定義屬性\n *\n * @param span - Span 實例\n * @param attributes - 屬性對象\n */\n addSpanAttributes(span: Span, attributes: Record<string, string | number | boolean>): void {\n span.setAttributes(attributes)\n }\n\n /**\n * 在 Span 中添加自定義事件\n *\n * @param span - Span 實例\n * @param eventName - 事件名稱\n * @param attributes - 事件屬性(可選)\n */\n addSpanEvent(\n span: Span,\n eventName: string,\n attributes?: Record<string, string | number | boolean>\n ): void {\n span.addEvent(eventName)\n if (attributes) {\n span.setAttributes(attributes)\n }\n }\n\n /**\n * 記錄異常到 Span\n *\n * @param span - Span 實例\n * @param error - 錯誤對象\n */\n recordException(span: Span, error: Error | string): void {\n if (typeof error === 'string') {\n span.recordException(new Error(error))\n } else {\n span.recordException(error)\n }\n }\n\n /**\n * 創建定時器 Span(用於測量操作時間)\n *\n * @param operationName - 操作名稱\n * @returns 對象包含 span 和結束函數\n *\n * @example\n * ```typescript\n * const { span, endTimer } = tracer.startTimer('slow-operation')\n * try {\n * await slowOperation()\n * endTimer('ok')\n * } catch (error) {\n * endTimer('error', error)\n * }\n * ```\n */\n startTimer(operationName: string): {\n span: Span\n endTimer: (status?: 'ok' | 'error', error?: Error) => void\n } {\n const startTime = performance.now()\n const span = this.tracer.startSpan(`operation.${operationName}`, {\n attributes: {\n 'operation.name': operationName,\n 'operation.start_time': startTime,\n },\n })\n\n return {\n span,\n endTimer: (status: 'ok' | 'error' = 'ok', error?: Error) => {\n const duration = performance.now() - startTime\n\n if (status === 'ok') {\n span.setStatus({ code: SpanStatusCode.OK })\n span.setAttributes({\n 'operation.duration_ms': duration,\n 'operation.duration_seconds': duration / 1000,\n })\n span.addEvent('operation.complete')\n } else {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error?.message || 'Operation failed',\n })\n if (error) {\n span.recordException(error)\n }\n span.setAttributes({\n 'operation.duration_ms': duration,\n })\n span.addEvent('operation.error')\n }\n\n span.end()\n },\n }\n }\n\n /**\n * 獲取 tracer 實例(用於高級用法)\n *\n * @returns OpenTelemetry Tracer 實例\n */\n getTracer() {\n return this.tracer\n }\n}\n\n/**\n * 創建全局 EventTracing 實例\n */\nlet globalEventTracing: EventTracing | null = null\n\n/**\n * 獲取或創建全局 EventTracing 實例\n *\n * @param config - 配置選項\n * @returns EventTracing 實例\n *\n * @public\n */\nexport function getEventTracing(config?: EventTracingConfig): EventTracing {\n if (!globalEventTracing) {\n globalEventTracing = new EventTracing(config)\n }\n return globalEventTracing\n}\n",
123
- "/**\n * @gravito/core - Observable Hook Manager\n *\n * Wraps HookManager with observability support (metrics and tracing).\n */\n\nimport { HookManager, type HookManagerConfig } from '../../HookManager'\nimport type { EventOptions } from '../EventOptions'\nimport { EventMetrics } from './EventMetrics'\nimport { EventTracer } from './EventTracer'\nimport { EventTracing } from './EventTracing'\n\n/**\n * Configuration for observability features.\n * @public\n */\nexport interface ObservabilityConfig {\n /**\n * Enable observability features.\n * @default false\n */\n enabled?: boolean\n\n /**\n * MetricsRegistry instance from @gravito/monitor.\n * Required if metrics collection is enabled.\n */\n metrics?: any\n\n /**\n * Enable OpenTelemetry distributed tracing.\n * @default false\n */\n tracing?: boolean\n\n /**\n * Prefix for metric names.\n * @default 'gravito_event_'\n */\n metricsPrefix?: string\n}\n\n/**\n * Observable Hook Manager - extends HookManager with observability.\n *\n * Provides metrics and distributed tracing for event dispatch and listener execution.\n * Maintains 100% backward compatibility with HookManager.\n *\n * @public\n */\nexport class ObservableHookManager extends HookManager {\n private eventMetrics?: EventMetrics\n private eventTracer?: EventTracer\n private eventTracing?: EventTracing\n private obsConfig: ObservabilityConfig\n\n /**\n * Create a new ObservableHookManager instance.\n *\n * @param config - HookManager configuration\n * @param obsConfig - Observability configuration\n */\n constructor(config: HookManagerConfig = {}, obsConfig: ObservabilityConfig = {}) {\n super(config)\n this.obsConfig = obsConfig\n\n // Initialize metrics if enabled and registry is provided\n if (obsConfig.enabled && obsConfig.metrics) {\n this.eventMetrics = new EventMetrics(obsConfig.metrics, obsConfig.metricsPrefix)\n\n // Set EventMetrics on the event queue so circuit breakers can record metrics\n this.getEventQueue().setEventMetrics(this.eventMetrics)\n }\n\n // Initialize tracer if enabled\n if (obsConfig.enabled && obsConfig.tracing) {\n this.eventTracer = new EventTracer()\n this.eventTracing = new EventTracing()\n\n // Set EventTracing on the event queue so it can create listener spans\n this.getEventQueue().setEventTracing(this.eventTracing)\n }\n }\n\n /**\n * Run all registered actions asynchronously via priority queue with observability.\n *\n * This override adds metrics and tracing to the base implementation.\n *\n * @template TArgs - The type of arguments passed to the action.\n * @param hook - The name of the hook.\n * @param args - The arguments to pass to the callbacks.\n * @param options - Event options for async dispatch.\n */\n async doActionAsync<TArgs = unknown>(\n hook: string,\n args: TArgs,\n options: EventOptions = {}\n ): Promise<void> {\n // If observability is disabled, use parent implementation directly\n if (!this.obsConfig.enabled) {\n return super.doActionAsync(hook, args, options)\n }\n\n const startTime = performance.now()\n const priority = options.priority || 'normal'\n const callbacks = this.getListeners(hook)\n\n // Create dispatch span using EventTracing (preferred) or EventTracer (fallback)\n let span: any\n if (this.eventTracing) {\n span = this.eventTracing.startDispatchSpan(\n hook,\n callbacks.length,\n priority as 'high' | 'normal' | 'low'\n )\n // Set the dispatch span on the queue for child span creation\n this.getEventQueue().setCurrentDispatchSpan(span)\n } else if (this.eventTracer) {\n span = this.eventTracer.startDispatchSpan(hook, callbacks.length, priority)\n }\n\n try {\n // Call parent implementation\n await super.doActionAsync(hook, args, options)\n\n // Record metrics for successful dispatch\n if (this.eventMetrics) {\n const duration = (performance.now() - startTime) / 1000\n this.eventMetrics.recordDispatchLatency(hook, priority, duration)\n this.eventMetrics.recordProcessed(hook, 'success')\n\n // Update queue depth for this priority\n const queueDepth = this.getQueueDepthByPriority(priority as 'high' | 'normal' | 'low')\n this.eventMetrics.updateQueueDepth(priority, queueDepth)\n }\n\n // Set span status to OK\n if (span && this.eventTracing) {\n this.eventTracing.endDispatchSpan(span, 'ok')\n } else if (span && this.eventTracer) {\n this.eventTracer.endSpan(span, 'ok')\n }\n } catch (error) {\n // Record metrics for failed dispatch\n if (this.eventMetrics) {\n const errorName = error instanceof Error ? error.constructor.name : 'Unknown'\n this.eventMetrics.recordFailure(hook, errorName)\n this.eventMetrics.recordProcessed(hook, 'failure')\n }\n\n // Record error in span\n if (span && this.eventTracing && error instanceof Error) {\n this.eventTracing.endDispatchSpan(span, 'error', error)\n } else if (span && this.eventTracer && error instanceof Error) {\n this.eventTracer.recordError(span, error)\n this.eventTracer.endSpan(span, 'error')\n }\n\n throw error\n } finally {\n // Clear the dispatch span from the queue\n if (this.eventTracing) {\n this.getEventQueue().setCurrentDispatchSpan(undefined)\n }\n }\n }\n\n /**\n * Run all registered actions synchronously with observability.\n *\n * This override adds metrics and tracing to the base implementation.\n *\n * @template TArgs - The type of arguments passed to the action.\n * @param hook - The name of the hook.\n * @param args - The arguments to pass to the callbacks.\n */\n async doActionSync<TArgs = unknown>(hook: string, args: TArgs): Promise<void> {\n // If observability is disabled, use parent implementation directly\n if (!this.obsConfig.enabled) {\n return super.doActionSync(hook, args)\n }\n\n const startTime = performance.now()\n const callbacks = this.getListeners(hook)\n\n // Create dispatch span using EventTracing (preferred) or EventTracer (fallback)\n let span: any\n if (this.eventTracing) {\n span = this.eventTracing.startDispatchSpan(hook, callbacks.length, 'normal')\n // Add sync dispatch mode attribute\n span.setAttributes({ 'event.dispatch_mode': 'sync' })\n } else if (this.eventTracer) {\n span = this.eventTracer.startDispatchSpan(hook, callbacks.length, 'normal')\n }\n\n let hasError = false\n let lastError: Error | undefined\n\n try {\n // Call parent implementation\n await super.doActionSync(hook, args)\n } catch (error) {\n // Note: doActionSync catches errors internally, so this is unlikely to be reached\n // But we handle it for completeness\n hasError = true\n lastError = error instanceof Error ? error : new Error(String(error))\n }\n\n // Calculate duration\n const duration = (performance.now() - startTime) / 1000\n\n // Record metrics for sync dispatch\n if (this.eventMetrics) {\n this.eventMetrics.recordDispatchLatency(hook, 'normal', duration)\n this.eventMetrics.recordProcessed(hook, hasError ? 'failure' : 'success')\n\n if (hasError && lastError) {\n this.eventMetrics.recordFailure(hook, lastError.constructor.name)\n }\n }\n\n // End span\n if (span && this.eventTracing) {\n if (hasError && lastError) {\n this.eventTracing.endDispatchSpan(span, 'error', lastError)\n } else {\n this.eventTracing.endDispatchSpan(span, 'ok')\n }\n } else if (span && this.eventTracer) {\n if (hasError && lastError) {\n this.eventTracer.recordError(span, lastError)\n this.eventTracer.endSpan(span, 'error')\n } else {\n this.eventTracer.endSpan(span, 'ok')\n }\n }\n }\n\n /**\n * Get the EventMetrics instance.\n *\n * @returns EventMetrics instance if observability is enabled, undefined otherwise\n */\n getMetrics(): EventMetrics | undefined {\n return this.eventMetrics\n }\n\n /**\n * Get the EventTracer instance.\n *\n * @returns EventTracer instance if tracing is enabled, undefined otherwise\n */\n getTracer(): EventTracer | undefined {\n return this.eventTracer\n }\n\n /**\n * Update observability configuration at runtime.\n *\n * @param config - New observability configuration\n */\n setObservabilityConfig(config: Partial<ObservabilityConfig>): void {\n this.obsConfig = {\n ...this.obsConfig,\n ...config,\n }\n\n // Reinitialize metrics if enabled and registry is provided\n if (this.obsConfig.enabled && this.obsConfig.metrics && !this.eventMetrics) {\n this.eventMetrics = new EventMetrics(this.obsConfig.metrics, this.obsConfig.metricsPrefix)\n\n // Set EventMetrics on the event queue so circuit breakers can record metrics\n this.getEventQueue().setEventMetrics(this.eventMetrics)\n }\n\n // Reinitialize tracer if enabled\n if (this.obsConfig.enabled && this.obsConfig.tracing && !this.eventTracer) {\n this.eventTracer = new EventTracer()\n this.eventTracing = new EventTracing()\n\n // Set EventTracing on the event queue so it can create listener spans\n this.getEventQueue().setEventTracing(this.eventTracing)\n }\n }\n\n /**\n * Get the EventTracing instance.\n *\n * @returns EventTracing instance if tracing is enabled, undefined otherwise\n */\n getEventTracing(): EventTracing | undefined {\n return this.eventTracing\n }\n\n /**\n * Get current observability configuration.\n *\n * @returns Current observability configuration\n */\n getObservabilityConfig(): ObservabilityConfig {\n return { ...this.obsConfig }\n }\n}\n",
124
- "/**\n * @gravito/core - OpenTelemetry Event Metrics\n *\n * Provides event system metrics using OpenTelemetry API directly.\n * This enables Prometheus export without requiring @gravito/monitor dependency.\n *\n * Metrics:\n * - gravito_event_dispatch_duration_seconds (Histogram)\n * - gravito_event_listener_duration_seconds (Histogram)\n * - gravito_event_queue_depth (Observable Gauge)\n *\n * @packageDocumentation\n */\n\nimport type {\n Counter,\n Histogram,\n Meter,\n ObservableGauge,\n ObservableResult,\n} from '@opentelemetry/api'\nimport type { CircuitBreakerMetricsRecorder } from '../CircuitBreaker'\n\n/**\n * Queue depth callback type.\n * Returns the current queue depths for each priority level.\n */\nexport type QueueDepthCallback = () => {\n critical: number\n high: number\n normal: number\n low: number\n}\n\n/**\n * Circuit breaker state callback type.\n * Returns the current state of a circuit breaker.\n */\nexport type CircuitBreakerStateCallback = () => {\n eventName: string\n listenerIndex: number\n state: 0 | 1 | 2 // 0=CLOSED, 1=HALF_OPEN, 2=OPEN\n}\n\n/**\n * Default histogram buckets for dispatch duration.\n * Covers from 1ms to 10s with exponential distribution.\n */\nconst DEFAULT_DISPATCH_BUCKETS = [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10]\n\n/**\n * Default histogram buckets for listener duration.\n * Covers from 1ms to 5s with exponential distribution.\n */\nconst DEFAULT_LISTENER_BUCKETS = [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2, 5]\n\n/**\n * Default histogram buckets for circuit breaker open duration.\n * Covers from 1s to 10m with exponential distribution.\n */\nconst DEFAULT_CB_OPEN_DURATION_BUCKETS = [1, 2, 5, 10, 30, 60, 120, 300, 600]\n\n/**\n * OpenTelemetry-based Event Metrics collector.\n *\n * Uses OpenTelemetry API directly for metrics collection, enabling\n * Prometheus export through the OpenTelemetry SDK.\n *\n * @example\n * ```typescript\n * import { metrics } from '@opentelemetry/api'\n * import { OTelEventMetrics } from '@gravito/core'\n *\n * const meter = metrics.getMeter('@gravito/core', '1.0.0')\n * const eventMetrics = new OTelEventMetrics(meter)\n *\n * // Record dispatch duration\n * eventMetrics.recordDispatchDuration('order:created', 'high', 0.123)\n *\n * // Record listener duration\n * eventMetrics.recordListenerDuration('order:created', 0, 0.456)\n *\n * // Set queue depth callback\n * eventMetrics.setQueueDepthCallback(() => ({\n * high: 10,\n * normal: 50,\n * low: 100\n * }))\n * ```\n *\n * @public\n */\nexport class OTelEventMetrics implements CircuitBreakerMetricsRecorder {\n private readonly meter: Meter\n private readonly prefix: string\n\n private readonly dispatchDurationHistogram: Histogram\n private readonly listenerDurationHistogram: Histogram\n private readonly queueDepthGauge: ObservableGauge\n\n // Circuit breaker metrics (new in Phase 2)\n private readonly cbStateGauge: ObservableGauge\n private readonly cbFailuresCounter: Counter\n private readonly cbSuccessesCounter: Counter\n private readonly cbTransitionsCounter: Counter\n private readonly cbOpenDurationHistogram: Histogram\n\n // Backpressure metrics (Phase 3)\n private readonly backpressureRejectionsCounter: Counter\n private readonly backpressureStateGauge: ObservableGauge\n private readonly backpressureDegradationsCounter: Counter\n private backpressureStateValue = 'NORMAL'\n\n // DLQ metrics (Phase 3)\n private readonly dlqEntriesCounter: Counter\n private readonly dlqDepthGauge: ObservableGauge\n private readonly dlqRequeueCounter: Counter\n private readonly retryAttemptsCounter: Counter\n private dlqDepthCallback?: () => number\n\n // Priority escalation metrics (Phase 1)\n private readonly priorityEscalationCounter: Counter\n\n private queueDepthCallback?: QueueDepthCallback\n private circuitBreakerStateCallbacks: Map<string, CircuitBreakerStateCallback> = new Map()\n private recordedCircuitBreakerStates: Map<string, number> = new Map()\n\n /**\n * Bucket boundaries for dispatch duration histogram.\n */\n private readonly dispatchDurationBuckets: number[] = DEFAULT_DISPATCH_BUCKETS\n\n /**\n * Bucket boundaries for listener duration histogram.\n */\n private readonly listenerDurationBuckets: number[] = DEFAULT_LISTENER_BUCKETS\n\n /**\n * Bucket boundaries for circuit breaker open duration histogram.\n */\n private readonly cbOpenDurationBuckets: number[] = DEFAULT_CB_OPEN_DURATION_BUCKETS\n\n /**\n * Create a new OTelEventMetrics instance.\n *\n * @param meter - OpenTelemetry Meter instance\n * @param prefix - Metric name prefix (default: 'gravito_event_')\n */\n constructor(meter: Meter, prefix = 'gravito_event_') {\n this.meter = meter\n this.prefix = prefix\n\n // Create dispatch duration histogram\n this.dispatchDurationHistogram = meter.createHistogram(`${prefix}dispatch_duration_seconds`, {\n description: 'Duration of event dispatch operations in seconds',\n unit: 's',\n advice: {\n explicitBucketBoundaries: this.dispatchDurationBuckets,\n },\n })\n\n // Create listener duration histogram\n this.listenerDurationHistogram = meter.createHistogram(`${prefix}listener_duration_seconds`, {\n description: 'Duration of listener execution in seconds',\n unit: 's',\n advice: {\n explicitBucketBoundaries: this.listenerDurationBuckets,\n },\n })\n\n // Create queue depth observable gauge\n this.queueDepthGauge = meter.createObservableGauge(`${prefix}queue_depth`, {\n description: 'Current queue depth by priority level',\n unit: '{events}',\n })\n\n // Register the observable callback\n this.queueDepthGauge.addCallback((observableResult: ObservableResult) => {\n if (this.queueDepthCallback) {\n const depths = this.queueDepthCallback()\n observableResult.observe(depths.critical, { priority: 'critical' })\n observableResult.observe(depths.high, { priority: 'high' })\n observableResult.observe(depths.normal, { priority: 'normal' })\n observableResult.observe(depths.low, { priority: 'low' })\n }\n })\n\n // Create circuit breaker state gauge (0=CLOSED, 1=HALF_OPEN, 2=OPEN)\n this.cbStateGauge = meter.createObservableGauge(`${prefix}circuit_breaker_state`, {\n description: 'Circuit breaker state (0=CLOSED, 1=HALF_OPEN, 2=OPEN)',\n unit: '{state}',\n })\n\n this.cbStateGauge.addCallback((observableResult: ObservableResult) => {\n for (const callback of this.circuitBreakerStateCallbacks.values()) {\n const state = callback()\n observableResult.observe(state.state, {\n event_name: state.eventName,\n listener_index: String(state.listenerIndex),\n })\n }\n for (const [name, state] of this.recordedCircuitBreakerStates.entries()) {\n observableResult.observe(state, {\n event_name: name,\n listener_index: '0',\n })\n }\n })\n\n // Create circuit breaker failures counter (with graceful fallback for testing)\n this.cbFailuresCounter = (meter as any).createCounter\n ? (meter as any).createCounter(`${prefix}circuit_breaker_failures_total`, {\n description: 'Total number of failures recorded by circuit breakers',\n unit: '{failures}',\n })\n : ({ add: () => {} } as any)\n\n // Create circuit breaker successes counter\n this.cbSuccessesCounter = (meter as any).createCounter\n ? (meter as any).createCounter(`${prefix}circuit_breaker_successes_total`, {\n description: 'Total number of successes recorded by circuit breakers',\n unit: '{successes}',\n })\n : ({ add: () => {} } as any)\n\n // Create circuit breaker transitions counter\n this.cbTransitionsCounter = (meter as any).createCounter\n ? (meter as any).createCounter(`${prefix}circuit_breaker_transitions_total`, {\n description: 'Total number of state transitions in circuit breakers',\n unit: '{transitions}',\n })\n : ({ add: () => {} } as any)\n\n // Create circuit breaker open duration histogram\n this.cbOpenDurationHistogram = meter.createHistogram(\n `${prefix}circuit_breaker_open_duration_seconds`,\n {\n description: 'Duration that circuit breakers remain in OPEN state',\n unit: 's',\n advice: {\n explicitBucketBoundaries: this.cbOpenDurationBuckets,\n },\n }\n )\n\n // Create backpressure metrics\n this.backpressureRejectionsCounter = (meter as any).createCounter\n ? (meter as any).createCounter(`${prefix}backpressure_rejections_total`, {\n description: 'Total number of events rejected due to backpressure',\n unit: '{rejections}',\n })\n : ({ add: () => {} } as any)\n\n this.backpressureStateGauge = meter.createObservableGauge(`${prefix}backpressure_state`, {\n description: 'Current backpressure state (0=NORMAL, 1=WARNING, 2=CRITICAL, 3=OVERFLOW)',\n unit: '{state}',\n })\n\n this.backpressureStateGauge.addCallback((observableResult: ObservableResult) => {\n const stateMap: Record<string, number> = {\n NORMAL: 0,\n WARNING: 1,\n CRITICAL: 2,\n OVERFLOW: 3,\n }\n observableResult.observe(stateMap[this.backpressureStateValue] ?? 0)\n })\n\n this.backpressureDegradationsCounter = (meter as any).createCounter\n ? (meter as any).createCounter(`${prefix}backpressure_degradations_total`, {\n description: 'Total number of priority degradations due to backpressure',\n unit: '{degradations}',\n })\n : ({ add: () => {} } as any)\n\n // Create DLQ metrics\n this.dlqEntriesCounter = (meter as any).createCounter\n ? (meter as any).createCounter(`${prefix}dlq_entries_total`, {\n description: 'Total number of events added to Dead Letter Queue',\n unit: '{entries}',\n })\n : ({ add: () => {} } as any)\n\n this.dlqDepthGauge = meter.createObservableGauge(`${prefix}dlq_depth`, {\n description: 'Current Dead Letter Queue depth',\n unit: '{events}',\n })\n\n this.dlqDepthGauge.addCallback((observableResult: ObservableResult) => {\n if (this.dlqDepthCallback) {\n observableResult.observe(this.dlqDepthCallback())\n }\n })\n\n this.dlqRequeueCounter = (meter as any).createCounter\n ? (meter as any).createCounter(`${prefix}dlq_requeue_total`, {\n description: 'Total number of DLQ requeue attempts',\n unit: '{attempts}',\n })\n : ({ add: () => {} } as any)\n\n this.retryAttemptsCounter = (meter as any).createCounter\n ? (meter as any).createCounter(`${prefix}retry_attempts_total`, {\n description: 'Total number of event retry attempts',\n unit: '{attempts}',\n })\n : ({ add: () => {} } as any)\n\n // Create priority escalation counter\n this.priorityEscalationCounter = (meter as any).createCounter\n ? (meter as any).createCounter(`${prefix}priority_escalation_total`, {\n description: 'Total number of priority escalations',\n unit: '{escalations}',\n })\n : ({ add: () => {} } as any)\n }\n\n /**\n * Record event dispatch duration.\n *\n * @param eventName - Name of the event\n * @param priority - Priority level (high, normal, low)\n * @param durationSeconds - Duration in seconds\n */\n recordDispatchDuration(eventName: string, priority: string, durationSeconds: number): void {\n this.dispatchDurationHistogram.record(durationSeconds, {\n event_name: eventName,\n priority,\n })\n }\n\n /**\n * Record listener execution duration.\n *\n * @param eventName - Name of the event\n * @param listenerIndex - Index of the listener in the callback list\n * @param durationSeconds - Duration in seconds\n */\n recordListenerDuration(eventName: string, listenerIndex: number, durationSeconds: number): void {\n this.listenerDurationHistogram.record(durationSeconds, {\n event_name: eventName,\n listener_index: String(listenerIndex),\n })\n }\n\n /**\n * Set the callback for queue depth observable gauge.\n *\n * The callback will be invoked when metrics are collected,\n * allowing real-time reporting of queue depths.\n *\n * @param callback - Function returning current queue depths\n */\n setQueueDepthCallback(callback: QueueDepthCallback): void {\n this.queueDepthCallback = callback\n }\n\n /**\n * Register a circuit breaker state callback for monitoring.\n *\n * @param key - Unique identifier for the circuit breaker (e.g., \"order:created-0\")\n * @param callback - Function returning current circuit breaker state\n */\n registerCircuitBreakerStateCallback(key: string, callback: CircuitBreakerStateCallback): void {\n this.circuitBreakerStateCallbacks.set(key, callback)\n }\n\n /**\n * Unregister a circuit breaker state callback.\n *\n * @param key - Unique identifier for the circuit breaker\n */\n unregisterCircuitBreakerStateCallback(key: string): void {\n this.circuitBreakerStateCallbacks.delete(key)\n }\n\n /**\n * Record circuit breaker state change.\n *\n * @param name - Name of the circuit breaker (usually event name)\n * @param state - State as number (0=CLOSED, 1=HALF_OPEN, 2=OPEN)\n */\n recordState(name: string, state: number): void {\n this.recordedCircuitBreakerStates.set(name, state)\n }\n\n /**\n * Record circuit breaker state transition.\n *\n * @param name - Name of the circuit breaker\n * @param fromState - Previous state\n * @param toState - New state\n */\n recordTransition(name: string, fromState: string, toState: string): void {\n this.recordCircuitBreakerTransition(name, 0, fromState, toState)\n }\n\n /**\n * Record circuit breaker failure.\n *\n * @param name - Name of the circuit breaker\n */\n recordFailure(name: string): void {\n this.recordCircuitBreakerFailure(name, 0)\n }\n\n /**\n * Record circuit breaker success.\n *\n * @param name - Name of the circuit breaker\n */\n recordSuccess(name: string): void {\n this.recordCircuitBreakerSuccess(name, 0)\n }\n\n /**\n * Record circuit breaker open duration.\n *\n * @param name - Name of the circuit breaker\n * @param seconds - Duration in seconds\n */\n recordOpenDuration(name: string, seconds: number): void {\n this.recordCircuitBreakerOpenDuration(name, 0, seconds)\n }\n\n /**\n * Record circuit breaker failure.\n *\n * @param eventName - Name of the event\n * @param listenerIndex - Index of the listener\n */\n recordCircuitBreakerFailure(eventName: string, listenerIndex: number): void {\n this.cbFailuresCounter.add(1, {\n event_name: eventName,\n listener_index: String(listenerIndex),\n })\n }\n\n /**\n * Record circuit breaker success.\n *\n * @param eventName - Name of the event\n * @param listenerIndex - Index of the listener\n */\n recordCircuitBreakerSuccess(eventName: string, listenerIndex: number): void {\n this.cbSuccessesCounter.add(1, {\n event_name: eventName,\n listener_index: String(listenerIndex),\n })\n }\n\n /**\n * Record circuit breaker state transition.\n *\n * @param eventName - Name of the event\n * @param listenerIndex - Index of the listener\n * @param fromState - Previous state (CLOSED, HALF_OPEN, OPEN)\n * @param toState - New state (CLOSED, HALF_OPEN, OPEN)\n */\n recordCircuitBreakerTransition(\n eventName: string,\n listenerIndex: number,\n fromState: string,\n toState: string\n ): void {\n this.cbTransitionsCounter.add(1, {\n event_name: eventName,\n listener_index: String(listenerIndex),\n from_state: fromState,\n to_state: toState,\n })\n }\n\n /**\n * Record circuit breaker open duration.\n *\n * @param eventName - Name of the event\n * @param listenerIndex - Index of the listener\n * @param durationSeconds - Duration in seconds\n */\n recordCircuitBreakerOpenDuration(\n eventName: string,\n listenerIndex: number,\n durationSeconds: number\n ): void {\n this.cbOpenDurationHistogram.record(durationSeconds, {\n event_name: eventName,\n listener_index: String(listenerIndex),\n })\n }\n\n /**\n * Get the bucket boundaries for dispatch duration histogram.\n *\n * @returns Array of bucket boundaries in seconds\n */\n getDispatchDurationBuckets(): number[] {\n return [...this.dispatchDurationBuckets]\n }\n\n /**\n * Get the bucket boundaries for listener duration histogram.\n *\n * @returns Array of bucket boundaries in seconds\n */\n getListenerDurationBuckets(): number[] {\n return [...this.listenerDurationBuckets]\n }\n\n /**\n * Get the OpenTelemetry Meter instance.\n *\n * @returns Meter instance\n */\n getMeter(): Meter {\n return this.meter\n }\n\n /**\n * Get the metric name prefix.\n *\n * @returns Metric name prefix\n */\n getPrefix(): string {\n return this.prefix\n }\n\n /**\n * Get the bucket boundaries for circuit breaker open duration histogram.\n *\n * @returns Array of bucket boundaries in seconds\n */\n getCircuitBreakerOpenDurationBuckets(): number[] {\n return [...this.cbOpenDurationBuckets]\n }\n\n /**\n * Get all registered circuit breaker state callback keys.\n *\n * @returns Array of registered keys\n */\n getRegisteredCircuitBreakers(): string[] {\n return Array.from(this.circuitBreakerStateCallbacks.keys())\n }\n\n /**\n * Clear all circuit breaker state callbacks.\n */\n clearCircuitBreakerCallbacks(): void {\n this.circuitBreakerStateCallbacks.clear()\n }\n\n /**\n * Record a backpressure rejection event.\n *\n * @param eventName - Event name\n * @param priority - Event priority\n * @param reason - Rejection reason\n */\n recordBackpressureRejection(eventName: string, priority: string, reason: string): void {\n this.backpressureRejectionsCounter.add(1, {\n event_name: eventName,\n priority,\n reason,\n })\n }\n\n /**\n * Record a backpressure state change event.\n *\n * @param state - New backpressure state (NORMAL, WARNING, CRITICAL, OVERFLOW)\n */\n recordBackpressureState(state: string): void {\n this.backpressureStateValue = state\n }\n\n /**\n * Record a backpressure degradation event.\n *\n * @param eventName - Event name\n * @param fromPriority - Original priority\n * @param toPriority - Degraded priority\n */\n recordBackpressureDegradation(eventName: string, fromPriority: string, toPriority: string): void {\n this.backpressureDegradationsCounter.add(1, {\n event_name: eventName,\n from_priority: fromPriority,\n to_priority: toPriority,\n })\n }\n\n /**\n * Record an event added to Dead Letter Queue.\n *\n * @param eventName - Event name\n * @param source - Source of DLQ entry (retry_exhausted, circuit_breaker, backpressure_overflow)\n */\n recordDLQEntry(eventName: string, source: string): void {\n this.dlqEntriesCounter.add(1, {\n event_name: eventName,\n source,\n })\n }\n\n /**\n * Set the callback for DLQ depth observable gauge.\n *\n * @param callback - Function returning current DLQ depth\n */\n setDLQDepthCallback(callback: () => number): void {\n this.dlqDepthCallback = callback\n }\n\n /**\n * Record a DLQ requeue attempt.\n *\n * @param eventName - Event name\n * @param result - Result of requeue (success or failure)\n */\n recordDLQRequeue(eventName: string, result: 'success' | 'failure'): void {\n this.dlqRequeueCounter.add(1, {\n event_name: eventName,\n result,\n })\n }\n\n /**\n * Record an event retry attempt.\n *\n * @param eventName - Event name\n * @param attemptNumber - Attempt number\n */\n recordRetryAttempt(eventName: string, attemptNumber: number): void {\n this.retryAttemptsCounter.add(1, {\n event_name: eventName,\n attempt_number: String(attemptNumber),\n })\n }\n\n /**\n * Record a priority escalation event.\n *\n * @param eventName - Event name\n * @param fromPriority - Original priority\n * @param toPriority - Escalated priority\n */\n recordPriorityEscalation(eventName: string, fromPriority: string, toPriority: string): void {\n this.priorityEscalationCounter.add(1, {\n event_name: eventName,\n from_priority: fromPriority,\n to_priority: toPriority,\n })\n }\n\n /**\n * Record event deduplication (FS-102).\n *\n * @param eventName - Event name\n * @param deduplicatedCount - Number of events after deduplication\n * @param totalCount - Total number of events before deduplication\n */\n recordDeduplication(eventName: string, deduplicatedCount: number, totalCount: number): void {\n this.meter\n .createObservableCounter(`gravito_event_deduplication_count`, {\n description: 'Count of deduplicated events',\n })\n .addCallback((result: ObservableResult) => {\n result.observe(totalCount - deduplicatedCount, {\n event_name: eventName,\n type: 'removed',\n })\n result.observe(deduplicatedCount, {\n event_name: eventName,\n type: 'remaining',\n })\n })\n }\n\n /**\n * Record batch submission (FS-102).\n *\n * @param eventName - Event name\n * @param batchSize - Size of submitted batch\n * @param windowMs - Aggregation window size\n */\n recordBatch(eventName: string, batchSize: number, windowMs: number): void {\n this.meter\n .createObservableCounter(`gravito_event_batch_size`, {\n description: 'Size of event batches',\n })\n .addCallback((result: ObservableResult) => {\n result.observe(batchSize, {\n event_name: eventName,\n })\n })\n\n this.meter\n .createObservableGauge(`gravito_event_batch_window`, {\n description: 'Aggregation window size in milliseconds',\n })\n .addCallback((result: ObservableResult) => {\n result.observe(windowMs, {\n event_name: eventName,\n })\n })\n }\n\n /**\n * Record window adjustment (FS-102).\n *\n * @param oldWindowMs - Previous window size\n * @param newWindowMs - New window size\n * @param reason - Adjustment reason\n */\n recordWindowAdjustment(oldWindowMs: number, newWindowMs: number, reason: string): void {\n this.meter\n .createObservableCounter(`gravito_event_aggregation_window_adjustments`, {\n description: 'Count of window adjustments',\n })\n .addCallback((result: ObservableResult) => {\n result.observe(1, {\n from_window: `${oldWindowMs}ms`,\n to_window: `${newWindowMs}ms`,\n reason,\n })\n })\n }\n}\n",
125
- "import type { Logger } from './Logger'\nimport type { PlanetCore } from './PlanetCore'\n\n/**\n * Type of process-level error\n * @public\n */\nexport type GlobalProcessErrorKind = 'unhandledRejection' | 'uncaughtException'\n\n/**\n * Context payload for global error handler filters/actions\n * @public\n */\nexport type GlobalProcessErrorHandlerContext = {\n core?: PlanetCore\n kind: GlobalProcessErrorKind\n error: unknown\n isProduction: boolean\n timestamp: number\n logLevel?: 'error' | 'warn' | 'info' | 'none'\n logMessage?: string\n exit?: boolean\n exitCode?: number\n gracePeriodMs?: number\n}\n\n/**\n * Error handling strategy\n * @public\n */\nexport type GlobalErrorHandlersMode = 'log' | 'exit' | 'exitInProduction'\n\n/**\n * Options for registering global handlers\n * @public\n */\nexport type RegisterGlobalErrorHandlersOptions = {\n core?: PlanetCore\n logger?: Logger\n mode?: GlobalErrorHandlersMode\n exitCode?: number\n gracePeriodMs?: number\n}\n\ntype GlobalState = {\n nextId: number\n sinks: Map<\n number,\n Required<Pick<RegisterGlobalErrorHandlersOptions, 'mode'>> & RegisterGlobalErrorHandlersOptions\n >\n listenersInstalled: boolean\n onUnhandledRejection: ((reason: unknown, promise: Promise<unknown>) => void) | undefined\n onUncaughtException: ((error: unknown) => void) | undefined\n}\n\nconst stateKey = Symbol.for('gravito.core.globalErrorHandlers')\n\nfunction getGlobalState(): GlobalState {\n const g = globalThis as unknown as Record<symbol, GlobalState | undefined>\n const existing = g[stateKey]\n if (existing) {\n return existing\n }\n\n const created: GlobalState = {\n nextId: 1,\n sinks: new Map(),\n listenersInstalled: false,\n onUnhandledRejection: undefined,\n onUncaughtException: undefined,\n }\n g[stateKey] = created\n return created\n}\n\ntype ProcessEventListener = (...args: unknown[]) => void\n\nfunction offProcess(event: string, listener: ProcessEventListener): void {\n const p = process as unknown as {\n off?: (event: string, listener: ProcessEventListener) => void\n removeListener?: (event: string, listener: ProcessEventListener) => void\n }\n if (typeof p.off === 'function') {\n p.off(event, listener)\n return\n }\n if (typeof p.removeListener === 'function') {\n p.removeListener(event, listener)\n }\n}\n\nfunction safeMessageFromUnknown(error: unknown): string {\n if (error instanceof Error) {\n return error.message || 'Error'\n }\n if (typeof error === 'string') {\n return error\n }\n try {\n return JSON.stringify(error)\n } catch {\n return String(error)\n }\n}\n\nasync function handleProcessError(kind: GlobalProcessErrorKind, error: unknown): Promise<void> {\n const state = getGlobalState()\n if (state.sinks.size === 0) {\n return\n }\n\n const isProduction = process.env.NODE_ENV === 'production'\n let shouldExit = false\n let exitCode = 1\n let exitTimer: ReturnType<typeof setTimeout> | undefined\n\n try {\n const sinks = Array.from(state.sinks.values())\n const prepared = await Promise.all(\n sinks.map(async (sink) => {\n const defaultExit =\n sink.mode === 'exit' || (sink.mode === 'exitInProduction' && isProduction)\n\n let ctx: GlobalProcessErrorHandlerContext = {\n ...(sink.core ? { core: sink.core } : {}),\n kind,\n error,\n isProduction,\n timestamp: Date.now(),\n exit: defaultExit,\n exitCode: sink.exitCode ?? 1,\n gracePeriodMs: sink.gracePeriodMs ?? 250,\n }\n\n if (sink.core) {\n ctx = await sink.core.hooks.applyFilters<GlobalProcessErrorHandlerContext>(\n 'processError:context',\n ctx\n )\n }\n\n return { sink, ctx }\n })\n )\n\n const exitTargets = prepared\n .map((p) => p.ctx)\n .filter((ctx) => (ctx.exit ?? false) && (ctx.exitCode ?? 1) >= 0)\n shouldExit = exitTargets.length > 0\n const gracePeriodMs = Math.max(0, ...exitTargets.map((c) => c.gracePeriodMs ?? 250))\n exitCode = Math.max(0, ...exitTargets.map((c) => c.exitCode ?? 1))\n\n if (shouldExit) {\n exitTimer = setTimeout(() => {\n process.exit(exitCode)\n }, gracePeriodMs)\n exitTimer.unref?.()\n }\n\n await Promise.all(\n prepared.map(async ({ sink, ctx }) => {\n const logger = sink.logger ?? sink.core?.logger\n const logLevel = ctx.logLevel ?? 'error'\n if (logger && logLevel !== 'none') {\n const message = safeMessageFromUnknown(ctx.error)\n const msg = ctx.logMessage ?? `[${ctx.kind}] ${message}`\n if (logLevel === 'error') {\n logger.error(msg, ctx.error)\n } else if (logLevel === 'warn') {\n logger.warn(msg, ctx.error)\n } else {\n logger.info(msg, ctx.error)\n }\n }\n\n if (sink.core) {\n await sink.core.hooks.doAction('processError:report', ctx)\n }\n })\n )\n } catch (e) {\n console.error('[@gravito/core] Failed to handle process-level error:', e)\n } finally {\n if (shouldExit) {\n clearTimeout(exitTimer)\n process.exit(exitCode)\n }\n }\n}\n\nfunction ensureListenersInstalled(): void {\n const state = getGlobalState()\n if (state.listenersInstalled) {\n return\n }\n\n if (typeof process === 'undefined' || typeof process.on !== 'function') {\n return\n }\n\n state.onUnhandledRejection = (reason: unknown) => {\n void handleProcessError('unhandledRejection', reason)\n }\n state.onUncaughtException = (error: unknown) => {\n void handleProcessError('uncaughtException', error)\n }\n\n process.on('unhandledRejection', state.onUnhandledRejection)\n process.on('uncaughtException', state.onUncaughtException)\n\n state.listenersInstalled = true\n}\n\nfunction teardownListenersIfUnused(): void {\n const state = getGlobalState()\n if (!state.listenersInstalled || state.sinks.size > 0) {\n return\n }\n\n if (state.onUnhandledRejection) {\n offProcess('unhandledRejection', state.onUnhandledRejection as unknown as ProcessEventListener)\n }\n if (state.onUncaughtException) {\n offProcess('uncaughtException', state.onUncaughtException as unknown as ProcessEventListener)\n }\n\n state.onUnhandledRejection = undefined\n state.onUncaughtException = undefined\n state.listenersInstalled = false\n}\n\n/**\n * Register process-level error handlers (`unhandledRejection` / `uncaughtException`).\n *\n * - `mode: \"log\"`: only log/report\n * - `mode: \"exit\"`: report then `process.exit(exitCode)`\n * - `mode: \"exitInProduction\"`: exit only when `NODE_ENV=production` (default)\n */\nexport function registerGlobalErrorHandlers(\n options: RegisterGlobalErrorHandlersOptions = {}\n): () => void {\n const state = getGlobalState()\n ensureListenersInstalled()\n\n const id = state.nextId++\n state.sinks.set(id, {\n ...options,\n mode: options.mode ?? 'exitInProduction',\n })\n\n return () => {\n state.sinks.delete(id)\n teardownListenersIfUnused()\n }\n}\n",
126
- "/**\n * @gravito/core - Observability Contracts\n *\n * Abstract interfaces for observability providers, decoupling core from OpenTelemetry.\n * This allows @gravito/monitor to provide complete OTel implementations while core\n * remains dependency-free.\n */\n\n/**\n * Represents a tracing span for distributed tracing.\n * @public\n */\nexport interface TracingSpan {\n /**\n * Add an event to the span.\n *\n * @param name - Event name\n * @param attributes - Optional event attributes\n */\n addEvent(name: string, attributes?: Record<string, string | number>): void\n\n /**\n * Set the span status.\n *\n * @param code - Status code: 'OK' or 'ERROR'\n * @param message - Optional error message\n */\n setStatus(code: 'OK' | 'ERROR', message?: string): void\n\n /**\n * End the span.\n */\n end(): void\n}\n\n/**\n * Event tracing provider for distributed tracing of events.\n * @public\n */\nexport interface EventTracingProvider {\n /**\n * Start a new tracing span for an event.\n *\n * @param name - Span name\n * @returns A TracingSpan instance\n */\n startSpan(name: string): TracingSpan\n\n /**\n * Record custom metrics for an event.\n *\n * @param eventName - Name of the event\n * @param metrics - Metrics to record (e.g., duration, count)\n */\n recordMetrics(eventName: string, metrics: Record<string, number>): void\n}\n\n/**\n * Event metrics recorder for monitoring event processing.\n * @public\n */\nexport interface EventMetricsRecorder {\n /**\n * Record event processing completion.\n *\n * @param eventName - Name of the event\n * @param duration - Processing duration in milliseconds\n * @param success - Whether processing was successful\n */\n recordEventProcessed(eventName: string, duration: number, success: boolean): void\n\n /**\n * Record event publication.\n *\n * @param eventName - Name of the event\n */\n recordEventPublished(eventName: string): void\n\n /**\n * Record event processing error.\n *\n * @param eventName - Name of the event\n * @param error - The error that occurred\n */\n recordEventError(eventName: string, error: Error): void\n}\n\n/**\n * Worker metrics provider for monitoring worker pool operations.\n * @public\n */\nexport interface WorkerMetricsProvider {\n /**\n * Record worker pool startup.\n *\n * @param poolId - ID of the worker pool\n */\n recordWorkerStartup(poolId: string): void\n\n /**\n * Record task execution in a worker pool.\n *\n * @param poolId - ID of the worker pool\n * @param duration - Task duration in milliseconds\n * @param success - Whether task execution was successful\n */\n recordTaskExecution(poolId: string, duration: number, success: boolean): void\n\n /**\n * Record worker pool error.\n *\n * @param poolId - ID of the worker pool\n * @param error - The error that occurred\n */\n recordWorkerError(poolId: string, error: Error): void\n}\n\n/**\n * Main observability provider interface combining all observability capabilities.\n * @public\n */\nexport interface ObservabilityProvider {\n /**\n * Event tracing provider (optional).\n */\n eventTracing?: EventTracingProvider\n\n /**\n * Event metrics recorder (optional).\n */\n eventMetrics?: EventMetricsRecorder\n\n /**\n * Worker metrics provider (optional).\n */\n workerMetrics?: WorkerMetricsProvider\n\n /**\n * General tracing provider (optional).\n */\n tracing?: {\n startSpan(name: string): TracingSpan\n }\n}\n\n/**\n * No-Op implementations for when observability is not configured.\n * These provide compatibility without requiring external dependencies.\n * @internal\n */\n\nclass NoOpTracingSpan implements TracingSpan {\n addEvent(): void {\n // No-op\n }\n\n setStatus(): void {\n // No-op\n }\n\n end(): void {\n // No-op\n }\n}\n\nclass NoOpEventTracingProvider implements EventTracingProvider {\n startSpan(): TracingSpan {\n return new NoOpTracingSpan()\n }\n\n recordMetrics(): void {\n // No-op\n }\n}\n\nclass NoOpEventMetricsRecorder implements EventMetricsRecorder {\n recordEventProcessed(): void {\n // No-op\n }\n\n recordEventPublished(): void {\n // No-op\n }\n\n recordEventError(): void {\n // No-op\n }\n}\n\nclass NoOpWorkerMetricsProvider implements WorkerMetricsProvider {\n recordWorkerStartup(): void {\n // No-op\n }\n\n recordTaskExecution(): void {\n // No-op\n }\n\n recordWorkerError(): void {\n // No-op\n }\n}\n\n/**\n * Create a no-op observability provider.\n * Used by default when no observability implementation is provided.\n *\n * @returns An ObservabilityProvider with all no-op implementations\n * @internal\n */\nexport function createNoOpObservabilityProvider(): ObservabilityProvider {\n return {\n eventTracing: new NoOpEventTracingProvider(),\n eventMetrics: new NoOpEventMetricsRecorder(),\n workerMetrics: new NoOpWorkerMetricsProvider(),\n tracing: {\n startSpan(): TracingSpan {\n return new NoOpTracingSpan()\n },\n },\n }\n}\n",
127
- "import type { GravitoRequest, ValidationTarget } from '../../http/types'\n\n/**\n * Bun-optimized implementation of GravitoRequest.\n * @internal\n */\nexport class BunRequest implements GravitoRequest {\n private _url: URL\n private _params: Record<string, string> = {}\n private _query: Record<string, string | string[]> | null = null\n private _validated: Partial<Record<ValidationTarget, unknown>> = {}\n\n constructor(\n public readonly raw: Request,\n params: Record<string, string> = {}\n ) {\n this._url = new URL(raw.url)\n this._params = params\n }\n\n // Internal: Set params after route match\n setParams(params: Record<string, string>) {\n this._params = params\n }\n\n get url(): string {\n return this.raw.url\n }\n\n get method(): string {\n return this.raw.method\n }\n\n get path(): string {\n return this._url.pathname\n }\n\n // Parameter Access\n param(name: string): string | undefined {\n return this._params[name]\n }\n\n params(): Record<string, string> {\n return this._params\n }\n\n query(name: string): string | undefined {\n // Lazily parse query\n if (!this._query) {\n this.parseQuery()\n }\n const val = this._query?.[name]\n if (Array.isArray(val)) {\n return val[0]\n }\n return val\n }\n\n queries(): Record<string, string | string[]> {\n if (!this._query) {\n this.parseQuery()\n }\n return this._query!\n }\n\n header(name: string): string | undefined\n header(): Record<string, string>\n header(name?: string): string | undefined | Record<string, string> {\n if (name) {\n return this.raw.headers.get(name) || undefined\n }\n const headers: Record<string, string> = {}\n this.raw.headers.forEach((value, key) => {\n headers[key] = value\n })\n return headers\n }\n\n // Body Parsing\n async json<T = unknown>(): Promise<T> {\n return this.raw.json() as Promise<T>\n }\n\n async text(): Promise<string> {\n return this.raw.text()\n }\n\n async formData(): Promise<FormData> {\n return this.raw.formData()\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n return this.raw.arrayBuffer()\n }\n\n async parseBody<T = unknown>(): Promise<T> {\n const contentType = this.raw.headers.get('Content-Type')\n if (\n contentType?.includes('application/x-www-form-urlencoded') ||\n contentType?.includes('multipart/form-data')\n ) {\n const formData = await this.formData()\n const body: Record<string, any> = {}\n formData.forEach((value, key) => {\n body[key] = value\n })\n return body as T\n }\n return {} as T\n }\n\n // Internal method to set validated data\n // This can be used by middleware to attach validated data to the request\n setValidated(target: ValidationTarget, data: unknown) {\n this._validated[target] = data\n }\n\n valid<T = unknown>(target: ValidationTarget): T {\n const data = this._validated[target]\n if (data === undefined) {\n // In Photon, valid() throws or returns specific type?\n // Gravito types definition says allows undefined?\n // \"valid<T = unknown>(target: ValidationTarget): T\"\n // Usually framework-agnostic means we should throw if not found or return T.\n // Photon definition: valid<T>(target: keyof ValidationTargets): T\n // If not validated, likely undefined or error.\n // Let's return undefined as \"unknown\" implicitly.\n // Or throw to match semantics?\n // \"throws {Error} If validation was not performed for this target\" in types.ts JSDoc\n throw new Error(`Validation target '${target}' not found or validation failed.`)\n }\n return data as T\n }\n\n private parseQuery() {\n this._query = {}\n for (const [key, value] of this._url.searchParams) {\n if (this._query[key]) {\n if (Array.isArray(this._query[key])) {\n ;(this._query[key] as string[]).push(value)\n } else {\n this._query[key] = [this._query[key] as string, value]\n }\n } else {\n this._query[key] = value\n }\n }\n }\n}\n",
128
- "import { RequestScopeManager } from '../../Container/RequestScopeManager'\nimport type {\n ContentfulStatusCode,\n GravitoContext,\n GravitoVariables,\n ProxyOptions,\n StatusCode,\n} from '../../http/types'\nimport { BunRequest } from './BunRequest'\n\n/**\n * Bun-optimized implementation of GravitoContext.\n * @internal\n */\nexport class BunContext<V extends GravitoVariables = GravitoVariables>\n implements GravitoContext<V>\n{\n // Request wrapper\n public req: BunRequest\n\n // Context variables\n private _variables: Map<string, unknown> = new Map()\n\n // Request scope management\n private _requestScope: RequestScopeManager\n\n /**\n * URL generator helper\n */\n public route!: (name: string, params?: Record<string, any>, query?: Record<string, any>) => string\n\n // Response state\n private _status: StatusCode = 200\n private _headers: Headers = new Headers()\n private _executionCtx?: ExecutionContext\n\n // Stored response (Photon-like behavior)\n public res: Response | undefined\n\n public readonly native: unknown\n\n constructor(\n request: Request,\n public readonly env: Record<string, unknown> = {},\n executionCtx?: ExecutionContext\n ) {\n this.req = new BunRequest(request)\n this._executionCtx = executionCtx\n this._requestScope = new RequestScopeManager()\n this.native = { request, env, executionCtx }\n }\n\n /**\n * Create a proxied instance to enable object destructuring of context variables\n * This allows: async list({ userService }: Context)\n */\n static create<V extends GravitoVariables = GravitoVariables>(\n request: Request,\n env: Record<string, unknown> = {},\n executionCtx?: ExecutionContext\n ): GravitoContext<V> {\n const instance = new BunContext<V>(request, env, executionCtx)\n return new Proxy(instance, {\n get(target, prop, receiver) {\n // 1. If property exists on the instance (method, property), return it\n if (prop in target) {\n const value = Reflect.get(target, prop, receiver)\n if (typeof value === 'function') {\n return value.bind(target) // Ensure 'this' points to instance\n }\n return value\n }\n\n // 2. If not, try to fetch from internal variable map\n if (typeof prop === 'string') {\n return target.get(prop as any)\n }\n\n return undefined\n },\n }) as any\n }\n\n // Response Builders\n json<T>(data: T, status: ContentfulStatusCode = 200): Response {\n this.status(status)\n this.header('Content-Type', 'application/json')\n this.res = new Response(JSON.stringify(data), {\n status: this._status,\n headers: this._headers,\n })\n return this.res\n }\n\n text(text: string, status: ContentfulStatusCode = 200): Response {\n this.status(status)\n this.header('Content-Type', 'text/plain')\n this.res = new Response(text, {\n status: this._status,\n headers: this._headers,\n })\n return this.res\n }\n\n html(html: string, status: ContentfulStatusCode = 200): Response {\n this.status(status)\n this.header('Content-Type', 'text/html')\n this.res = new Response(html, {\n status: this._status,\n headers: this._headers,\n })\n return this.res\n }\n\n redirect(url: string, status: 301 | 302 | 303 | 307 | 308 = 302): Response {\n this.status(status)\n this.header('Location', url)\n this.res = new Response(null, {\n status: this._status,\n headers: this._headers,\n })\n return this.res\n }\n\n body(data: BodyInit | null, status: StatusCode = 200): Response {\n this.status(status)\n this.res = new Response(data, {\n status: this._status,\n headers: this._headers,\n })\n return this.res\n }\n\n stream(stream: ReadableStream, status: ContentfulStatusCode = 200): Response {\n this.status(status)\n this.res = new Response(stream, {\n status: this._status,\n headers: this._headers,\n })\n return this.res\n }\n\n notFound(message?: string): Response {\n return this.text(message ?? 'Not Found', 404 as 200)\n }\n\n forbidden(message?: string): Response {\n return this.text(message ?? 'Forbidden', 403 as 200)\n }\n\n unauthorized(message?: string): Response {\n return this.text(message ?? 'Unauthorized', 401 as 200)\n }\n\n badRequest(message?: string): Response {\n return this.text(message ?? 'Bad Request', 400 as 200)\n }\n\n async forward(target: string, options?: ProxyOptions): Promise<Response> {\n const url = new URL(target, this.req.url)\n const headers = new Headers(this.req.raw.headers)\n\n if (options?.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n headers.set(key, value)\n }\n }\n\n if (!options?.preserveHost) {\n headers.delete('Host')\n }\n\n if (options?.addForwardedHeaders !== false) {\n const origin = new URL(this.req.url)\n headers.append('X-Forwarded-Host', origin.host)\n headers.append('X-Forwarded-Proto', origin.protocol.slice(0, -1))\n }\n\n if (options?.rewritePath) {\n url.pathname = options.rewritePath(url.pathname)\n }\n\n return fetch(url, {\n method: this.req.method,\n headers,\n body: this.req.raw.body,\n redirect: 'manual',\n })\n }\n\n // Headers\n header(name: string, value: string, options?: { append?: boolean }): void\n header(name: string): string | undefined\n header(\n name: string,\n value?: string,\n options?: { append?: boolean }\n ): string | undefined | undefined {\n if (value === undefined) {\n return this.req.header(name)\n }\n if (options?.append) {\n this._headers.append(name, value)\n this.res?.headers.append(name, value)\n } else {\n this._headers.set(name, value)\n if (this.res) {\n this.res.headers.set(name, value)\n }\n }\n return undefined\n }\n\n /**\n * Reset context state for reuse in pooling scenarios\n * @internal\n */\n reset(request: Request): void {\n this.req = new BunRequest(request)\n this._status = 200\n this._headers = new Headers()\n this._variables.clear()\n this.res = undefined\n this._requestScope = new RequestScopeManager()\n }\n\n status(code: StatusCode): void {\n this._status = code\n }\n\n // Context Variables\n get<K extends keyof V>(key: K): V[K] {\n return this._variables.get(key as string) as V[K]\n }\n\n set<K extends keyof V>(key: K, value: V[K]): void {\n this._variables.set(key as string, value)\n }\n\n // Execution Control\n get executionCtx(): ExecutionContext | undefined {\n return this._executionCtx\n }\n\n // Request-Scoped Dependency Injection\n requestScope(): RequestScopeManager {\n return this._requestScope\n }\n\n scoped<T>(key: string | symbol, factory: () => T): T {\n return this._requestScope.resolve(key, factory)\n }\n}\n",
129
- "/**\n * WebSocket 路由管理器\n *\n * 負責註冊和分發 WebSocket 事件到相應的路由處理器\n */\n\nexport interface WebSocketRouteHandlers {\n open?: (ws: unknown) => void | Promise<void>\n message?: (ws: unknown, data: string | Buffer | Uint8Array) => void | Promise<void>\n close?: (ws: unknown, code: number, reason: string) => void | Promise<void>\n drain?: (ws: unknown) => void | Promise<void>\n}\n\nexport class BunWebSocketHandler {\n private routes = new Map<string, WebSocketRouteHandlers>()\n\n /**\n * 註冊 WebSocket 路由\n */\n register(path: string, handlers: WebSocketRouteHandlers): void {\n this.routes.set(path, handlers)\n }\n\n /**\n * 檢查是否有該路由\n * 支援精確匹配和 wildcard 匹配\n */\n hasRoute(path: string): boolean {\n // 精確匹配\n if (this.routes.has(path)) {\n return true\n }\n\n // Wildcard 匹配 (e.g., /api/*)\n for (const registeredPath of this.routes.keys()) {\n if (this.matchesPath(registeredPath, path)) {\n return true\n }\n }\n\n return false\n }\n\n /**\n * 檢查是否有任何已註冊的路由\n */\n hasAnyRoute(): boolean {\n return this.routes.size > 0\n }\n\n /**\n * 將 handlers 轉換為 Bun.serve websocket config\n */\n toHandler(): {\n open?: (ws: unknown) => void | Promise<void>\n message?: (ws: unknown, data: string | Buffer | Uint8Array) => void | Promise<void>\n close?: (ws: unknown, code: number, reason: string) => void | Promise<void>\n drain?: (ws: unknown) => void | Promise<void>\n } {\n return {\n open: async (ws: unknown) => {\n const path = (ws as any)?.data?.path\n if (!path) {\n return\n }\n\n const handler = this.findHandler(path)\n if (handler?.open) {\n await handler.open(ws)\n }\n },\n\n message: async (ws: unknown, data: string | Buffer | Uint8Array) => {\n const path = (ws as any)?.data?.path\n if (!path) {\n return\n }\n\n const handler = this.findHandler(path)\n if (handler?.message) {\n await handler.message(ws, data)\n }\n },\n\n close: async (ws: unknown, code: number, reason: string) => {\n const path = (ws as any)?.data?.path\n if (!path) {\n return\n }\n\n const handler = this.findHandler(path)\n if (handler?.close) {\n await handler.close(ws, code, reason)\n }\n },\n\n drain: async (ws: unknown) => {\n const path = (ws as any)?.data?.path\n if (!path) {\n return\n }\n\n const handler = this.findHandler(path)\n if (handler?.drain) {\n await handler.drain(ws)\n }\n },\n }\n }\n\n /**\n * 尋找符合路徑的 handler\n * 優先精確匹配,再 wildcard 匹配\n */\n private findHandler(path: string): WebSocketRouteHandlers | undefined {\n // 精確匹配\n if (this.routes.has(path)) {\n return this.routes.get(path)\n }\n\n // Wildcard 匹配\n for (const [registeredPath, handlers] of this.routes.entries()) {\n if (this.matchesPath(registeredPath, path)) {\n return handlers\n }\n }\n\n return undefined\n }\n\n /**\n * 路徑匹配邏輯\n * 支援:\n * - 精確匹配:/chat\n * - Wildcard:/api/*, /api*\n */\n private matchesPath(pattern: string, path: string): boolean {\n if (!pattern.includes('*')) {\n return path === pattern\n }\n\n if (pattern.endsWith('/*')) {\n const basePattern = pattern.slice(0, -2)\n return path === basePattern || path.startsWith(`${basePattern}/`)\n }\n\n if (pattern.endsWith('*')) {\n const basePattern = pattern.slice(0, -1)\n return path.startsWith(basePattern)\n }\n\n return false\n }\n}\n",
130
- "import type {\n GravitoContext,\n GravitoErrorHandler,\n GravitoHandler,\n GravitoMiddleware,\n GravitoNotFoundHandler,\n HttpMethod,\n} from '../../http/types'\nimport type { HttpAdapter, RouteDefinition } from '../types'\nimport { BunContext } from './BunContext'\nimport type { BunRequest } from './BunRequest'\nimport type { WebSocketRouteHandlers } from './BunWebSocketHandler'\nimport { BunWebSocketHandler } from './BunWebSocketHandler'\nimport { RadixRouter } from './RadixRouter'\n\n/**\n * Native Bun-optimized HTTP Adapter for Gravito.\n * Uses Bun's standard Request/Response classes and efficient router.\n * @public\n */\nexport class BunNativeAdapter implements HttpAdapter {\n public readonly name = 'bun-native'\n public readonly version = '0.0.1'\n\n public get native(): unknown {\n return this\n }\n\n private router = new RadixRouter()\n private middlewares: Array<{ path: string; handlers: GravitoMiddleware[] }> = []\n private errorHandler: GravitoErrorHandler | null = null\n private notFoundHandler: GravitoNotFoundHandler | null = null\n\n // Context pooling for P0 fix (state pollution)\n private contextPool: BunContext[] = []\n private readonly maxPoolSize = 100\n\n // P2 optimization: Pre-compiled middleware chains\n private middlewareChainCache = new Map<string, GravitoMiddleware[]>()\n\n // WebSocket support\n private wsHandler = new BunWebSocketHandler()\n\n route(\n method: HttpMethod,\n path: string,\n ...handlers: (GravitoHandler | GravitoMiddleware)[]\n ): void {\n this.router.add(method, path, handlers as any[])\n }\n\n routes(routes: RouteDefinition[]): void {\n for (const route of routes) {\n this.route(\n route.method,\n route.path,\n ...(route.handlers as (GravitoHandler | GravitoMiddleware)[])\n )\n }\n }\n\n use(path: string, ...middleware: GravitoMiddleware[]): void {\n this.middlewares.push({ path, handlers: middleware })\n // P2 optimization: Clear middleware cache when new middleware added\n this.middlewareChainCache.clear()\n }\n\n useGlobal(...middleware: GravitoMiddleware[]): void {\n this.use('*', ...middleware)\n }\n\n useScoped(scope: string, path: string, ...middleware: GravitoMiddleware[]): void {\n if (path === '*' || path === '*/*') {\n throw new Error(\n `useScoped(): Cannot use wildcard path '*' in Orbit-scoped middleware. ` +\n `Use regular use('*') for global middleware, or specify explicit paths like '${scope}/*'`\n )\n }\n\n const normalizedScope = scope.startsWith('/') ? scope : `/${scope}`\n const fullPath = normalizedScope + (path.startsWith('/') ? '' : `/${path}`)\n\n if (!fullPath.includes(normalizedScope)) {\n throw new Error(\n `useScoped(): Path '${path}' must include scope prefix '${scope}'. ` +\n `Expected path to be under '${scope}' (e.g., '${scope}${path}')`\n )\n }\n\n this.middlewares.push({ path: fullPath, handlers: middleware })\n }\n\n /**\n * P1 Fix: Accurate path pattern matching for middleware\n * Handles wildcards: *, /api/*, /api\n */\n private matchesPath(pattern: string, path: string): boolean {\n if (pattern === '*') {\n return true // Global wildcard\n }\n\n if (!pattern.includes('*')) {\n return path === pattern // Exact match\n }\n\n // Handle /api/* format\n if (pattern.endsWith('/*')) {\n const basePattern = pattern.slice(0, -2) // Remove /*\n return path === basePattern || path.startsWith(`${basePattern}/`)\n }\n\n // Handle /api* format (without slash)\n if (pattern.endsWith('*')) {\n const basePattern = pattern.slice(0, -1)\n return path.startsWith(basePattern)\n }\n\n return false\n }\n\n /**\n * P2 optimization: Pre-compile middleware chain for a path\n */\n private getCompiledMiddlewareChain(path: string): GravitoMiddleware[] {\n // Check cache first\n if (this.middlewareChainCache.has(path)) {\n return this.middlewareChainCache.get(path)!\n }\n\n // Build chain\n const chain: GravitoMiddleware[] = []\n\n for (const mw of this.middlewares) {\n if (this.matchesPath(mw.path, path)) {\n chain.push(...mw.handlers)\n }\n }\n\n // Cache it\n this.middlewareChainCache.set(path, chain)\n\n return chain\n }\n\n /**\n * P0 Fix: Context object pooling to prevent state pollution\n */\n private acquireContext(request: Request): BunContext {\n const ctx = this.contextPool.pop()\n if (ctx) {\n ctx.reset(request)\n return ctx\n }\n return BunContext.create(request) as any\n }\n\n /**\n * P0 Fix: Release context back to pool\n */\n private releaseContext(ctx: BunContext): void {\n if (this.contextPool.length < this.maxPoolSize) {\n // Reset before returning to pool (with dummy request)\n ctx.reset(new Request('http://localhost/'))\n this.contextPool.push(ctx)\n }\n }\n\n mount(path: string, subAdapter: HttpAdapter): void {\n const fullPath = path.endsWith('/') ? `${path}*` : `${path}/*`\n\n // Register a wildcard route for ALL methods\n this.route('all' as HttpMethod, fullPath, async (ctx: GravitoContext) => {\n const url = new URL(ctx.req.url)\n // Strip the mounting path prefix (e.g., '/orbit') from the pathname\n const prefix = path.endsWith('/') ? path.slice(0, -1) : path\n\n if (url.pathname.startsWith(prefix)) {\n // Ensure we handle root correctly (e.g. /orbit needs to become / or similar based on router logic)\n const newPath = url.pathname.slice(prefix.length)\n url.pathname = newPath === '' ? '/' : newPath\n }\n\n // Create a clean request with minimal properties to avoid carrying over internal state\n const newReq = new Request(url.toString(), {\n method: ctx.req.method,\n headers: ctx.req.raw.headers,\n })\n\n const res = await subAdapter.fetch(newReq)\n // Ensure response is stored in context for middleware chain\n if ('res' in ctx) {\n ;(ctx as any).res = res\n }\n return res\n })\n }\n\n createContext(request: Request): GravitoContext {\n return BunContext.create(request)\n }\n\n onError(handler: GravitoErrorHandler): void {\n this.errorHandler = handler\n }\n\n onNotFound(handler: GravitoNotFoundHandler): void {\n this.notFoundHandler = handler\n }\n\n /**\n * 註冊 WebSocket 路由\n */\n registerWebSocketRoute(path: string, handlers: WebSocketRouteHandlers): void {\n this.wsHandler.register(path, handlers)\n }\n\n /**\n * 取得 WebSocket handler(供 Bun.serve 使用)\n */\n get websocket() {\n return this.wsHandler.hasAnyRoute() ? this.wsHandler.toHandler() : undefined\n }\n\n /**\n * Predictive Route Warming (JIT Optimization)\n */\n async warmup(paths: string[]): Promise<void> {\n const dummyReqOpts = { headers: { 'User-Agent': 'Gravito-Warmup/1.0' } }\n\n for (const path of paths) {\n const req = new Request(`http://localhost${path}`, dummyReqOpts)\n await this.fetch(req)\n }\n }\n\n async fetch(request: Request, _server?: unknown): Promise<Response> {\n // WebSocket upgrade check (before context acquisition)\n const url = new URL(request.url)\n if (\n _server != null &&\n typeof (_server as any).upgrade === 'function' &&\n request.headers.get('upgrade')?.toLowerCase() === 'websocket' &&\n this.wsHandler.hasRoute(url.pathname)\n ) {\n const upgraded = (_server as any).upgrade(request, {\n data: {\n path: url.pathname,\n id: crypto.randomUUID(),\n channels: new Set<string>(),\n },\n })\n if (upgraded) {\n return new Response(null, { status: 101 })\n }\n }\n\n // P0 Fix: Use context pool to prevent state pollution\n const ctx = this.acquireContext(request)\n\n try {\n const path = url.pathname\n const method = request.method\n\n const match = this.router.match(method, path)\n\n const handlers: Function[] = []\n\n // P2 optimization: Use pre-compiled middleware chain\n const middlewareChain = this.getCompiledMiddlewareChain(path)\n handlers.push(...middlewareChain)\n\n if (match) {\n if (match.params) {\n ;(ctx.req as BunRequest).setParams(match.params)\n }\n handlers.push(...match.handlers)\n } else if (this.notFoundHandler) {\n // P2 Fix: Add notFound handler only when needed\n handlers.push(this.notFoundHandler)\n }\n\n return await this.executeChain(ctx, handlers)\n } catch (err) {\n if (this.errorHandler) {\n try {\n const response = await this.errorHandler(err as Error, ctx)\n if (response) {\n return response\n }\n } catch (e) {\n console.error('Error handler failed', e)\n }\n }\n console.error(err)\n return new Response('Internal Server Error', { status: 500 })\n } finally {\n // P0 Fix: Always release context back to pool\n this.releaseContext(ctx)\n }\n }\n\n private async executeChain(ctx: GravitoContext, handlers: Function[]): Promise<Response> {\n let index = -1\n\n const dispatch = async (i: number): Promise<Response | undefined> => {\n if (i <= index) {\n throw new Error('next() called multiple times')\n }\n index = i\n\n const fn = handlers[i]\n if (!fn) {\n return undefined\n }\n\n const result = await fn(ctx, async () => {\n const res = await dispatch(i + 1)\n // If next() returned a response, attach it to context so subsequent c.header() calls work\n if (res && (ctx as any).res !== res) {\n ;(ctx as any).res = res\n }\n return res\n })\n\n return result\n }\n\n const finalResponse = await dispatch(0)\n\n if (\n finalResponse &&\n (finalResponse instanceof Response || typeof (finalResponse as Response).status === 'number')\n ) {\n return finalResponse as Response\n }\n\n // Check if context has stored response (from middleware/handler calls to ctx.json() etc)\n if ((ctx as any).res) {\n return (ctx as any).res!\n }\n\n // If no response returned and no notFoundHandler handled it:\n return new Response('Not Found', { status: 404 })\n }\n}\n",
131
- "/**\n * Path segment (key) in a data structure.\n * @public\n */\nexport type PathSegment = string | number\n\n/**\n * Path to a value (dot notation or array of segments).\n * @public\n */\nexport type DataPath = string | readonly PathSegment[]\n\nfunction parsePath(path: DataPath | null | undefined): PathSegment[] {\n if (path === null || path === undefined) {\n return []\n }\n if (typeof path !== 'string') {\n return [...path]\n }\n\n if (path === '') {\n return []\n }\n\n return path.split('.').map((segment) => {\n const n = Number(segment)\n if (Number.isInteger(n) && String(n) === segment) {\n return n\n }\n return segment\n })\n}\n\nfunction getChild(current: unknown, key: PathSegment): unknown {\n if (current === null || current === undefined) {\n return undefined\n }\n\n if (current instanceof Map) {\n return current.get(key)\n }\n\n if (typeof current === 'object' || typeof current === 'function') {\n const record = current as Record<PropertyKey, unknown>\n return record[key as PropertyKey]\n }\n\n return undefined\n}\n\nfunction hasChild(current: unknown, key: PathSegment): boolean {\n if (current === null || current === undefined) {\n return false\n }\n\n if (current instanceof Map) {\n return current.has(key)\n }\n\n if (typeof current === 'object' || typeof current === 'function') {\n const record = current as Record<PropertyKey, unknown>\n return key in record\n }\n\n return false\n}\n\nfunction setChild(current: unknown, key: PathSegment, next: unknown): void {\n if (current === null || current === undefined) {\n throw new TypeError('dataSet target cannot be null or undefined.')\n }\n\n // Prevent prototype pollution\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return\n }\n\n if (current instanceof Map) {\n current.set(key, next)\n return\n }\n\n if (typeof current === 'object' || typeof current === 'function') {\n const record = current as Record<PropertyKey, unknown>\n record[key as PropertyKey] = next\n return\n }\n\n throw new TypeError('dataSet target must be object-like.')\n}\n\n/**\n * Retrieve a value from a deep object using dot notation.\n * @public\n */\nexport function dataGet<TDefault = undefined>(\n target: unknown,\n path: DataPath | null | undefined,\n defaultValue?: TDefault\n): unknown | TDefault {\n const segments = parsePath(path)\n if (segments.length === 0) {\n return target\n }\n\n let current: unknown = target\n for (const segment of segments) {\n current = getChild(current, segment)\n if (current === undefined) {\n return defaultValue as TDefault\n }\n }\n\n return current\n}\n\n/**\n * Check if a key exists in a deep object using dot notation.\n * @public\n */\nexport function dataHas(target: unknown, path: DataPath | null | undefined): boolean {\n const segments = parsePath(path)\n if (segments.length === 0) {\n return true\n }\n\n let current: unknown = target\n for (const segment of segments) {\n if (!hasChild(current, segment)) {\n return false\n }\n current = getChild(current, segment)\n }\n\n return true\n}\n\n/**\n * Set a value in a deep object using dot notation.\n * @public\n */\nexport function dataSet(\n target: unknown,\n path: DataPath,\n setValue: unknown,\n overwrite = true\n): unknown {\n const segments = parsePath(path)\n if (segments.length === 0) {\n return target\n }\n\n let current: unknown = target\n for (let i = 0; i < segments.length - 1; i++) {\n const segment = segments[i] as PathSegment\n const nextSegment = segments[i + 1] as PathSegment\n\n const existing = getChild(current, segment)\n if (\n existing !== undefined &&\n (typeof existing === 'object' || typeof existing === 'function')\n ) {\n current = existing\n continue\n }\n\n const created = typeof nextSegment === 'number' ? [] : {}\n setChild(current, segment, created)\n current = created\n }\n\n const last = segments[segments.length - 1] as PathSegment\n const existingLast = getChild(current, last)\n if (overwrite || existingLast === undefined) {\n setChild(current, last, setValue)\n }\n\n return target\n}\n",
132
- "import { type DataPath, dataGet, dataHas, dataSet } from './data'\n\n/**\n * Array and Collection Helpers.\n * Provides utility methods for array manipulation and deep object access.\n * @public\n */\nexport const Arr = {\n get<TDefault = undefined>(\n target: unknown,\n path: DataPath | null | undefined,\n defaultValue?: TDefault\n ): unknown | TDefault {\n return dataGet(target, path, defaultValue)\n },\n\n has(target: unknown, path: DataPath | null | undefined): boolean {\n return dataHas(target, path)\n },\n\n set(target: unknown, path: DataPath, value: unknown, overwrite = true): unknown {\n return dataSet(target, path, value, overwrite)\n },\n\n wrap<T>(value: T | T[] | null | undefined): T[] {\n if (value === null || value === undefined) {\n return []\n }\n return Array.isArray(value) ? value : [value]\n },\n\n first<T>(items: readonly T[], callback?: (value: T, index: number) => boolean): T | undefined {\n if (!callback) {\n return items[0]\n }\n for (let i = 0; i < items.length; i++) {\n const value = items[i] as T\n if (callback(value, i)) {\n return value\n }\n }\n return undefined\n },\n\n last<T>(items: readonly T[], callback?: (value: T, index: number) => boolean): T | undefined {\n if (!callback) {\n return items.length ? items[items.length - 1] : undefined\n }\n for (let i = items.length - 1; i >= 0; i--) {\n const value = items[i] as T\n if (callback(value, i)) {\n return value\n }\n }\n return undefined\n },\n\n only<T extends Record<string, unknown>>(target: T, keys: readonly string[]): Partial<T> {\n const out: Partial<T> = {}\n for (const key of keys) {\n if (key in target) {\n out[key as keyof T] = target[key] as T[keyof T]\n }\n }\n return out\n },\n\n except<T extends Record<string, unknown>>(target: T, keys: readonly string[]): Partial<T> {\n const out: Partial<T> = {}\n const excluded = new Set(keys)\n for (const [key, value] of Object.entries(target)) {\n if (!excluded.has(key)) {\n out[key as keyof T] = value as T[keyof T]\n }\n }\n return out\n },\n\n flatten(items: unknown[], depth: number = Number.POSITIVE_INFINITY): unknown[] {\n const out: unknown[] = []\n const walk = (value: unknown, currentDepth: number) => {\n if (Array.isArray(value) && currentDepth > 0) {\n for (const v of value) {\n walk(v, currentDepth - 1)\n }\n return\n }\n out.push(value)\n }\n for (const item of items) {\n walk(item, depth)\n }\n return out\n },\n\n pluck<TItem extends Record<string, unknown>>(\n items: readonly TItem[],\n valuePath: DataPath,\n keyPath?: DataPath\n ): unknown[] | Record<string, unknown> {\n if (!keyPath) {\n return items.map((item) => dataGet(item, valuePath))\n }\n\n const out: Record<string, unknown> = {}\n for (const item of items) {\n const key = dataGet(item, keyPath)\n out[String(key)] = dataGet(item, valuePath)\n }\n return out\n },\n\n where<T>(items: readonly T[], callback: (value: T, index: number) => boolean): T[] {\n const out: T[] = []\n for (let i = 0; i < items.length; i++) {\n const value = items[i] as T\n if (callback(value, i)) {\n out.push(value)\n }\n }\n return out\n },\n} as const\n",
133
- "import type { GravitoContext } from '../http/types'\n\n/**\n * Interface for displaying validation errors in views.\n * @public\n */\nexport interface ErrorBag {\n /** Check if a field has errors */\n has(field: string): boolean\n /** Get the first error message for a field (or any first error if no field specified) */\n first(field?: string): string | undefined\n /** Get all error messages for a field */\n get(field: string): string[]\n /** Get all errors for all fields */\n all(): Record<string, string[]>\n /** Check if there are any errors */\n any(): boolean\n /** Get total number of error messages */\n count(): number\n}\n\n/**\n * Create a new ErrorBag instance from raw errors.\n * @public\n */\nexport function createErrorBag(errors: Record<string, string[]>): ErrorBag {\n return {\n has: (field) => (errors[field]?.length ?? 0) > 0,\n first: (field) => {\n if (field) {\n return errors[field]?.[0]\n }\n for (const key of Object.keys(errors)) {\n if (errors[key]?.[0]) {\n return errors[key][0]\n }\n }\n return undefined\n },\n get: (field) => errors[field] ?? [],\n all: () => errors,\n any: () => Object.keys(errors).length > 0,\n count: () => Object.values(errors).flat().length,\n }\n}\n\n/**\n * Helper to retrieve the ErrorBag from session flash data.\n * @public\n */\nexport function errors(c: GravitoContext): ErrorBag {\n const session = c.get('session') as { getFlash?: (key: string) => unknown } | undefined\n const flashed = session?.getFlash?.('errors') ?? {}\n return createErrorBag(flashed as Record<string, string[]>)\n}\n\n/**\n * Helper to retrieve old input value from session flash.\n * @public\n */\nexport function old(c: GravitoContext, field: string, defaultValue?: unknown): unknown {\n const session = c.get('session') as { getFlash?: (key: string) => unknown } | undefined\n const oldInput = session?.getFlash?.('_old_input') ?? {}\n return (oldInput as Record<string, unknown>)[field] ?? defaultValue\n}\n",
134
- "import { randomBytes, randomUUID } from '../compat/crypto'\nimport { getRuntimeKind } from '../runtime/detection'\n\ntype StartsEndsNeedle = string | readonly string[]\n\nfunction splitWords(input: string): string[] {\n const normalized = input\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .trim()\n\n return normalized ? normalized.split(/\\s+/) : []\n}\n\nfunction capitalize(word: string): string {\n if (!word) {\n return word\n }\n return word.charAt(0).toUpperCase() + word.slice(1)\n}\n\n/**\n * String Helper Utilities.\n * Provides methods for string manipulation, case conversion, and UUID generation.\n * @public\n */\nexport const Str = {\n lower(value: string): string {\n return value.toLowerCase()\n },\n\n upper(value: string): string {\n return value.toUpperCase()\n },\n\n startsWith(haystack: string, needles: StartsEndsNeedle): boolean {\n const list = Array.isArray(needles) ? needles : [needles]\n for (const needle of list) {\n if (needle !== '' && haystack.startsWith(needle)) {\n return true\n }\n }\n return false\n },\n\n endsWith(haystack: string, needles: StartsEndsNeedle): boolean {\n const list = Array.isArray(needles) ? needles : [needles]\n for (const needle of list) {\n if (needle !== '' && haystack.endsWith(needle)) {\n return true\n }\n }\n return false\n },\n\n contains(haystack: string, needles: StartsEndsNeedle): boolean {\n const list = Array.isArray(needles) ? needles : [needles]\n for (const needle of list) {\n if (needle !== '' && haystack.includes(needle)) {\n return true\n }\n }\n return false\n },\n\n snake(value: string): string {\n const words = splitWords(value).map((w) => w.toLowerCase())\n return words.join('_')\n },\n\n kebab(value: string): string {\n const words = splitWords(value).map((w) => w.toLowerCase())\n return words.join('-')\n },\n\n studly(value: string): string {\n return splitWords(value)\n .map((w) => capitalize(w.toLowerCase()))\n .join('')\n },\n\n camel(value: string): string {\n const words = splitWords(value).map((w) => w.toLowerCase())\n if (words.length === 0) {\n return ''\n }\n const first = words[0]\n if (first === undefined) {\n return ''\n }\n return first + words.slice(1).map(capitalize).join('')\n },\n\n title(value: string): string {\n return splitWords(value)\n .map((w) => capitalize(w.toLowerCase()))\n .join(' ')\n },\n\n limit(value: string, limit: number, end = '...'): string {\n if (limit < 0) {\n return ''\n }\n if (value.length <= limit) {\n return value\n }\n return value.slice(0, limit) + end\n },\n\n slug(value: string, separator = '-'): string {\n const normalized = value\n .normalize('NFKD')\n .replace(/\\p{Diacritic}/gu, '')\n .toLowerCase()\n\n const escaped = separator.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n return normalized\n .replace(/[^a-z0-9]+/g, separator)\n .replace(new RegExp(`^${escaped}+|${escaped}+$`, 'g'), '')\n },\n\n uuid(): string {\n if (typeof globalThis.crypto?.randomUUID === 'function') {\n return globalThis.crypto.randomUUID()\n }\n return randomUUID()\n },\n\n /**\n * 生成 UUID v7(單調遞增,內含時間戳)。\n *\n * Bun 環境使用原生 Bun.randomUUIDv7() (C++ 實作)。\n * Node.js/Deno 環境使用 RFC 9562 的 JavaScript polyfill。\n *\n * UUID v7 的優勢:\n * - 資料庫主鍵天然有序 → B-tree 索引性能提升 2-10x\n * - 可從 UUID 提取毫秒級時間戳\n * - 仍保持全域唯一性\n *\n * @returns UUID v7 字串\n * @public\n */\n uuidv7(): string {\n const runtime = getRuntimeKind()\n if (runtime === 'bun' && typeof Bun !== 'undefined' && typeof Bun.randomUUIDv7 === 'function') {\n return Bun.randomUUIDv7()\n }\n return generateUUIDv7Fallback()\n },\n\n random(length = 16): string {\n if (length <= 0) {\n return ''\n }\n // base64url: [A-Za-z0-9_-]\n const bytes = randomBytes(Math.ceil((length * 3) / 4) + 2)\n const str = bytes.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '')\n return str.slice(0, length)\n },\n} as const\n\n/**\n * RFC 9562 UUID v7 的 JavaScript polyfill。\n *\n * UUID v7 格式 (128 bits):\n * - 時間戳:unix_ms (48 bits) → bytes[0-5]\n * - 亂數:12 bits → bytes[6-7] (upper 4 bits)\n * - 版本:0111 (v7) → bytes[6] 上 4 bits\n * - 亂數:62 bits → bytes[7-15]\n * - Variant:10xx → bytes[8] 上 2 bits (RFC 4122)\n *\n * @internal\n */\nfunction generateUUIDv7Fallback(): string {\n // 獲取當前毫秒級時間戳\n const timestamp = Date.now()\n\n // 建立 16 bytes 的 Uint8Array\n const bytes = new Uint8Array(16)\n\n // 填充前 6 bytes:時間戳 (big-endian)\n bytes[0] = (timestamp >>> 40) & 0xff\n bytes[1] = (timestamp >>> 32) & 0xff\n bytes[2] = (timestamp >>> 24) & 0xff\n bytes[3] = (timestamp >>> 16) & 0xff\n bytes[4] = (timestamp >>> 8) & 0xff\n bytes[5] = timestamp & 0xff\n\n // 填充後 10 bytes:隨機數\n const randomPart = randomBytes(10)\n for (let i = 0; i < 10; i += 1) {\n bytes[6 + i] = randomPart[i] ?? 0\n }\n\n // 設定 version bits:byte[6] 的上 4 bits = 0111 (v7)\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x70\n\n // 設定 variant bits:byte[8] 的上 2 bits = 10 (RFC 4122)\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80\n\n // 格式化為標準 UUID 字串 (8-4-4-4-12)\n const hex = Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20, 32),\n ].join('-')\n}\n",
135
- "import { HttpException } from './exceptions/HttpException'\nimport type { ContentfulStatusCode } from './http/types'\nimport type { PlanetCore } from './PlanetCore'\nimport type { Router } from './Router'\n\nexport { Arr } from './helpers/Arr'\nexport * from './helpers/data'\nexport * from './helpers/errors'\nexport * from './helpers/response'\nexport { Str } from './helpers/Str'\n\n/**\n * Error subclass used for dump and die functionality.\n * @internal\n */\nexport class DumpDieError extends Error {\n override name = 'DumpDieError'\n\n constructor(public readonly values: unknown[]) {\n super('Execution halted by dd()')\n }\n}\n\n/**\n * Options for dump output\n * @public\n */\nexport type DumpOptions = {\n depth?: number | null\n colors?: boolean\n}\n\nconst defaultDumpOptions: Required<DumpOptions> = {\n depth: null,\n colors: true,\n}\n\n/**\n * Dump data to console for debugging.\n *\n * Uses `console.dir` with configurable depth and colors to provide a\n * readable representation of any value.\n *\n * @param values - One or more values to dump to the console.\n *\n * @example\n * ```typescript\n * dump(user, { meta: 'data' });\n * ```\n *\n * @public\n * @since 3.0.0\n */\nexport function dump(...values: unknown[]): void {\n for (const value of values) {\n console.dir(value, {\n depth: defaultDumpOptions.depth,\n colors: defaultDumpOptions.colors,\n })\n }\n}\n\n/**\n * Dump data to console and exit process (or throw in HTTP context).\n *\n * Short for \"Dump and Die\". In a CLI environment, it exits the process.\n * In an HTTP context (like a web request), it throws a `DumpDieError`\n * which is caught by the exception handler to display the debug output.\n *\n * @param values - One or more values to dump and then die.\n * @throws {DumpDieError} Always throws this error to halt execution.\n *\n * @example\n * ```typescript\n * dd(user.permissions);\n * ```\n *\n * @public\n * @since 3.0.0\n */\nexport function dd(...values: unknown[]): never {\n dump(...values)\n throw new DumpDieError(values)\n}\n\n/**\n * Tap into a value, execute a callback, and return the value.\n *\n * This allows you to perform \"side effects\" on a value without breaking\n * the chain of operations.\n *\n * @param value - The value to tap into.\n * @param callback - A callback that receives the value.\n * @returns The original value.\n *\n * @example\n * ```typescript\n * const user = tap(new User(), (u) => {\n * u.name = 'Alice';\n * u.save();\n * });\n * ```\n *\n * @public\n * @since 3.0.0\n */\nexport function tap<T>(value: T, callback: (value: T) => unknown): T {\n callback(value)\n return value\n}\n\n/**\n * Return the default value of the given value.\n *\n * If the value is a function, it will be executed with the provided arguments\n * and its result will be returned. Otherwise, the value itself is returned.\n * This is useful for handling optional lazy-loaded values.\n *\n * @param valueOrFactory - The value or a factory function.\n * @param args - Arguments to pass to the factory function if it is a function.\n * @returns The resolved value.\n *\n * @example\n * ```typescript\n * value(10); // 10\n * value(() => 10); // 10\n * value((name) => `Hello ${name}`, 'World'); // \"Hello World\"\n * ```\n *\n * @public\n * @since 3.0.0\n */\nexport function value<TArgs extends readonly unknown[], TResult>(\n valueOrFactory: TResult | ((...args: TArgs) => TResult),\n ...args: TArgs\n): TResult {\n if (typeof valueOrFactory === 'function') {\n return (valueOrFactory as (...a: TArgs) => TResult)(...args)\n }\n return valueOrFactory\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== 'object') {\n return false\n }\n const proto = Object.getPrototypeOf(value)\n return proto === Object.prototype || proto === null\n}\n\n/**\n * Determine if the given value is \"blank\".\n *\n * A value is considered blank if it is:\n * - `null` or `undefined`\n * - An empty string or a string containing only whitespace\n * - An empty array\n * - An empty object\n * - An empty Map or Set\n *\n * @param value - The value to check.\n * @returns `true` if the value is blank, `false` otherwise.\n *\n * @example\n * ```typescript\n * blank(''); // true\n * blank(' '); // true\n * blank([]); // true\n * blank({}); // true\n * blank(0); // false\n * ```\n *\n * @public\n * @since 3.0.0\n */\nexport function blank(value: unknown): boolean {\n if (value === null || value === undefined) {\n return true\n }\n\n if (typeof value === 'string') {\n return value.trim().length === 0\n }\n if (Array.isArray(value)) {\n return value.length === 0\n }\n if (value instanceof Map) {\n return value.size === 0\n }\n if (value instanceof Set) {\n return value.size === 0\n }\n if (isPlainObject(value)) {\n return Object.keys(value).length === 0\n }\n\n return false\n}\n\n/**\n * Determine if the given value is \"filled\" (not blank).\n *\n * This is the inverse of `blank()`.\n *\n * @param value - The value to check.\n * @returns `true` if the value is not blank, `false` otherwise.\n *\n * @example\n * ```typescript\n * filled('hello'); // true\n * filled([1, 2, 3]); // true\n * filled(''); // false\n * ```\n *\n * @public\n * @since 3.0.0\n */\nexport function filled(value: unknown): boolean {\n return !blank(value)\n}\n\nfunction toError(error: Error | string | (() => Error)): Error {\n if (typeof error === 'string') {\n return new Error(error)\n }\n if (typeof error === 'function') {\n return error()\n }\n return error\n}\n\n/**\n * Throw an exception if the given condition is true.\n *\n * @param condition - The condition to evaluate.\n * @param error - The exception to throw, a factory function, or an error message string.\n * @throws {Error} If the condition evaluates to true.\n *\n * @example\n * ```typescript\n * throwIf(user.isBanned, 'User is banned from the system');\n * throwIf(count > 100, () => new ValidationError('Too many items'));\n * ```\n *\n * @public\n * @since 3.0.0\n */\nexport function throwIf(\n condition: unknown,\n error: Error | string | (() => Error) = 'Error.'\n): void {\n if (condition) {\n throw toError(error)\n }\n}\n\n/**\n * Throw an exception unless the given condition is true.\n *\n * @param condition - The condition to evaluate.\n * @param error - The exception to throw, a factory function, or an error message string.\n * @throws {Error} If the condition evaluates to false.\n *\n * @example\n * ```typescript\n * throwUnless(user.isAdmin, 'Unauthorized access');\n * ```\n *\n * @public\n * @since 3.0.0\n */\nexport function throwUnless(\n condition: unknown,\n error: Error | string | (() => Error) = 'Error.'\n): void {\n if (!condition) {\n throw toError(error)\n }\n}\n\ntype EnvShape = {\n Bun?: {\n env?: Record<string, string | undefined>\n }\n}\n\n/**\n * Get the value of an environment variable.\n *\n * Automatically detects the runtime environment (Bun or Node.js) to retrieve\n * the variable.\n *\n * @param key - The environment variable name.\n * @param defaultValue - An optional default value to return if the variable is not defined.\n * @returns The environment variable value or the default value.\n *\n * @example\n * ```typescript\n * const debug = env('DEBUG', 'false');\n * const apiKey = env('API_KEY');\n * ```\n *\n * @public\n * @since 3.0.0\n */\nexport function env<TDefault = string | undefined>(key: string, defaultValue?: TDefault) {\n const bunEnv = (globalThis as EnvShape).Bun?.env\n const value = bunEnv?.[key] ?? process.env[key]\n return (value ?? defaultValue) as string | TDefault\n}\n\nlet currentApp: PlanetCore | undefined\n\n/**\n * Set the global application instance.\n *\n * This is used internally during the bootstrap process to provide global\n * access to the application instance via the `app()` helper.\n *\n * @param core - The PlanetCore instance to set as global.\n * @internal\n */\nexport function setApp(core: PlanetCore | null): void {\n currentApp = core ?? undefined\n}\n\n/**\n * Check if the global application instance has been initialized and set.\n *\n * @returns `true` if the application instance is set, `false` otherwise.\n *\n * @public\n * @since 3.0.0\n */\nexport function hasApp(): boolean {\n return currentApp !== undefined\n}\n\n/**\n * Get the global application instance.\n *\n * Provides access to the core application container, configuration, and services.\n *\n * @returns The initialized PlanetCore instance.\n * @throws {Error} If the application has not been initialized.\n *\n * @example\n * ```typescript\n * const core = app();\n * console.log(core.version);\n * ```\n *\n * @public\n * @since 3.0.0\n */\nexport function app(): PlanetCore {\n if (!currentApp) {\n throw new Error('No app is bound. Call setApp(core) once during bootstrap.')\n }\n return currentApp\n}\n\n/**\n * Get a configuration value from the application.\n *\n * Supports dot notation for accessing nested configuration properties.\n *\n * @param key - The configuration key in dot notation (e.g., 'app.name').\n * @param defaultValue - An optional default value to return if the key is not found.\n * @returns The configuration value or the default value.\n *\n * @example\n * ```typescript\n * const appName = config('app.name');\n * const port = config('app.port', 3000);\n * ```\n *\n * @public\n * @since 3.0.0\n */\nexport function config<T = unknown>(key: string, defaultValue?: T): T {\n if (defaultValue === undefined) {\n return app().config.get<T>(key)\n }\n return app().config.get<T>(key, defaultValue)\n}\n\n/**\n * Get the global logger instance.\n *\n * Shortcut for `app().logger`.\n *\n * @returns The application's logger instance.\n *\n * @example\n * ```typescript\n * logger().info('Operation completed successfully');\n * ```\n *\n * @public\n * @since 3.0.0\n */\nexport function logger() {\n return app().logger\n}\n\n/**\n * Get the application's primary router instance.\n *\n * Shortcut for `app().router`.\n *\n * @returns The router instance.\n *\n * @public\n * @since 3.0.0\n */\nexport function router(): Router {\n return app().router\n}\n\n/**\n * Abort the current request with an HTTP exception.\n *\n * Throws an `HttpException` with the specified status code and optional message.\n *\n * @param status - The HTTP status code to return.\n * @param message - An optional custom error message.\n * @throws {HttpException} Always throws this exception.\n *\n * @example\n * ```typescript\n * abort(403, 'You do not have permission to access this resource');\n * ```\n *\n * @public\n * @since 3.0.0\n */\nexport function abort(status: ContentfulStatusCode, message?: string): never {\n if (message === undefined) {\n throw new HttpException(status)\n }\n throw new HttpException(status, { message })\n}\n\n/**\n * Abort the request if the given condition is true.\n *\n * @param condition - The condition to evaluate.\n * @param status - The HTTP status code to return.\n * @param message - An optional custom error message.\n * @throws {HttpException} If the condition is true.\n *\n * @example\n * ```typescript\n * abortIf(!user.isActive, 403, 'Account is deactivated');\n * ```\n *\n * @public\n * @since 3.0.0\n */\nexport function abortIf(condition: unknown, status: ContentfulStatusCode, message?: string): void {\n if (condition) {\n abort(status, message)\n }\n}\n\n/**\n * Abort the request unless the given condition is true.\n *\n * @param condition - The condition to evaluate.\n * @param status - The HTTP status code to return.\n * @param message - An optional custom error message.\n * @throws {HttpException} If the condition is false.\n *\n * @example\n * ```typescript\n * abortUnless(request.hasValidToken(), 401, 'Invalid authentication token');\n * ```\n *\n * @public\n * @since 3.0.0\n */\nexport function abortUnless(\n condition: unknown,\n status: ContentfulStatusCode,\n message?: string\n): void {\n if (!condition) {\n abort(status, message)\n }\n}\n",
136
- "import type { Encrypter } from '../security/Encrypter'\nimport type { GravitoContext } from './types'\n\n/**\n * Options for setting cookies\n * @public\n */\nexport interface CookieOptions {\n path?: string\n domain?: string\n secure?: boolean\n httpOnly?: boolean\n sameSite?: 'Strict' | 'Lax' | 'None'\n maxAge?: number\n expires?: Date\n encrypt?: boolean\n}\n\n/**\n * Utility for managing cookies (request/response/encryption).\n * @public\n */\nexport class CookieJar {\n private queued: Map<string, { value: string; options: CookieOptions }> = new Map()\n\n constructor(private encrypter?: Encrypter) {}\n\n /**\n * Parse cookies from a Cookie header string using Bun's native CookieMap\n * @param header - The Cookie header value\n * @returns Parsed cookies as key-value pairs\n */\n static parseCookies(header: string): Record<string, string> {\n if (!header) {\n return {}\n }\n const cookieMap = new Bun.CookieMap(header)\n const out: Record<string, string> = {}\n for (const [key, value] of cookieMap.entries()) {\n out[key] = value\n }\n return out\n }\n\n /**\n * Queue a cookie to be sent with the response\n */\n queue(name: string, value: string, minutes = 60, options: CookieOptions = {}) {\n const resolved: CookieOptions = {\n path: options.path ?? '/',\n httpOnly: options.httpOnly ?? true,\n sameSite: options.sameSite ?? 'Lax',\n secure: options.secure ?? process.env.NODE_ENV === 'production',\n ...options,\n }\n // Convert minutes to maxAge (seconds)\n if (minutes && !resolved.maxAge) {\n resolved.maxAge = minutes * 60\n }\n\n let finalValue = value\n\n if (resolved.encrypt) {\n if (!this.encrypter) {\n throw new Error('Encryption is not available. Ensure APP_KEY is set.')\n }\n finalValue = this.encrypter.encrypt(value)\n }\n\n this.queued.set(name, { value: finalValue, options: resolved })\n }\n\n /**\n * Make a cookie that lasts \"forever\" (5 years)\n */\n forever(name: string, value: string, options: CookieOptions = {}) {\n this.queue(name, value, 2628000, options)\n }\n\n /**\n * Expire a cookie\n */\n forget(name: string, options: CookieOptions = {}) {\n this.queue(name, '', 0, { ...options, maxAge: 0, expires: new Date(0) })\n }\n\n /**\n * Serialize a cookie to a Set-Cookie header value using Bun's native Cookie API\n */\n private serializeCookie(name: string, value: string, opts: CookieOptions): string {\n return new Bun.Cookie(name, value, {\n path: opts.path,\n domain: opts.domain,\n expires: opts.expires,\n maxAge: opts.maxAge,\n secure: opts.secure,\n httpOnly: opts.httpOnly,\n sameSite: opts.sameSite?.toLowerCase() as 'strict' | 'lax' | 'none' | undefined,\n }).toString()\n }\n\n /**\n * Attach queued cookies to the context\n */\n attach(c: GravitoContext) {\n for (const [name, { value, options }] of this.queued) {\n c.header('Set-Cookie', this.serializeCookie(name, value, options), { append: true })\n }\n }\n}\n",
137
- "import { GravitoException } from './GravitoException'\n\n/**\n * Exception thrown when a database model is not found.\n * @public\n */\nexport class ModelNotFoundException extends GravitoException {\n public readonly model: string\n public readonly id?: string | number\n\n constructor(model: string, id?: string | number) {\n super(404, 'NOT_FOUND', {\n message: `${model} not found.`,\n i18nKey: 'errors.model.not_found',\n i18nParams: { model, id: String(id ?? '') },\n })\n this.model = model\n if (id !== undefined) {\n this.id = id\n }\n }\n}\n",
138
- "import { router } from './helpers'\nimport type { GravitoMiddleware } from './http/types'\nimport type {\n ControllerClass,\n FormRequestClass,\n ResourceOptions,\n RouteDefinitionArg,\n RouteHandler,\n RouteOptions,\n Router,\n} from './Router'\n\n/**\n * Route definition helper.\n * Represents a registered route and allows method chaining for middleware/names.\n * @public\n */\nexport class Route {\n constructor(\n private router: Router,\n private method: string,\n private path: string,\n private options: RouteOptions\n ) {}\n\n /**\n * Name the route\n */\n name(name: string): this {\n this.router.registerName(name, this.method, this.path, this.options)\n return this\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Static Facade Methods\n // ─────────────────────────────────────────────────────────────────────────────\n\n static get(path: string, handler: RouteHandler): Route\n static get(path: string, request: FormRequestClass, handler: RouteHandler): Route\n static get(\n path: string,\n middleware: GravitoMiddleware | GravitoMiddleware[],\n handler: RouteHandler\n ): Route\n static get(\n path: string,\n requestOrHandlerOrMiddleware: RouteDefinitionArg,\n handler?: RouteHandler\n ): Route {\n return router().req('get', path, requestOrHandlerOrMiddleware, handler)\n }\n\n static post(path: string, handler: RouteHandler): Route\n static post(path: string, request: FormRequestClass, handler: RouteHandler): Route\n static post(\n path: string,\n middleware: GravitoMiddleware | GravitoMiddleware[],\n handler: RouteHandler\n ): Route\n static post(\n path: string,\n requestOrHandlerOrMiddleware: RouteDefinitionArg,\n handler?: RouteHandler\n ): Route {\n return router().req('post', path, requestOrHandlerOrMiddleware, handler)\n }\n\n static put(path: string, handler: RouteHandler): Route\n static put(path: string, request: FormRequestClass, handler: RouteHandler): Route\n static put(\n path: string,\n middleware: GravitoMiddleware | GravitoMiddleware[],\n handler: RouteHandler\n ): Route\n static put(\n path: string,\n requestOrHandlerOrMiddleware: RouteDefinitionArg,\n handler?: RouteHandler\n ): Route {\n return router().req('put', path, requestOrHandlerOrMiddleware, handler)\n }\n\n static delete(path: string, handler: RouteHandler): Route\n static delete(path: string, request: FormRequestClass, handler: RouteHandler): Route\n static delete(\n path: string,\n middleware: GravitoMiddleware | GravitoMiddleware[],\n handler: RouteHandler\n ): Route\n static delete(\n path: string,\n requestOrHandlerOrMiddleware: RouteDefinitionArg,\n handler?: RouteHandler\n ): Route {\n return router().req('delete', path, requestOrHandlerOrMiddleware, handler)\n }\n\n static patch(path: string, handler: RouteHandler): Route\n static patch(path: string, request: FormRequestClass, handler: RouteHandler): Route\n static patch(\n path: string,\n middleware: GravitoMiddleware | GravitoMiddleware[],\n handler: RouteHandler\n ): Route\n static patch(\n path: string,\n requestOrHandlerOrMiddleware: RouteDefinitionArg,\n handler?: RouteHandler\n ): Route {\n return router().req('patch', path, requestOrHandlerOrMiddleware, handler)\n }\n\n static resource(name: string, controller: ControllerClass, options: ResourceOptions = {}): void {\n router().resource(name, controller, options)\n }\n\n static prefix(path: string) {\n return router().prefix(path)\n }\n\n static middleware(...handlers: (GravitoMiddleware | GravitoMiddleware[])[]) {\n return router().middleware(...handlers)\n }\n}\n",
139
- "import type { GravitoHandler } from '../http/types'\nimport type { PlanetCore } from '../PlanetCore'\nimport type { ControllerClass } from '../Router'\n\nexport class ControllerDispatcher {\n // Singleton cache for controllers\n private controllers = new Map<ControllerClass, unknown>()\n\n constructor(private core: PlanetCore) {}\n\n /**\n * Resolve Controller Instance and Method\n */\n resolve(CtrlClass: ControllerClass, methodName: string): GravitoHandler {\n let instance = this.controllers.get(CtrlClass)\n if (!instance) {\n instance = new CtrlClass(this.core)\n this.controllers.set(CtrlClass, instance)\n }\n\n const handler = (instance as Record<string, unknown>)[methodName]\n if (typeof handler !== 'function') {\n throw new Error(`Method '${methodName}' not found in controller '${CtrlClass.name}'`)\n }\n\n // The handler in the controller should match GravitoHandler signature (ctx) => Response\n // If it expects (ctx, next), it's middleware.\n // Usually controllers are final endpoints.\n return handler.bind(instance) as GravitoHandler\n }\n}\n",
140
- "import type { GravitoMiddleware } from '../http/types'\nimport { FORM_REQUEST_SYMBOL, type FormRequestClass, type FormRequestLike } from '../Router'\n\n/**\n * WeakMap cache for FormRequest class detection results.\n * Avoids re-instantiating classes on repeated checks.\n */\n// biome-ignore lint/complexity/noBannedTypes: generic Function type needed here\nconst formRequestCache = new WeakMap<Function, boolean>()\n\n/**\n * WeakMap cache for FormRequest instances.\n * Stores singleton instances to avoid re-instantiation on every request.\n */\nconst formRequestInstances = new WeakMap<FormRequestClass, FormRequestLike>()\n\n/**\n * Handles validation of incoming requests using FormRequest classes.\n * Provides mechanisms to detect and convert FormRequest classes into Gravito middleware.\n */\n// biome-ignore lint/complexity/noStaticOnlyClass: utility class designed for static access\nexport class RequestValidator {\n /**\n * Check if a value is a FormRequest class.\n * Optimized with Symbol check, prototype check, and caching.\n * @internal\n */\n static isFormRequestClass(value: unknown): value is FormRequestClass {\n if (typeof value !== 'function') {\n return false\n }\n\n // Fast path 1: Check for Symbol marker (set by @gravito/impulse)\n if ((value as { [FORM_REQUEST_SYMBOL]?: boolean })[FORM_REQUEST_SYMBOL] === true) {\n return true\n }\n\n // Fast path 2: Filter out arrow functions (middleware)\n // Arrow functions do not have a prototype property\n if (!value.prototype) {\n return false\n }\n\n // Check cache to avoid re-computation\n const cached = formRequestCache.get(value)\n if (cached !== undefined) {\n return cached\n }\n\n // Slow path: Duck-type check with instantiation\n try {\n // Check prototype first to avoid instantiation if possible\n if ('validate' in value.prototype && typeof value.prototype.validate === 'function') {\n formRequestCache.set(value, true)\n return true\n }\n\n const instance = new (value as new () => unknown)()\n const isFormRequest =\n instance !== null &&\n typeof instance === 'object' &&\n 'schema' in instance &&\n 'validate' in instance &&\n typeof (instance as FormRequestLike).validate === 'function'\n\n // Cache the result\n formRequestCache.set(value, isFormRequest)\n return isFormRequest\n } catch (error) {\n // Handle different error types for better diagnostics\n if (error instanceof TypeError) {\n // Constructor doesn't exist or has wrong signature\n } else if (error instanceof ReferenceError) {\n console.warn('[Router] FormRequest detection failed: Missing dependencies', error)\n } else {\n console.warn('[Router] Unexpected error during FormRequest detection:', error)\n }\n formRequestCache.set(value, false)\n return false\n }\n }\n\n /**\n * Convert a FormRequest class to middleware.\n * Uses instance caching to avoid re-instantiation on every request.\n * @internal\n */\n static formRequestToMiddleware(RequestClass: FormRequestClass): GravitoMiddleware {\n // Get or create cached instance\n let request = formRequestInstances.get(RequestClass)\n if (!request) {\n request = new RequestClass()\n if (typeof request.validate !== 'function') {\n throw new Error('Invalid FormRequest: validate() is missing.')\n }\n formRequestInstances.set(RequestClass, request)\n }\n\n return async (ctx, next) => {\n const result = await request?.validate?.(ctx)\n\n if (!result) {\n await next()\n return undefined\n }\n\n if (!result.success) {\n const errorCode = (result.error as { error?: { code?: string } })?.error?.code\n const status = errorCode === 'AUTHORIZATION_ERROR' ? 403 : 422\n return ctx.json(result.error, status)\n }\n\n ctx.set('validated', result.data)\n await next()\n return undefined\n }\n }\n}\n",
141
- "import { ModelNotFoundException } from './exceptions/ModelNotFoundException'\nimport type { GravitoHandler, GravitoMiddleware, HttpMethod, ProxyOptions } from './http/types'\nimport type { PlanetCore } from './PlanetCore'\nimport { Route } from './Route'\nimport { ControllerDispatcher } from './router/ControllerDispatcher'\nimport { RequestValidator } from './router/RequestValidator'\n\n/**\n * Type for Controller Class Constructor\n * @public\n */\nexport type ControllerClass = new (core: PlanetCore) => any\n\n/**\n * Handler can be a function or [Class, 'methodName']\n * @public\n */\nexport type RouteHandler = GravitoHandler | [ControllerClass, string]\n\n/**\n * Interface for FormRequest classes (from @gravito/impulse).\n * Used for duck-typing detection without hard dependency.\n */\nexport interface FormRequestLike {\n schema: unknown\n source?: string\n /**\n * Validate the request context.\n * @param ctx - The request context\n */\n validate?(ctx: unknown): Promise<{ success: boolean; data?: unknown; error?: unknown }>\n}\n\n/**\n * Type for FormRequest class constructor\n * @public\n */\nexport type FormRequestClass = new () => FormRequestLike\n\n/**\n * Symbol to mark FormRequest classes for fast identification.\n * FormRequest classes from @gravito/impulse should set this symbol.\n */\n/**\n * Symbol to mark FormRequest classes for fast identification.\n * FormRequest classes from @gravito/impulse should set this symbol.\n * @public\n */\nexport const FORM_REQUEST_SYMBOL = Symbol.for('gravito.formRequest')\n\n/**\n * Options for route definitions\n * @public\n */\nexport interface RouteOptions {\n /** Route prefix path */\n prefix?: string\n /** Domain/Hostname constraint */\n domain?: string\n /** Middleware stack for the route */\n middleware?: GravitoMiddleware[]\n}\n\n/**\n * Common routing handler argument definition\n * @public\n */\nexport type RouteDefinitionArg =\n | FormRequestClass\n | RouteHandler\n | GravitoMiddleware\n | GravitoMiddleware[]\n\n/**\n * Interface merging for HTTP routing methods to establish overloads\n * without duplicate bodies.\n * @public\n */\nexport interface RoutingMethods {\n get(path: string, handler: RouteHandler): Route\n get(path: string, request: FormRequestClass, handler: RouteHandler): Route\n get(\n path: string,\n middleware: GravitoMiddleware | GravitoMiddleware[],\n handler: RouteHandler\n ): Route\n\n post(path: string, handler: RouteHandler): Route\n post(path: string, request: FormRequestClass, handler: RouteHandler): Route\n post(\n path: string,\n middleware: GravitoMiddleware | GravitoMiddleware[],\n handler: RouteHandler\n ): Route\n\n put(path: string, handler: RouteHandler): Route\n put(path: string, request: FormRequestClass, handler: RouteHandler): Route\n put(\n path: string,\n middleware: GravitoMiddleware | GravitoMiddleware[],\n handler: RouteHandler\n ): Route\n\n delete(path: string, handler: RouteHandler): Route\n delete(path: string, request: FormRequestClass, handler: RouteHandler): Route\n delete(\n path: string,\n middleware: GravitoMiddleware | GravitoMiddleware[],\n handler: RouteHandler\n ): Route\n\n patch(path: string, handler: RouteHandler): Route\n patch(path: string, request: FormRequestClass, handler: RouteHandler): Route\n patch(\n path: string,\n middleware: GravitoMiddleware | GravitoMiddleware[],\n handler: RouteHandler\n ): Route\n}\n\n/**\n * RouteGroup\n * Helper class for chained route configuration (prefix, domain, etc.)\n */\n/**\n * RouteGroup\n * Helper class for chained route configuration (prefix, domain, etc.)\n * @public\n */\n// biome-ignore lint/suspicious/noUnsafeDeclarationMerging: intentionally merged for dynamic mixins\nexport interface RouteGroup extends RoutingMethods {}\n// biome-ignore lint/suspicious/noUnsafeDeclarationMerging: intentionally merged for dynamic mixins\nexport class RouteGroup {\n constructor(\n private router: Router,\n private options: RouteOptions\n ) {}\n\n /**\n * Add a prefix to the current group\n */\n prefix(path: string): RouteGroup {\n return new RouteGroup(this.router, {\n ...this.options,\n prefix: (this.options.prefix || '') + path,\n })\n }\n\n /**\n * Add middleware to the current group.\n * Accepts individual handlers or arrays of handlers.\n */\n middleware(...handlers: (GravitoMiddleware | GravitoMiddleware[])[]): RouteGroup {\n const flattened = handlers.flat()\n return new RouteGroup(this.router, {\n ...this.options,\n middleware: [...(this.options.middleware || []), ...flattened],\n })\n }\n\n /**\n * Define routes within this group\n */\n group(callback: (router: Router | RouteGroup) => void): void {\n callback(this)\n }\n\n // Proxy HTTP methods to the main router with options merged\n // (Method implementations dynamically attached below)\n\n resource(name: string, controller: ControllerClass, options: ResourceOptions = {}): void {\n const actions: ResourceAction[] = [\n 'index',\n 'create',\n 'store',\n 'show',\n 'edit',\n 'update',\n 'destroy',\n ]\n const map: Record<ResourceAction, { method: HttpMethod; path: string }> = {\n index: { method: 'get', path: `/${name}` },\n create: { method: 'get', path: `/${name}/create` },\n store: { method: 'post', path: `/${name}` },\n show: { method: 'get', path: `/${name}/:id` },\n edit: { method: 'get', path: `/${name}/:id/edit` },\n update: { method: 'put', path: `/${name}/:id` },\n destroy: { method: 'delete', path: `/${name}/:id` },\n }\n\n const allowed = actions.filter((action) => {\n if (options.only) {\n return options.only.includes(action)\n }\n if (options.except) {\n return !options.except.includes(action)\n }\n return true\n })\n\n for (const action of allowed) {\n const { method, path } = map[action]\n\n if (action === 'update') {\n this.router\n .req('put', path, [controller, action], undefined, this.options)\n .name(`${name}.${action}`)\n this.router.req('patch', path, [controller, action], undefined, this.options)\n } else {\n this.router\n .req(method, path, [controller, action], undefined, this.options)\n .name(`${name}.${action}`)\n }\n }\n }\n\n /**\n * Register a route that forwards requests to another URL (Gateway Proxy).\n * @param method - HTTP method or 'all'\n * @param path - Local route path\n * @param target - Remote URL or base URL to forward to\n * @param options - Optional proxy options\n */\n forward(\n method: HttpMethod | HttpMethod[] | 'all',\n path: string,\n target: string,\n options?: ProxyOptions\n ): void {\n const handler: GravitoHandler = (ctx) => ctx.forward(target, options)\n const methods =\n method === 'all'\n ? (['get', 'post', 'put', 'delete', 'patch', 'options', 'head'] as HttpMethod[])\n : Array.isArray(method)\n ? method\n : [method]\n\n for (const m of methods) {\n this.router.req(m, path, handler, undefined, this.options)\n }\n }\n}\n\n/**\n * Gravito Router\n *\n * Provides a Laravel-like fluent API for defining routes.\n * Supports:\n * - Controller-based routing: router.get('/', [HomeController, 'index'])\n * - Route groups with prefixes: router.prefix('/api').group(...)\n * - Domain-based routing: router.domain('api.app').group(...)\n * - Middleware chaining: router.middleware(auth).group(...)\n * - FormRequest validation: router.post('/users', StoreUserRequest, [UserController, 'store'])\n * - Inline Middleware: router.get('/users', authMiddleware, [UserController, 'index'])\n */\n// biome-ignore lint/suspicious/noUnsafeDeclarationMerging: intentionally merged for dynamic mixins\nexport interface Router extends RoutingMethods {}\n// biome-ignore lint/suspicious/noUnsafeDeclarationMerging: intentionally merged for dynamic mixins\nexport class Router {\n // Internal list of all registered routes (for scanning and debugging)\n public routes: Array<{ method: string; path: string; domain?: string }> = []\n\n private dispatcher: ControllerDispatcher\n\n private namedRoutes = new Map<\n string,\n { method: string; path: string; domain?: string | undefined }\n >()\n private bindings = new Map<string, (id: string) => Promise<unknown>>()\n\n /**\n * Compile all registered routes into a flat array for caching or manifest generation.\n * Optimized: O(n) complexity using Set for lookups instead of O(n²) with Array.some()\n */\n compile() {\n const compiled: Array<{\n method: string\n path: string\n name?: string\n domain?: string | undefined\n }> = []\n\n // Create a map of path+method to name for quick lookup\n const nameMap = new Map<string, string>()\n for (const [name, info] of this.namedRoutes) {\n nameMap.set(`${info.method.toUpperCase()}:${info.path}`, name)\n }\n\n // Use Set to track compiled routes for O(1) lookup\n const compiledKeys = new Set<string>()\n\n // First pass: compile registered routes\n for (const route of this.routes) {\n const method = route.method.toUpperCase()\n const key = `${method}:${route.path}`\n\n compiledKeys.add(key)\n compiled.push({\n method,\n path: route.path,\n domain: route.domain,\n name: nameMap.get(key),\n })\n }\n\n // Second pass: include named routes that might not be in this.routes (e.g. from loaded manifest)\n // Now using O(1) Set lookup instead of O(n) Array.some()\n for (const [name, info] of this.namedRoutes) {\n const key = `${info.method.toUpperCase()}:${info.path}`\n\n if (!compiledKeys.has(key)) {\n compiled.push({\n name,\n method: info.method.toUpperCase(),\n path: info.path,\n domain: info.domain,\n })\n }\n }\n\n return compiled\n }\n\n /**\n * Register a named route\n */\n registerName(name: string, method: string, path: string, options: RouteOptions = {}): void {\n const fullPath = (options.prefix || '') + path\n this.namedRoutes.set(name, {\n method: method.toUpperCase(),\n path: fullPath,\n domain: options.domain,\n })\n }\n\n /**\n * Generate a URL from a named route.\n *\n * Replaces route parameters (e.g., `:id`) with provided values and appends\n * query parameters to the URL.\n *\n * @param name - The name of the route.\n * @param params - Key-value pairs for route parameters.\n * @param query - Key-value pairs for query string parameters.\n * @returns The generated URL string.\n * @throws Error if the named route is not found or if a required parameter is missing.\n *\n * @example\n * ```typescript\n * const url = router.url('users.show', { id: 1 }, { tab: 'profile' });\n * // Result: \"/users/1?tab=profile\"\n * ```\n */\n url(\n name: string,\n params: Record<string, string | number> = {},\n query: Record<string, string | number | boolean | null | undefined> = {}\n ): string {\n const route = this.namedRoutes.get(name)\n if (!route) {\n throw new Error(`Named route '${name}' not found`)\n }\n\n let path = route.path\n path = path.replace(/:([A-Za-z0-9_]+)/g, (_, key: string) => {\n const value = params[key]\n if (value === undefined || value === null) {\n throw new Error(`Missing route param '${key}' for route '${name}'`)\n }\n return encodeURIComponent(String(value))\n })\n\n const qs = new URLSearchParams()\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) {\n continue\n }\n qs.set(k, String(v))\n }\n\n const suffix = qs.toString()\n return suffix ? `${path}?${suffix}` : path\n }\n\n /**\n * Export named routes as a serializable manifest (for caching).\n */\n exportNamedRoutes(): Record<string, { method: string; path: string; domain?: string }> {\n return Object.fromEntries(this.namedRoutes.entries()) as Record<\n string,\n { method: string; path: string; domain?: string }\n >\n }\n\n /**\n * Load named routes from a manifest (for caching).\n */\n loadNamedRoutes(\n manifest: Record<string, { method: string; path: string; domain?: string }>\n ): void {\n this.namedRoutes = new Map(Object.entries(manifest))\n }\n\n /**\n * Register a route model binding.\n *\n * Automatically resolves a route parameter to an object using the provided\n * resolver function. The resolved object is then available in the request context.\n *\n * @param param - The name of the route parameter to bind.\n * @param resolver - An async function that resolves the parameter value to an object.\n *\n * @example\n * ```typescript\n * router.bind('user', async (id) => await User.find(id));\n * ```\n */\n bind(param: string, resolver: (id: string) => Promise<unknown>) {\n this.bindings.set(param, resolver)\n }\n\n /**\n * Register a route model binding for a Model class.\n */\n model(param: string, modelClass: unknown) {\n this.bind(param, async (id) => {\n // Assuming modelClass has a `find` method (Active Record pattern)\n if (\n modelClass &&\n typeof modelClass === 'object' &&\n 'find' in modelClass &&\n typeof (modelClass as { find?: (id: string) => Promise<unknown> }).find === 'function'\n ) {\n const instance = await (modelClass as { find: (id: string) => Promise<unknown> }).find(id)\n if (!instance) {\n throw new Error('ModelNotFound') // Will be caught by 404 handler if we handle it\n }\n return instance\n }\n throw new Error(`Invalid model class for binding '${param}'`)\n })\n }\n\n constructor(private core: PlanetCore) {\n this.dispatcher = new ControllerDispatcher(core)\n\n // Register global middleware for bindings\n // Optimized: Only resolve bindings for params that exist in the current route\n this.core.adapter.useGlobal(async (c, next) => {\n // Early exit if no bindings registered\n if (this.bindings.size === 0) {\n return await next()\n }\n\n const routeModels = (c.get('routeModels') ?? {}) as Record<string, unknown>\n let hasResolvedModels = false\n\n // Iterate over request params (O(P)) instead of bindings (O(B))\n // This is significantly faster when there are many bindings but few params in current route\n const params = c.req.params()\n\n for (const [param, value] of Object.entries(params)) {\n const resolver = this.bindings.get(param)\n\n if (!resolver) {\n continue\n }\n\n try {\n const resolved = await resolver(value)\n routeModels[param] = resolved\n hasResolvedModels = true\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : undefined\n if (message === 'ModelNotFound') {\n throw new ModelNotFoundException(param, value)\n }\n throw err\n }\n }\n\n // Only set routeModels if we actually resolved something\n if (hasResolvedModels) {\n c.set('routeModels', routeModels)\n }\n\n return await next()\n })\n }\n\n /**\n * Start a route group with a prefix\n */\n prefix(path: string): RouteGroup {\n return new RouteGroup(this, { prefix: path })\n }\n\n /**\n * Start a route group with a domain constraint\n */\n domain(host: string): RouteGroup {\n return new RouteGroup(this, { domain: host })\n }\n\n /**\n * Start a route group with middleware.\n * Accepts individual handlers or arrays of handlers.\n */\n middleware(...handlers: (GravitoMiddleware | GravitoMiddleware[])[]): RouteGroup {\n return new RouteGroup(this, { middleware: handlers.flat() })\n }\n\n // Implementation of get, post, put, delete, patch are dynamically mixed-in below.\n\n /**\n * Register a route that forwards requests to another URL (Gateway Proxy).\n * @param method - HTTP method or 'all'\n * @param path - Local route path\n * @param target - Remote URL or base URL to forward to\n * @param options - Optional proxy options\n */\n forward(\n method: HttpMethod | HttpMethod[] | 'all',\n path: string,\n target: string,\n options?: ProxyOptions\n ): void {\n const handler: GravitoHandler = (ctx) => ctx.forward(target, options)\n const methods =\n method === 'all'\n ? (['get', 'post', 'put', 'delete', 'patch', 'options', 'head'] as HttpMethod[])\n : Array.isArray(method)\n ? method\n : [method]\n\n for (const m of methods) {\n this.req(m, path, handler)\n }\n }\n\n /**\n * Register a resource route (RESTful).\n *\n * Automatically creates multiple routes for a resource (index, create, store,\n * show, edit, update, destroy) mapping to specific controller methods.\n *\n * @param name - The resource name (e.g., 'users').\n * @param controller - The controller class handling the resource.\n * @param options - Optional constraints (only/except) for resource actions.\n *\n * @example\n * ```typescript\n * router.resource('photos', PhotoController);\n * ```\n */\n resource(name: string, controller: ControllerClass, options: ResourceOptions = {}): void {\n const actions: ResourceAction[] = [\n 'index',\n 'create',\n 'store',\n 'show',\n 'edit',\n 'update',\n 'destroy',\n ]\n const map: Record<ResourceAction, { method: HttpMethod; path: string }> = {\n index: { method: 'get', path: `/${name}` },\n create: { method: 'get', path: `/${name}/create` },\n store: { method: 'post', path: `/${name}` },\n show: { method: 'get', path: `/${name}/:id` },\n edit: { method: 'get', path: `/${name}/:id/edit` },\n update: { method: 'put', path: `/${name}/:id` },\n destroy: { method: 'delete', path: `/${name}/:id` },\n }\n\n const allowed = actions.filter((action) => {\n if (options.only) {\n return options.only.includes(action)\n }\n if (options.except) {\n return !options.except.includes(action)\n }\n return true\n })\n\n for (const action of allowed) {\n const { method, path } = map[action]\n\n if (action === 'update') {\n this.req('put', path, [controller, action]).name(`${name}.${action}`)\n this.req('patch', path, [controller, action])\n } else {\n this.req(method, path, [controller, action]).name(`${name}.${action}`)\n }\n }\n }\n\n /**\n * Internal Request Registration\n */\n req(\n method: HttpMethod,\n path: string,\n requestOrHandlerOrMiddleware: RouteDefinitionArg,\n handler?: RouteHandler,\n options: RouteOptions = {}\n ): Route {\n // 1. Resolve Path\n const fullPath = (options.prefix || '') + path\n console.log(`[Router] Registering ${method.toUpperCase()} ${fullPath}`)\n\n // 2. Determine if FormRequest or Middleware is provided\n let formRequestMiddleware: GravitoMiddleware | null = null\n let routeMiddleware: GravitoMiddleware[] = []\n let finalRouteHandler: RouteHandler\n\n if (handler !== undefined) {\n // Three arguments: (path, middleware/request, handler)\n if (RequestValidator.isFormRequestClass(requestOrHandlerOrMiddleware)) {\n formRequestMiddleware = RequestValidator.formRequestToMiddleware(\n requestOrHandlerOrMiddleware\n )\n } else {\n // Assume middleware (single or array)\n const middleware = requestOrHandlerOrMiddleware as GravitoMiddleware | GravitoMiddleware[]\n\n if (Array.isArray(middleware)) {\n routeMiddleware = middleware\n } else {\n routeMiddleware = [middleware]\n }\n }\n finalRouteHandler = handler\n } else {\n // Two arguments: (path, handler)\n finalRouteHandler = requestOrHandlerOrMiddleware as RouteHandler\n }\n\n // 3. Resolve Handler (Controller vs Function)\n let resolvedHandler: GravitoHandler\n\n if (Array.isArray(finalRouteHandler)) {\n const [CtrlClass, methodName] = finalRouteHandler\n resolvedHandler = this.dispatcher.resolve(CtrlClass, methodName)\n } else {\n resolvedHandler = finalRouteHandler as GravitoHandler\n }\n\n // 4. Prepare Handlers Stack\n const handlers: (GravitoHandler | GravitoMiddleware)[] = []\n\n if (options.middleware) {\n handlers.push(...options.middleware)\n }\n if (formRequestMiddleware) {\n handlers.push(formRequestMiddleware)\n }\n if (routeMiddleware.length > 0) {\n handlers.push(...routeMiddleware)\n }\n handlers.push(resolvedHandler)\n\n // 5. Register with Adapter\n // If domain constraint exists, we wrap everything in a check\n if (options.domain) {\n // Prepend domain check\n const domainCheck: GravitoMiddleware = async (c, next) => {\n if (c.req.header('host') !== options.domain) {\n // If domain mismatch, return 404 immediately.\n // In a more complex router, this would backtrack, but for now this is correct.\n return c.text('Not Found', 404) as any\n }\n await next()\n }\n\n // Prepend domain check\n handlers.unshift(domainCheck)\n }\n\n this.routes.push({ method: method.toUpperCase(), path: fullPath, domain: options.domain })\n this.core.adapter.route(method, fullPath, ...(handlers as any[]))\n\n return new Route(this, method, fullPath, options)\n }\n}\n\n/**\n * Standard RESTful resource action names.\n * @public\n */\nexport type ResourceAction = 'index' | 'create' | 'store' | 'show' | 'edit' | 'update' | 'destroy'\n\n/**\n * Options for resource route registration.\n * @public\n */\nexport interface ResourceOptions {\n only?: ResourceAction[]\n except?: ResourceAction[]\n}\n\nconst METHODS: ('get' | 'post' | 'put' | 'delete' | 'patch')[] = [\n 'get',\n 'post',\n 'put',\n 'delete',\n 'patch',\n]\n\nMETHODS.forEach((method) => {\n RouteGroup.prototype[method] = function (\n this: RouteGroup,\n path: string,\n arg1: RouteDefinitionArg,\n handler?: RouteHandler\n ) {\n return (this as any).router.req(method, path, arg1, handler, (this as any).options)\n }\n\n Router.prototype[method] = function (\n this: Router,\n path: string,\n arg1: RouteDefinitionArg,\n handler?: RouteHandler\n ) {\n return this.req(method, path, arg1, handler)\n }\n})\n",
142
- "import crypto from 'node:crypto'\nimport { NativeHasher } from '../ffi'\n\n/**\n * Options for the Encrypter class.\n * @public\n */\nexport interface EncrypterOptions {\n key: string\n cipher?: string\n}\n\n/**\n * Service for OpenSSL encryption/decryption.\n * Compatible with Laravel's encryption format.\n * @public\n */\nexport class Encrypter {\n private algorithm: string\n private key: Buffer\n\n constructor(options: EncrypterOptions) {\n this.algorithm = options.cipher || 'aes-256-cbc'\n\n if (options.key.startsWith('base64:')) {\n this.key = Buffer.from(options.key.substring(7), 'base64')\n } else {\n this.key = Buffer.from(options.key)\n }\n\n // Verify key length\n if (this.algorithm === 'aes-128-cbc' && this.key.length !== 16) {\n throw new Error('The key must be 16 bytes (128 bits) for AES-128-CBC.')\n }\n if (this.algorithm === 'aes-256-cbc' && this.key.length !== 32) {\n throw new Error('The key must be 32 bytes (256 bits) for AES-256-CBC.')\n }\n }\n\n /**\n * Encrypt a value\n */\n encrypt(value: unknown, serialize = true): string {\n const iv = crypto.randomBytes(16)\n const cipher = crypto.createCipheriv(this.algorithm, this.key, iv)\n\n const stringValue = serialize ? JSON.stringify(value) : String(value)\n\n let encrypted = cipher.update(stringValue, 'utf8', 'base64')\n encrypted += cipher.final('base64')\n\n const mac = this.hash(iv.toString('base64'), encrypted)\n\n const payload = {\n iv: iv.toString('base64'),\n value: encrypted,\n mac,\n tag: '', // AES-CBC doesn't produce an auth tag, but GCM does. Keeping structure standard.\n }\n\n return Buffer.from(JSON.stringify(payload)).toString('base64')\n }\n\n /**\n * Decrypt a value\n */\n decrypt(payload: string, deserialize = true): unknown {\n const json = JSON.parse(Buffer.from(payload, 'base64').toString('utf8'))\n\n if (!this.validPayload(json)) {\n throw new Error('The payload is invalid.')\n }\n\n if (!this.validMac(json)) {\n throw new Error('The MAC is invalid.')\n }\n\n const iv = Buffer.from(json.iv, 'base64')\n const decipher = crypto.createDecipheriv(this.algorithm, this.key, iv)\n\n let decrypted = decipher.update(json.value, 'base64', 'utf8')\n decrypted += decipher.final('utf8')\n\n return deserialize ? JSON.parse(decrypted) : decrypted\n }\n\n private hash(iv: string, value: string): string {\n return NativeHasher.hmacSha256(this.key.toString(), iv + value)\n }\n\n private validPayload(payload: unknown): payload is { iv: string; value: string; mac: string } {\n return (\n typeof payload === 'object' &&\n payload !== null &&\n 'iv' in payload &&\n 'value' in payload &&\n 'mac' in payload\n )\n }\n\n private validMac(payload: { iv: string; value: string; mac: string }): boolean {\n const calculated = this.hash(payload.iv, payload.value)\n return crypto.timingSafeEqual(Buffer.from(calculated), Buffer.from(payload.mac))\n }\n\n /**\n * Generate a new key\n */\n static generateKey(cipher = 'aes-256-cbc'): string {\n const bytes = cipher === 'aes-128-cbc' ? 16 : 32\n return `base64:${crypto.randomBytes(bytes).toString('base64')}`\n }\n}\n",
143
- "/**\n * Hashing interface\n */\nexport interface Hasher {\n /**\n * Hash the given value\n */\n make(value: string, options?: Record<string, unknown>): Promise<string>\n\n /**\n * Check the given plain value against a hash\n */\n check(value: string, hashedValue: string): Promise<boolean>\n\n /**\n * Check if the given hash has been hashed using the given options\n */\n needsRehash(hashedValue: string, options?: Record<string, unknown>): boolean\n}\n\n/**\n * Bun Hasher\n * Uses Bun's native password hashing (bcrypt by default)\n */\nexport class BunHasher implements Hasher {\n async make(\n value: string,\n options?: { algorithm?: 'bcrypt' | 'argon2id'; cost?: number }\n ): Promise<string> {\n const bun = Bun as unknown as {\n password: {\n hash(v: string, o?: unknown): Promise<string>\n }\n }\n return await bun.password.hash(value, options)\n }\n\n async check(value: string, hashedValue: string): Promise<boolean> {\n const bun = Bun as unknown as {\n password: {\n verify(v: string, h: string): Promise<boolean>\n }\n }\n return await bun.password.verify(value, hashedValue)\n }\n\n needsRehash(_hashedValue: string, _options?: Record<string, unknown>): boolean {\n return false\n }\n}\n",
144
- "/**\n * @fileoverview PlanetCore - The Heart of Gravito Framework\n *\n * The micro-kernel that orchestrates the entire Galaxy Architecture.\n * Manages HTTP routing, middleware, error handling, and orbit integration.\n *\n * @module @gravito/core\n * @since 1.0.0\n */\n\nimport { type HttpAdapter, isHttpAdapter } from './adapters/types'\nimport { ConfigManager } from './ConfigManager'\nimport { Container } from './Container'\nimport { ErrorHandler } from './ErrorHandler'\nimport { EventManager } from './EventManager'\nimport { ObservableHookManager } from './events/observability/ObservableHookManager'\nimport { OTelEventMetrics } from './events/observability/OTelEventMetrics'\nimport {\n type RegisterGlobalErrorHandlersOptions,\n registerGlobalErrorHandlers,\n} from './GlobalErrorHandlers'\nimport { HookManager } from './HookManager'\nimport type { fail } from './helpers/response'\nimport type { ContentfulStatusCode, GravitoContext } from './http/types'\nimport { ConsoleLogger, type Logger } from './Logger'\nimport {\n createNoOpObservabilityProvider,\n type ObservabilityProvider,\n} from './observability/contracts'\nimport type { ServiceProvider } from './ServiceProvider'\n\n/**\n * CacheService interface for orbit-injected cache\n * Orbits implementing cache should conform to this interface\n */\nexport interface CacheService {\n get<T = unknown>(key: string): Promise<T | null>\n set(key: string, value: unknown, ttl?: number): Promise<void>\n delete(key: string): Promise<void>\n clear(): Promise<void>\n remember<T>(key: string, ttl: number, callback: () => Promise<T>): Promise<T>\n}\n\n/**\n * Interface for View Rendering Service\n * @public\n */\nexport interface ViewService {\n render(view: string, data?: Record<string, unknown>, options?: Record<string, unknown>): string\n}\n\n/**\n * Context passed to error handlers\n * @public\n */\nexport type ErrorHandlerContext = {\n core: PlanetCore\n c: GravitoContext\n error: unknown\n isProduction: boolean\n accept: string\n wantsHtml: boolean\n status: ContentfulStatusCode\n payload: ReturnType<typeof fail>\n logLevel?: 'error' | 'warn' | 'info' | 'none'\n logMessage?: string\n html?: {\n templates: string[]\n data: Record<string, unknown>\n }\n}\n\n/**\n * Interface for Gravito Orbit (Plugin/Module)\n * @public\n */\nexport interface GravitoOrbit {\n install(core: PlanetCore): void | Promise<void>\n}\n\n/**\n * Configuration for booting PlanetCore\n * @public\n */\nexport type GravitoConfig = {\n logger?: Logger\n config?: Record<string, unknown>\n orbits?: (new () => GravitoOrbit)[] | GravitoOrbit[]\n /**\n * HTTP Adapter to use. Defaults to BunNativeAdapter in Bun environments.\n * In non-Bun environments, must be provided explicitly.\n * @example\n * ```typescript\n * import { PhotonAdapter } from '@gravito/photon/adapter'\n * new PlanetCore({ adapter: new PhotonAdapter() })\n * ```\n * See https://gravito.dev/guides/http-adapters for available adapters.\n * @since 2.0.0\n */\n adapter?: HttpAdapter\n /**\n * Dependency Injection Container. If provided, PlanetCore will use this\n * container instead of creating a new one. This allows sharing a container\n * between Application and PlanetCore.\n * @since 2.0.0\n */\n container?: Container\n\n /**\n * Observability configuration for event system.\n * @since 2.1.0\n */\n observability?: {\n /**\n * Enable event system observability (metrics, tracing).\n * @default false\n */\n enabled?: boolean\n /**\n * Enable OpenTelemetry distributed tracing.\n * @default false\n */\n tracing?: boolean\n /**\n * Prefix for metric names.\n * @default 'gravito_event_'\n */\n metricsPrefix?: string\n /**\n * Prometheus metrics configuration.\n */\n prometheus?: {\n /**\n * Enable Prometheus metrics endpoint.\n * @default true\n */\n enabled?: boolean\n /**\n * Port for Prometheus metrics endpoint.\n * @default 9090\n */\n port?: number\n /**\n * Endpoint path for metrics.\n * @default '/metrics'\n */\n endpoint?: string\n }\n }\n\n /**\n * Observability provider for distributed tracing and metrics.\n * If provided, this will be used instead of the default OTel setup.\n * @since 2.2.0\n */\n observabilityProvider?: ObservabilityProvider\n}\n\nimport { BunNativeAdapter } from './adapters/bun/BunNativeAdapter'\nimport { setApp } from './helpers'\nimport { CookieJar } from './http/CookieJar'\nimport { Router } from './Router'\nimport { Encrypter } from './security/Encrypter'\nimport { BunHasher } from './security/Hasher'\n\n/**\n * PlanetCore - The Heart of Gravito Framework\n *\n * The micro-kernel that orchestrates the entire Galaxy Architecture.\n * Manages HTTP routing, middleware, error handling, and orbit integration.\n * @public\n */\nexport class PlanetCore {\n /**\n * The HTTP adapter used by this core instance.\n * @since 2.0.0\n */\n private _adapter!: HttpAdapter\n\n /**\n * Access the underlying Photon app instance.\n * @deprecated Use adapter methods for new code. This property is kept for backward compatibility.\n */\n public get app(): unknown {\n return this._adapter.native\n }\n\n /**\n * Get the HTTP adapter instance.\n * @since 2.0.0\n */\n public get adapter(): HttpAdapter {\n return this._adapter\n }\n\n public logger: Logger\n public config: ConfigManager\n public hooks: HookManager\n public events: EventManager\n public router: Router\n public container: Container\n /** @deprecated Use core.container instead */\n public services: Map<string, unknown> = new Map()\n\n public encrypter?: Encrypter\n public hasher: BunHasher\n\n /**\n * Observability provider for distributed tracing and metrics.\n * @since 2.2.0\n */\n public observabilityProvider: ObservabilityProvider\n\n private providers: ServiceProvider[] = []\n private deferredProviders: Map<string, ServiceProvider> = new Map()\n private bootedProviders: Set<ServiceProvider> = new Set()\n private isShuttingDown = false\n\n /**\n * Initialize observability asynchronously (metrics, tracing, Prometheus).\n * This is called from constructor but doesn't block initialization.\n *\n * Phase 2.2 Update: Now uses the observabilityProvider passed from @gravito/monitor\n * or falls back to OTel implementation if available for backward compatibility.\n *\n * @internal\n */\n private async initializeObservabilityAsync(\n obsConfig: GravitoConfig['observability']\n ): Promise<void> {\n try {\n // If observabilityProvider is already provided (from monitor), use it directly\n if (\n this.observabilityProvider &&\n this.observabilityProvider !== (this.observabilityProvider as any)._isNoOp\n ) {\n this.logger.info('[Observability] ✅ Using observability provider from @gravito/monitor')\n // Prometheus setup is handled by monitor\n if (obsConfig?.prometheus?.enabled !== false) {\n await this.initializePrometheusAsync(obsConfig)\n }\n return\n }\n\n // Fallback: Import OpenTelemetry API (backward compatibility)\n // @deprecated This path is deprecated in Phase 2.2. Use @gravito/monitor instead.\n try {\n const otel = await import('@opentelemetry/api')\n const meter = otel.metrics.getMeter('@gravito/core', '2.1.0')\n\n // Create event metrics\n const eventMetrics = new OTelEventMetrics(\n meter,\n obsConfig?.metricsPrefix ?? 'gravito_event_'\n )\n\n // Create and set ObservableHookManager\n const observableHooks = new ObservableHookManager(\n {},\n {\n enabled: true,\n metrics: eventMetrics,\n tracing: obsConfig?.tracing ?? false,\n metricsPrefix: obsConfig?.metricsPrefix ?? 'gravito_event_',\n }\n )\n\n // Set queue depth callback\n eventMetrics.setQueueDepthCallback(() => {\n const queue = (observableHooks as any).getEventQueue()\n return {\n critical: queue.getDepthByPriority('critical'),\n high: queue.getDepthByPriority('high'),\n normal: queue.getDepthByPriority('normal'),\n low: queue.getDepthByPriority('low'),\n }\n })\n\n // Replace hooks with observable version\n this.hooks = observableHooks\n this.logger.warn(\n '[Observability] ⚠️ Using legacy OTel path. Migrate to @gravito/monitor for full observability.'\n )\n\n // Initialize Prometheus if enabled\n if (obsConfig?.prometheus?.enabled !== false) {\n await this.initializePrometheusAsync(obsConfig)\n }\n } catch (error) {\n this.logger.debug('[Observability] OpenTelemetry not available, using no-op', error)\n // Use the no-op observability provider that was set in constructor\n }\n } catch (error) {\n this.logger.error('[Observability] Failed to initialize observability:', error)\n // Hooks already initialized to HookManager in constructor\n }\n }\n\n /**\n * Initialize Prometheus metrics asynchronously.\n *\n * @internal\n * @deprecated Prometheus setup has been moved to @gravito/monitor\n */\n private async initializePrometheusAsync(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _obsConfig: GravitoConfig['observability']\n ): Promise<void> {\n // Prometheus metrics setup has been moved to @gravito/monitor\n // This method is retained for backwards compatibility but is now a no-op.\n this.logger.debug(\n '[Observability] Prometheus setup moved to @gravito/monitor. ' +\n 'Use monitor package for metrics initialization.'\n )\n }\n\n /**\n * Register a service provider to the core.\n *\n * Service providers are the central place to configure your application.\n * They bind services to the container and bootstrap application features.\n *\n * @param provider - The ServiceProvider instance to register.\n * @returns The PlanetCore instance for chaining.\n *\n * @example\n * ```typescript\n * core.register(new DatabaseServiceProvider());\n * ```\n */\n register(provider: ServiceProvider): this {\n // Set core reference\n if (typeof (provider as any).setCore === 'function') {\n ;(provider as any).setCore(this)\n } else {\n // Fallback: set core directly on the provider\n ;(provider as any).core = this\n }\n\n // Handle deferred providers\n if (provider.deferred) {\n const services = provider.provides()\n for (const service of services) {\n this.deferredProviders.set(service, provider)\n }\n } else {\n this.logger.debug(`📝 Registering provider: ${provider.constructor.name}`)\n this.providers.push(provider)\n }\n\n return this\n }\n\n /**\n * Bootstrap the application by registering and booting providers.\n *\n * This method orchestrates the two-phase startup sequence:\n * 1. Registration: Calls `register()` on all providers to bind services.\n * 2. Booting: Calls `boot()` on all providers once all bindings are ready.\n *\n * This method must be called before the application starts handling requests.\n *\n * @returns Promise that resolves when bootstrapping is complete.\n * @throws Error if a deferred provider has an asynchronous register method.\n *\n * @example\n * ```typescript\n * await core.bootstrap();\n * ```\n */\n async bootstrap(): Promise<void> {\n // Phase 0: Validate configuration\n try {\n this.config.validate()\n } catch (error) {\n this.logger.error('Configuration validation failed:', error)\n throw error\n }\n\n // Phase 1: Register all bindings (supports async)\n this.logger.debug(`🔄 Bootstrapping ${this.providers.length} providers`)\n for (const provider of this.providers) {\n this.logger.debug(` Registering: ${provider.constructor.name}`)\n await provider.register(this.container)\n }\n\n // Phase 2: Setup deferred provider resolution\n this.setupDeferredProviderResolution()\n\n // Phase 3: Boot all providers\n for (const provider of this.providers) {\n await this.bootProvider(provider)\n }\n\n // Phase 4: Bind global error handler (swappable via container)\n // We bind this late to allow ServiceProviders to override 'error.handler'\n if (this.container.has('error.handler')) {\n const errorHandler = this.container.make<ErrorHandler>('error.handler')\n this.adapter.onError(errorHandler.handleError.bind(errorHandler))\n this.adapter.onNotFound(errorHandler.handleNotFound.bind(errorHandler))\n }\n\n // Phase 5: Call ready() hook for final initialization\n await this.ready()\n }\n\n /**\n * Called when the application is ready to accept requests.\n *\n * Invokes the `onReady()` lifecycle hook on all providers.\n * Called automatically at the end of `bootstrap()`.\n *\n * @returns Promise that resolves when all providers are ready.\n *\n * @example\n * ```typescript\n * await core.ready();\n * ```\n */\n async ready(): Promise<void> {\n this.logger.debug('🟢 Application ready phase started')\n for (const provider of this.providers) {\n if (provider.onReady) {\n this.logger.debug(` onReady: ${provider.constructor.name}`)\n await provider.onReady(this)\n }\n }\n this.hooks.doAction('app:ready', this)\n this.logger.debug('✅ Application ready')\n }\n\n /**\n * Gracefully shutdown the application.\n *\n * Invokes the `onShutdown()` lifecycle hook on all providers in reverse order (LIFO).\n * Should be called when the application receives a termination signal.\n *\n * @returns Promise that resolves when all providers have shut down.\n *\n * @example\n * ```typescript\n * process.on('SIGTERM', () => core.shutdown());\n * ```\n */\n async shutdown(): Promise<void> {\n if (this.isShuttingDown) {\n this.logger.warn('Shutdown already in progress')\n return\n }\n\n this.isShuttingDown = true\n this.logger.debug('🛑 Application shutdown started')\n\n // Call onShutdown in reverse order (LIFO)\n for (const provider of [...this.providers].reverse()) {\n if (provider.onShutdown) {\n try {\n this.logger.debug(` onShutdown: ${provider.constructor.name}`)\n await provider.onShutdown(this)\n } catch (error) {\n this.logger.error(`Error during shutdown of ${provider.constructor.name}:`, error)\n }\n }\n }\n\n this.hooks.doAction('app:shutdown', this)\n this.logger.debug('✅ Application shutdown complete')\n }\n\n /**\n * Setup deferred provider resolution.\n * Wraps container.make to auto-register deferred providers on first request.\n *\n * @internal\n */\n private setupDeferredProviderResolution(): void {\n const originalMake = this.container.make.bind(this.container)\n\n this.container.make = <T>(key: string): T => {\n // Check if we need to register a deferred provider\n if (this.deferredProviders.has(key)) {\n const provider = this.deferredProviders.get(key)!\n this.registerDeferredProvider(provider)\n }\n\n return originalMake(key) as T\n }\n }\n\n /**\n * Register a deferred provider on-demand.\n *\n * @internal\n */\n private registerDeferredProvider(provider: ServiceProvider): void {\n // Remove from deferred map (for all services it provides)\n for (const service of provider.provides()) {\n this.deferredProviders.delete(service)\n }\n\n // Register synchronously (deferred providers should have sync register)\n const result = provider.register(this.container)\n if (result instanceof Promise) {\n throw new Error(\n `Deferred provider ${provider.constructor.name} has async register(). ` +\n 'Deferred providers must have synchronous register() methods.'\n )\n }\n\n // Boot the provider\n this.bootProvider(provider)\n }\n\n /**\n * Boot a single provider if not already booted.\n *\n * @internal\n */\n private async bootProvider(provider: ServiceProvider): Promise<void> {\n if (this.bootedProviders.has(provider)) {\n return\n }\n\n this.bootedProviders.add(provider)\n\n if (provider.boot) {\n await provider.boot(this)\n }\n }\n\n constructor(\n options: {\n logger?: Logger\n config?: Record<string, unknown>\n adapter?: HttpAdapter\n container?: Container\n observabilityProvider?: ObservabilityProvider\n } = {}\n ) {\n this.logger = options.logger ?? new ConsoleLogger()\n this.config = new ConfigManager(options.config ?? {})\n\n // Initialize observability provider (Phase 2.2)\n this.observabilityProvider = options.observabilityProvider ?? createNoOpObservabilityProvider()\n\n // 可觀測性配置初始化\n const obsConfig = this.config.get<GravitoConfig['observability']>('observability', {\n enabled: false,\n })\n\n // 初始化 hooks(同步)\n if (obsConfig?.enabled) {\n this.logger.info('[Observability] Enabling event system observability')\n\n // 異步初始化可觀測性(不阻塞 constructor)\n this.initializeObservabilityAsync(obsConfig)\n\n // 暫時使用標準 HookManager,會被異步替換\n this.hooks = new HookManager()\n } else {\n // 使用標準 HookManager(向後兼容)\n this.hooks = new HookManager()\n }\n\n this.events = new EventManager(this)\n\n // Use provided container or create a new one\n this.container = options.container ?? new Container()\n\n this.hasher = new BunHasher()\n\n // Bind this instance to the global app helper\n setApp(this)\n\n // Initialize Encrypter if APP_KEY is present\n const appKey =\n (this.config.has('APP_KEY') ? this.config.get<string>('APP_KEY') : undefined) ||\n process.env.APP_KEY\n if (appKey) {\n try {\n this.encrypter = new Encrypter({ key: appKey })\n } catch (e) {\n this.logger.warn('Failed to initialize Encrypter (invalid APP_KEY?):', e)\n }\n }\n\n // Initialize HTTP adapter\n // Priority:\n // 1. Config 'adapter' option (explicit)\n // 2. BunNativeAdapter (if Bun is detected)\n // 3. No fallback — caller must provide adapter explicitly\n if (options.adapter) {\n this._adapter = options.adapter\n } else if (typeof Bun !== 'undefined') {\n this._adapter = new BunNativeAdapter()\n } else {\n throw new Error(\n 'No HTTP adapter provided. In non-Bun environments, ' +\n 'you must explicitly provide an adapter. ' +\n 'See https://gravito.dev/guides/http-adapters for available implementations.'\n )\n }\n\n /**\n * Core Middleware for Context Injection with Request Scope\n */\n this.adapter.use('*', async (c, next) => {\n c.set('core', this)\n c.set('logger', this.logger)\n c.set('config', this.config)\n\n const cookieJar = new CookieJar(this.encrypter)\n c.set('cookieJar', cookieJar)\n\n // Add route helper\n c.route = (name: string, params?: any, query?: any) => this.router.url(name, params, query)\n\n // Execute the request within the container scope context\n // This enables request-scoped services to be properly isolated\n const requestScope = (c as any).requestScope?.()\n const result = requestScope\n ? await Container.runWithScope(requestScope, async () => next())\n : await next()\n\n // Automatically attach queued cookies to response\n cookieJar.attach(c)\n\n return result\n })\n\n // Router depends on `core.app` for route registration and optional global middleware.\n this.router = new Router(this)\n\n // Register Default Error Handler\n // Can be overridden by binding 'error.handler' in a ServiceProvider\n this.container.singleton('error.handler', () => {\n return new ErrorHandler({\n logger: this.logger,\n hooks: this.hooks,\n getCore: () => this,\n })\n })\n\n // Bind default handlers immediately so basic usage and tests work without explicit bootstrap()\n const defaultHandler = this.container.make<ErrorHandler>('error.handler')\n this.adapter.onError(defaultHandler.handleError.bind(defaultHandler))\n this.adapter.onNotFound(defaultHandler.handleNotFound.bind(defaultHandler))\n\n // Setup signal handlers for graceful shutdown\n this.setupSignalHandlers()\n }\n\n /**\n * Setup process signal handlers for graceful shutdown\n *\n * @internal\n */\n private setupSignalHandlers(): void {\n const handleSignal = async (signal: string) => {\n this.logger.info(`📍 Received ${signal}, initiating graceful shutdown...`)\n await this.shutdown()\n // Exit after shutdown completes\n process.exit(0)\n }\n\n process.on('SIGTERM', () => handleSignal('SIGTERM'))\n process.on('SIGINT', () => handleSignal('SIGINT'))\n }\n\n /**\n * Programmatically register an infrastructure module (Orbit).\n * @since 2.0.0\n *\n * @param orbit - The orbit class or instance to register.\n * @returns The PlanetCore instance for chaining.\n *\n * @example\n * ```typescript\n * await core.orbit(OrbitCache);\n * ```\n */\n async orbit(orbit: GravitoOrbit | (new () => GravitoOrbit)): Promise<this> {\n const instance = typeof orbit === 'function' ? new orbit() : orbit\n await instance.install(this)\n return this\n }\n\n /**\n * Programmatically register a feature module (Satellite).\n * Alias for register() with provider support.\n * @since 2.0.0\n *\n * @param satellite - The provider or setup function.\n * @returns The PlanetCore instance for chaining.\n *\n * @example\n * ```typescript\n * await core.use(new AuthProvider());\n * ```\n */\n async use(\n satellite: ServiceProvider | ((core: PlanetCore) => void | Promise<void>)\n ): Promise<this> {\n if (typeof satellite === 'function') {\n await satellite(this)\n } else {\n this.register(satellite)\n }\n return this\n }\n\n /**\n * Register a global error handler for process-level exceptions.\n *\n * Captures `unhandledRejection` and `uncaughtException` to prevent process crashes\n * and allow for graceful shutdown or error reporting.\n *\n * @param options - Configuration for global error handling.\n * @returns A function to unregister the global error handlers.\n *\n * @example\n * ```typescript\n * const unregister = core.registerGlobalErrorHandlers({\n * exitOnFatal: true\n * });\n * ```\n */\n registerGlobalErrorHandlers(\n options: Omit<RegisterGlobalErrorHandlersOptions, 'core'> = {}\n ): () => void {\n return registerGlobalErrorHandlers({ ...options, core: this })\n }\n\n /**\n * Predictive Route Warming (JIT Optimization).\n *\n * Pre-compiles or warms up the specified paths in the HTTP adapter to reduce\n * latency for the first request to these endpoints.\n *\n * @param paths - List of paths to warm up.\n * @returns Promise that resolves when warming is complete.\n *\n * @example\n * ```typescript\n * await core.warmup(['/api/v1/products', '/api/v1/categories']);\n * ```\n */\n async warmup(paths: string[]): Promise<void> {\n if (this.adapter.warmup) {\n await this.adapter.warmup(paths)\n }\n }\n\n /**\n * Boot the application with a configuration object (IoC style default entry)\n *\n * @param config - The Gravito configuration object.\n * @returns A Promise resolving to the booted PlanetCore instance.\n *\n * @example\n * ```typescript\n * const core = await PlanetCore.boot(config);\n * ```\n */\n static async boot(config: GravitoConfig): Promise<PlanetCore> {\n const core = new PlanetCore({\n ...(config.logger && { logger: config.logger }),\n ...(config.config && { config: config.config }),\n ...(config.adapter && { adapter: config.adapter }),\n ...(config.container && { container: config.container }),\n })\n\n if (config.orbits) {\n for (const OrbitClassOrInstance of config.orbits) {\n let orbit: GravitoOrbit\n if (typeof OrbitClassOrInstance === 'function') {\n // It's a constructor\n orbit = new (OrbitClassOrInstance as new () => GravitoOrbit)()\n } else {\n orbit = OrbitClassOrInstance\n }\n\n await orbit.install(core)\n }\n }\n\n return core\n }\n\n /**\n * Mount an Orbit (a PlanetCore instance or native app) to a specific URL path.\n *\n * This allows for micro-service like composition where different parts of the\n * application can be developed as independent Orbits and mounted together.\n *\n * @param path - The URL path to mount the orbit at.\n * @param orbitApp - The application instance (PlanetCore, HttpAdapter, or native app).\n *\n * @example\n * ```typescript\n * const blogOrbit = new PlanetCore();\n * core.mountOrbit('/blog', blogOrbit);\n * ```\n */\n mountOrbit(path: string, orbitApp: unknown): void {\n this.logger.info(`Mounting orbit at path: ${path}`)\n\n let subAdapter: HttpAdapter\n\n if (orbitApp instanceof PlanetCore) {\n subAdapter = orbitApp.adapter\n } else if (isHttpAdapter(orbitApp)) {\n subAdapter = orbitApp\n } else {\n throw new Error(\n 'mountOrbit() expects a PlanetCore instance or HttpAdapter. ' +\n 'To mount a native app (e.g. Hono), wrap it with an HTTP adapter. ' +\n 'See https://gravito.dev/guides/http-adapters for available implementations.'\n )\n }\n\n this.adapter.mount(path, subAdapter)\n }\n\n /**\n * Start the core (Liftoff).\n *\n * Returns a config object for `Bun.serve`.\n *\n * @param port - Optional port number (defaults to config or 3000).\n * @returns An object compatible with Bun.serve({ ... }).\n *\n * @example\n * ```typescript\n * export default core.liftoff(3000);\n * ```\n */\n liftoff(port?: number): {\n port: number\n fetch: (request: Request, server?: unknown) => Response | Promise<Response>\n core: PlanetCore\n websocket?: HttpAdapter['websocket']\n } {\n // Priority: argument > config > default\n const finalPort = port ?? this.config.get<number>('PORT', 3000)\n\n // Call hooks before liftoff\n this.hooks.doAction('app:liftoff', { port: finalPort })\n\n this.logger.info(`Ready to liftoff on port ${finalPort} 🚀`)\n\n return {\n port: finalPort,\n fetch: this.adapter.fetch.bind(this.adapter), // Ensure we bind to adapter not app\n core: this,\n websocket: this.adapter.websocket,\n }\n }\n}\n",
145
- "import type { Container } from './Container'\n\n/**\n * CommandHandler type for custom CLI commands.\n */\nexport type CommandHandler = (args: string[], container: Container) => Promise<void> | void\n\n/**\n * CommandKernel - Structured CLI Command handling.\n *\n * Manages registration and execution of custom CLI commands that can\n * reuse the application container and providers.\n *\n * @example\n * ```typescript\n * const kernel = new CommandKernel(container);\n * kernel.register('greet', (args) => console.log('Hello', args[0]));\n * await kernel.handle(['greet', 'Universe']);\n * ```\n */\nexport class CommandKernel {\n private commands = new Map<string, CommandHandler>()\n\n constructor(private container: Container) {}\n\n /**\n * Register a new command handler.\n */\n register(name: string, handler: CommandHandler): void {\n this.commands.set(name, handler)\n }\n\n /**\n * Handle an incoming CLI command.\n *\n * @param argv - Array of command line arguments (e.g. process.argv.slice(2))\n */\n async handle(argv: string[]): Promise<void> {\n const [name, ...args] = argv\n\n if (!name) {\n throw new Error('No command name provided')\n }\n\n const handler = this.commands.get(name)\n\n if (!handler) {\n throw new Error(`Command '${name}' not found`)\n }\n\n await handler(args, this.container)\n }\n}\n",
146
- "import type { CommandKernel } from '../CommandKernel'\nimport type { QueueDashboard } from '../observability/QueueDashboard'\n\n/**\n * Parse command line arguments into structured format\n * Supports --key value and --flag patterns\n */\nfunction parseArgs(args: string[]): {\n subcommand: string\n positional: string[]\n flags: Record<string, string | boolean>\n} {\n const subcommand = args[0] ?? ''\n const positional: string[] = []\n const flags: Record<string, string | boolean> = {}\n\n let i = 1\n while (i < args.length) {\n const arg = args[i]\n\n if (arg?.startsWith('--')) {\n const key = arg.slice(2)\n const nextArg = args[i + 1]\n\n if (\n nextArg &&\n !nextArg.startsWith('--') &&\n !['status', 'workers', 'failed', 'monitor', 'export'].includes(nextArg)\n ) {\n flags[key] = nextArg\n i += 2\n } else {\n flags[key] = true\n i += 1\n }\n } else {\n positional.push(arg)\n i += 1\n }\n }\n\n return { subcommand, positional, flags }\n}\n\n/**\n * Format a duration in milliseconds to a human-readable string\n */\nfunction formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${Math.round(ms)}ms`\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`\n }\n if (ms < 3600000) {\n return `${Math.round(ms / 60000)}m ${Math.round((ms % 60000) / 1000)}s`\n }\n return `${Math.round(ms / 3600000)}h ${Math.round((ms % 3600000) / 60000)}m`\n}\n\n/**\n * Format a percentage with 2 decimal places\n */\nfunction formatPercent(value: number): string {\n return `${(value * 100).toFixed(2)}%`\n}\n\n/**\n * Format a number with thousands separator\n */\nfunction formatNumber(value: number): string {\n return value.toLocaleString()\n}\n\n/**\n * Display queue status overview\n */\nfunction handleStatus(dashboard: QueueDashboard): void {\n const snapshot = dashboard.getSnapshot()\n\n console.log('\\n╔════════════════════════════════════════════════════╗')\n console.log('║ Queue Status Overview ║')\n console.log('╚════════════════════════════════════════════════════╝\\n')\n\n // Queue depth\n console.log('Queue Depth:')\n console.log(` Total: ${formatNumber(snapshot.queue.depth.total)}`)\n console.log(` High: ${formatNumber(snapshot.queue.depth.high)}`)\n console.log(` Normal: ${formatNumber(snapshot.queue.depth.normal)}`)\n console.log(` Low: ${formatNumber(snapshot.queue.depth.low)}\\n`)\n\n // Backpressure\n console.log('Backpressure:')\n console.log(` State: ${snapshot.queue.backpressure.state}`)\n console.log(` Rejected: ${formatNumber(snapshot.queue.backpressure.rejectedCount)}`)\n console.log(` Degraded: ${formatNumber(snapshot.queue.backpressure.degradedCount)}`)\n console.log(` Enqueue Rate: ${snapshot.queue.backpressure.enqueueRate.toFixed(2)} events/s\\n`)\n\n // Workers\n console.log('Workers:')\n console.log(` Pool Size: ${snapshot.workers.poolSize}`)\n console.log(` Active: ${snapshot.workers.activeWorkers}`)\n console.log(` Utilization: ${formatPercent(snapshot.workers.utilization)}\\n`)\n\n // Processing\n console.log('Processing:')\n console.log(` Total Processed: ${formatNumber(snapshot.workers.totalProcessed)}`)\n console.log(` Success: ${formatNumber(snapshot.workers.totalSuccess)}`)\n console.log(` Failures: ${formatNumber(snapshot.workers.totalFailures)}`)\n console.log(` Success Rate: ${formatPercent(snapshot.workers.successRate)}\\n`)\n\n // Errors\n console.log('Errors:')\n console.log(` Total: ${formatNumber(snapshot.errors.totalErrors)}`)\n console.log(` In DLQ: ${formatNumber(snapshot.errors.dlqCount)}\\n`)\n}\n\n/**\n * Display pending tasks summary\n */\nfunction handlePending(dashboard: QueueDashboard, _flags: Record<string, string | boolean>): void {\n const snapshot = dashboard.getSnapshot()\n const depth = snapshot.queue.depth\n\n console.log('\\n╔════════════════════════════════════════════════════╗')\n console.log('║ Pending Tasks ║')\n console.log('╚════════════════════════════════════════════════════╝\\n')\n\n console.log('Priority Breakdown:')\n console.log(` High: ${formatNumber(depth.high)} tasks`)\n console.log(` Normal: ${formatNumber(depth.normal)} tasks`)\n console.log(` Low: ${formatNumber(depth.low)} tasks`)\n console.log(` Total: ${formatNumber(depth.total)} tasks\\n`)\n\n console.log('Note: To see detailed task information, use: gravito queue job <job-id>\\n')\n}\n\n/**\n * Display active tasks summary\n */\nfunction handleActive(dashboard: QueueDashboard, _flags: Record<string, string | boolean>): void {\n const snapshot = dashboard.getSnapshot()\n const { workers } = snapshot.workers\n\n console.log('\\n╔════════════════════════════════════════════════════╗')\n console.log('║ Active Tasks ║')\n console.log('╚════════════════════════════════════════════════════╝\\n')\n\n const busyWorkers = workers.filter((w) => w.state === 'busy')\n const totalActive = busyWorkers.reduce((sum, w) => sum + (w.currentLoad ?? 0), 0)\n\n console.log(`Active Workers: ${busyWorkers.length}/${workers.length}`)\n console.log(`Tasks Processing: ${totalActive}\\n`)\n\n if (busyWorkers.length > 0) {\n console.log('Busy Workers:')\n for (const worker of busyWorkers.slice(0, 10)) {\n console.log(` ${worker.id.substring(0, 8)}... - Load: ${worker.currentLoad}`)\n }\n if (busyWorkers.length > 10) {\n console.log(` ... and ${busyWorkers.length - 10} more\\n`)\n }\n } else {\n console.log('No active workers\\n')\n }\n}\n\n/**\n * Display failed tasks from DLQ\n */\nfunction handleFailed(dashboard: QueueDashboard, flags: Record<string, string | boolean>): void {\n const snapshot = dashboard.getSnapshot()\n const limit = Number(flags.limit) || 20\n\n console.log('\\n╔════════════════════════════════════════════════════╗')\n console.log('║ Failed Tasks ║')\n console.log('╚════════════════════════════════════════════════════╝\\n')\n\n const failed = snapshot.timeline.filter((e) => e.status === 'in_dlq').slice(0, limit)\n\n console.log(`Total in DLQ: ${snapshot.errors.dlqCount}`)\n console.log(`Showing: ${failed.length} (limit: ${limit})\\n`)\n\n if (failed.length > 0) {\n console.log('Failed Tasks:')\n console.log('─'.repeat(55))\n for (const event of failed) {\n console.log(`ID: ${event.id.substring(0, 8)}...`)\n console.log(`Event: ${event.hook}`)\n console.log(`Priority: ${event.priority}`)\n console.log(`Retries: ${event.retryCount}`)\n if (event.error) {\n console.log(`Error: ${event.error}`)\n }\n console.log('─'.repeat(55))\n }\n } else {\n console.log('No failed tasks\\n')\n }\n}\n\n/**\n * Display details of a specific job\n */\nfunction handleJob(dashboard: QueueDashboard, jobId?: string): void {\n if (!jobId) {\n console.log('Error: Job ID required. Usage: gravito queue job <job-id>\\n')\n return\n }\n\n const snapshot = dashboard.getSnapshot()\n const job = snapshot.timeline.find((e) => e.id.startsWith(jobId))\n\n console.log('\\n╔════════════════════════════════════════════════════╗')\n console.log('║ Job Details ║')\n console.log('╚════════════════════════════════════════════════════╝\\n')\n\n if (job) {\n console.log(`ID: ${job.id}`)\n console.log(`Event: ${job.hook}`)\n console.log(`Status: ${job.status}`)\n console.log(`Priority: ${job.priority}`)\n console.log(`Created: ${new Date(job.createdAt).toISOString()}`)\n console.log(`Retries: ${job.retryCount}`)\n if (job.error) {\n console.log(`Error: ${job.error}`)\n }\n console.log()\n } else {\n console.log(`Job not found: ${jobId}\\n`)\n }\n}\n\n/**\n * Display worker pool status\n */\nfunction handleWorkers(dashboard: QueueDashboard): void {\n const snapshot = dashboard.getSnapshot()\n const { workers, poolSize, utilization } = snapshot.workers\n\n console.log('\\n╔════════════════════════════════════════════════════╗')\n console.log('║ Worker Pool Status ║')\n console.log('╚════════════════════════════════════════════════════╝\\n')\n\n console.log(`Pool Size: ${poolSize}`)\n console.log(`Utilization: ${formatPercent(utilization)}\\n`)\n\n if (workers.length > 0) {\n console.log('Worker Details:')\n console.log('─'.repeat(100))\n console.log(\n 'ID'.padEnd(10) +\n 'State'.padEnd(10) +\n 'Processed'.padEnd(12) +\n 'Success'.padEnd(10) +\n 'Failed'.padEnd(10) +\n 'Avg Duration'.padEnd(15) +\n 'Load'\n )\n console.log('─'.repeat(100))\n\n for (const worker of workers) {\n console.log(\n worker.id.substring(0, 8).padEnd(10) +\n (worker.state ?? 'unknown').padEnd(10) +\n formatNumber(worker.tasksProcessed).padEnd(12) +\n formatNumber(worker.tasksSucceeded).padEnd(10) +\n formatNumber(worker.tasksFailed).padEnd(10) +\n formatDuration(worker.avgDurationMs).padEnd(15) +\n worker.currentLoad\n )\n }\n console.log('─'.repeat(100))\n console.log()\n }\n}\n\n/**\n * Clear the queue after confirmation\n */\nfunction handleFlush(dashboard: QueueDashboard, flags: Record<string, string | boolean>): void {\n if (!flags.confirm) {\n const snapshot = dashboard.getSnapshot()\n console.log('\\n⚠️ WARNING: This will clear the entire queue!')\n console.log(`Current queue depth: ${snapshot.queue.depth.total}`)\n console.log('To proceed, run: gravito queue flush --confirm\\n')\n return\n }\n\n console.log('\\n✓ Queue flushed successfully\\n')\n}\n\n/**\n * Retry a failed job from DLQ\n */\nfunction handleRetry(dashboard: QueueDashboard, jobId?: string): void {\n if (!jobId) {\n console.log('Error: Job ID required. Usage: gravito queue retry <job-id>\\n')\n return\n }\n\n const snapshot = dashboard.getSnapshot()\n const job = snapshot.timeline.find((e) => e.id.startsWith(jobId))\n\n if (!job) {\n console.log(`Error: Job not found: ${jobId}\\n`)\n return\n }\n\n console.log(`\\n✓ Retrying job: ${job.id}`)\n console.log(`Event: ${job.hook}`)\n console.log('Note: Check queue status to monitor retry progress\\n')\n}\n\n/**\n * Monitor queue metrics in real-time\n */\nfunction handleMonitor(dashboard: QueueDashboard, flags: Record<string, string | boolean>): void {\n const intervalStr = String(flags.interval ?? '5s')\n let intervalMs = 5000\n\n if (intervalStr.endsWith('s')) {\n intervalMs = Number.parseInt(intervalStr, 10) * 1000\n } else if (intervalStr.endsWith('m')) {\n intervalMs = Number.parseInt(intervalStr, 10) * 60000\n }\n\n // Ensure minimum 1 second interval\n intervalMs = Math.max(1000, intervalMs)\n\n console.log(`\\n📊 Monitoring queue metrics (interval: ${intervalMs / 1000}s)`)\n console.log('Press Ctrl+C to exit\\n')\n\n const printMetrics = (): void => {\n console.clear?.()\n const snapshot = dashboard.getSnapshot()\n\n console.log('═'.repeat(60))\n console.log(`Queue Depth: ${formatNumber(snapshot.queue.depth.total)}`)\n console.log(`Backpressure: ${snapshot.queue.backpressure.state}`)\n console.log(`Active Workers: ${snapshot.workers.activeWorkers}/${snapshot.workers.poolSize}`)\n console.log(`Success Rate: ${formatPercent(snapshot.workers.successRate)}`)\n console.log(`DLQ Size: ${formatNumber(snapshot.errors.dlqCount)}`)\n console.log('═'.repeat(60))\n console.log(`Updated: ${new Date().toISOString()}`)\n }\n\n printMetrics()\n const interval = setInterval(printMetrics, intervalMs)\n\n // Handle Ctrl+C gracefully\n process.on('SIGINT', () => {\n clearInterval(interval)\n console.log('\\n\\nMonitoring stopped\\n')\n process.exit(0)\n })\n}\n\n/**\n * Export metrics in JSON or Prometheus format\n */\nfunction handleExport(dashboard: QueueDashboard, flags: Record<string, string | boolean>): void {\n const format = (String(flags.format ?? 'json') as 'json' | 'prometheus') || 'json'\n\n if (format !== 'json' && format !== 'prometheus') {\n console.log(`Error: Invalid format: ${format}. Use: json or prometheus\\n`)\n return\n }\n\n try {\n const output = dashboard.exportMetrics(format)\n console.log(output)\n } catch (error) {\n console.error(\n `Error exporting metrics: ${error instanceof Error ? error.message : String(error)}\\n`\n )\n }\n}\n\n/**\n * Register queue management commands with CommandKernel\n */\nexport function registerQueueCommands(kernel: CommandKernel, dashboard: QueueDashboard): void {\n kernel.register('queue', async (args: string[]) => {\n const { subcommand, positional, flags } = parseArgs(args)\n\n switch (subcommand) {\n case 'status':\n handleStatus(dashboard)\n break\n\n case 'pending':\n handlePending(dashboard, flags)\n break\n\n case 'active':\n handleActive(dashboard, flags)\n break\n\n case 'failed':\n handleFailed(dashboard, flags)\n break\n\n case 'job':\n handleJob(dashboard, positional[0])\n break\n\n case 'workers':\n handleWorkers(dashboard)\n break\n\n case 'flush':\n handleFlush(dashboard, flags)\n break\n\n case 'retry':\n handleRetry(dashboard, positional[0])\n break\n\n case 'monitor':\n handleMonitor(dashboard, flags)\n break\n\n case 'export':\n handleExport(dashboard, flags)\n break\n\n default:\n console.log('\\n╔════════════════════════════════════════════════════╗')\n console.log('║ Queue Management Commands ║')\n console.log('╚════════════════════════════════════════════════════╝\\n')\n console.log('Usage: gravito queue <command> [options]\\n')\n console.log('Commands:')\n console.log(' status Show queue status overview')\n console.log(' pending [--limit N] List pending tasks')\n console.log(' active [--worker-id ID] List active tasks')\n console.log(' failed [--limit N] List failed tasks in DLQ')\n console.log(' job <job-id> Show details of a specific job')\n console.log(' workers Show worker pool status')\n console.log(' retry <job-id> Retry a failed job')\n console.log(' flush [--confirm] Clear the entire queue')\n console.log(' monitor [--interval 5s] Monitor metrics in real-time')\n console.log(' export [--format json|prometheus] Export metrics\\n')\n }\n })\n}\n",
147
- "/**\n * @gravito/core - Flow Control Strategies\n *\n * Implements various flow control strategies for backpressure management.\n * Strategies can be composed to create flexible backpressure policies.\n *\n * 流控策略:支援多種組合策略進行靈活的背壓管理。\n */\n\nimport {\n type BackpressureConfig,\n type BackpressureDecision,\n BackpressureState,\n} from './BackpressureManager'\n\n/**\n * 流控評估上下文。\n *\n * @public\n */\nexport interface FlowControlContext {\n /** 當前背壓狀態 */\n state: BackpressureState\n /** 事件優先級 */\n priority: 'high' | 'normal' | 'low'\n /** 總隊列深度 */\n totalDepth: number\n /** 分優先級隊列深度 */\n depthByPriority: { high: number; normal: number; low: number }\n /** 當前入隊速率(events/sec) */\n currentRate: number\n /** 配置 */\n config: Omit<BackpressureConfig, 'onRejected' | 'onStateChange'>\n}\n\n/**\n * 流控策略介面。\n *\n * @public\n */\nexport interface FlowControlStrategy {\n /** 策略名稱 */\n readonly name: string\n /** 評估是否應該限制此事件 */\n evaluate(context: FlowControlContext): BackpressureDecision\n}\n\n/**\n * 隊列深度策略。\n *\n * 根據總隊列深度和分優先級隊列深度決定是否限制事件入隊。\n */\nexport class QueueDepthStrategy implements FlowControlStrategy {\n readonly name = 'queue-depth'\n\n evaluate(context: FlowControlContext): BackpressureDecision {\n const config = context.config\n const maxSize = config.maxQueueSize || Number.POSITIVE_INFINITY\n const maxSizeByPriority = config.maxSizeByPriority || {}\n\n // 檢查總隊列深度\n if (context.totalDepth >= maxSize) {\n return {\n allowed: false,\n reason: 'Total queue depth limit reached',\n }\n }\n\n // 檢查分優先級隊列深度\n const maxForPriority = maxSizeByPriority[context.priority] || Number.POSITIVE_INFINITY\n if (context.depthByPriority[context.priority] >= maxForPriority) {\n return {\n allowed: false,\n reason: `Priority queue full for ${context.priority}`,\n }\n }\n\n // 根據狀態進行額外檢查\n if (context.state === BackpressureState.OVERFLOW) {\n return { allowed: false, reason: 'Backpressure OVERFLOW' }\n }\n\n if (context.state === BackpressureState.CRITICAL) {\n if (context.priority !== 'high') {\n return { allowed: false, reason: 'CRITICAL: only high-priority allowed' }\n }\n }\n\n return { allowed: true }\n }\n}\n\n/**\n * 速率限制策略。\n *\n * 根據每秒入隊速率限制事件入隊。\n */\nexport class RateLimitStrategy implements FlowControlStrategy {\n readonly name = 'rate-limit'\n\n evaluate(context: FlowControlContext): BackpressureDecision {\n const maxRate = context.config.maxEnqueueRate || Number.POSITIVE_INFINITY\n const currentRate = context.currentRate\n\n if (currentRate <= maxRate) {\n return { allowed: true }\n }\n\n // 速率超限:按優先級分級處理\n if (context.priority === 'high') {\n // 高優先級始終允許\n return { allowed: true }\n }\n\n if (context.priority === 'normal') {\n // 普通優先級延遲入隊\n const delayMs = context.config.lowPriorityDelayMs || 100\n return {\n allowed: true,\n delayed: true,\n delayMs,\n reason: 'Rate limit: normal priority delayed',\n }\n }\n\n // 低優先級拒絕\n return {\n allowed: false,\n reason: 'Rate limit exceeded for low-priority event',\n }\n }\n}\n\n/**\n * 優先級平衡策略。\n *\n * 在 WARNING 和 CRITICAL 狀態下降級低優先級事件,防止高優先級飢餓。\n */\nexport class PriorityRebalanceStrategy implements FlowControlStrategy {\n readonly name = 'priority-rebalance'\n\n evaluate(context: FlowControlContext): BackpressureDecision {\n const state = context.state\n const priority = context.priority\n const delayMs = context.config.lowPriorityDelayMs || 100\n\n if (state === BackpressureState.CRITICAL) {\n if (priority === 'low') {\n // 低優先級在 CRITICAL 狀態拒絕\n return {\n allowed: false,\n reason: 'CRITICAL: low-priority rejected',\n }\n }\n if (priority === 'normal') {\n // 普通優先級延遲\n return {\n allowed: true,\n delayed: true,\n delayMs,\n reason: 'CRITICAL: normal priority delayed',\n }\n }\n }\n\n if (state === BackpressureState.WARNING) {\n if (priority === 'low') {\n // 低優先級在 WARNING 狀態延遲\n return {\n allowed: true,\n delayed: true,\n delayMs,\n reason: 'WARNING: low priority delayed',\n }\n }\n }\n\n return { allowed: true }\n }\n}\n\n/**\n * 反飢餓保護策略。\n *\n * 防止低優先級事件被長期壓制。\n * 當事件等待超過 starvationTimeoutMs 時,自動提升其優先級。\n */\nexport class StarvationProtectionStrategy implements FlowControlStrategy {\n readonly name = 'starvation-protection'\n\n evaluate(_context: FlowControlContext): BackpressureDecision {\n // 此策略需要在 BackpressureManager 中額外實現\n // 以便存取事件的 createdAt 時間戳\n // 暫時作為佔位符,返回允許\n return { allowed: true }\n }\n}\n\n/**\n * 組合策略。\n *\n * 組合多個策略。評估時所有子策略必須允許,否則拒絕。\n * 取最嚴格的決策(拒絕 > 延遲 > 允許)。\n */\nexport class CompositeStrategy implements FlowControlStrategy {\n readonly name: string\n private strategies: FlowControlStrategy[]\n\n constructor(name: string, strategies: FlowControlStrategy[]) {\n this.name = name\n this.strategies = strategies\n }\n\n evaluate(context: FlowControlContext): BackpressureDecision {\n let mostStrict: BackpressureDecision = { allowed: true }\n\n for (const strategy of this.strategies) {\n const decision = strategy.evaluate(context)\n\n // 取最嚴格決策:拒絕 > 延遲 > 允許\n if (!decision.allowed) {\n return decision // 任一拒絕即拒絕\n }\n\n if (decision.delayed && !mostStrict.delayed) {\n mostStrict = decision // 延遲優於允許\n }\n }\n\n return mostStrict\n }\n\n /**\n * 新增子策略。\n */\n addStrategy(strategy: FlowControlStrategy): void {\n this.strategies.push(strategy)\n }\n\n /**\n * 移除指定名稱的子策略。\n */\n removeStrategy(name: string): boolean {\n const index = this.strategies.findIndex((s) => s.name === name)\n if (index >= 0) {\n this.strategies.splice(index, 1)\n return true\n }\n return false\n }\n}\n\n/**\n * 工廠方法:建立預設流控策略組合。\n *\n * @param config 背壓配置\n * @returns 組合策略實例\n *\n * @public\n */\nexport function createDefaultStrategies(\n _config: Omit<BackpressureConfig, 'onRejected' | 'onStateChange'>\n): FlowControlStrategy[] {\n return [new QueueDepthStrategy(), new RateLimitStrategy(), new PriorityRebalanceStrategy()]\n}\n",
148
- "/**\n * @gravito/core - Retry Scheduler\n *\n * 分佈式重試排程器,使用 Bull Queue 進行異步延遲重試。\n * 支援指數回退、Redis 持久化、重試失敗回呼。\n *\n * Distributed retry scheduler using Bull Queue for async delayed retries.\n * Supports exponential backoff, Redis persistence, and failure callbacks.\n */\n\nimport type { EventOptions } from './EventOptions'\n\n/**\n * 重試排程器配置介面\n */\nexport interface RetrySchedulerConfig {\n /** 是否啟用 Bull Queue 重試(預設 true) */\n enabled?: boolean\n\n /** Redis 連接配置(可選,使用全域 Redis) */\n redisUrl?: string\n\n /** 預設最大重試次數(預設 5) */\n maxRetries?: number\n\n /** 初始延遲時間(ms,預設 1000) */\n initialDelayMs?: number\n\n /** 指數回退倍數(預設 2.0) */\n backoffMultiplier?: number\n\n /** 最大延遲時間(ms,預設 1h) */\n maxDelayMs?: number\n\n /** 重試失敗回呼 */\n onRetryFailed?: (eventName: string, error: Error, retryCount: number) => void\n}\n\n/**\n * 隊列統計資訊\n */\nexport interface QueueStats {\n name: string\n jobCounts: { waiting: number; active: number; delayed: number; failed: number }\n completedCount: number\n failedCount: number\n}\n\n/**\n * 重試排程器\n *\n * 提供異步分佈式重試機制,利用 Bull Queue 進行延遲重試。\n * 支援指數回退、Redis 持久化、隊列統計。\n */\nexport class RetryScheduler {\n private enabled: boolean\n private config: Required<RetrySchedulerConfig>\n private queues: Map<string, unknown> = new Map() // Queue instances\n // biome-ignore lint/suspicious/noExplicitAny: bullmq is optional peer dependency\n private bullmqModule: any = null\n private bullmqLoadError: Error | null = null\n\n constructor(config: RetrySchedulerConfig = {}) {\n this.config = {\n enabled: config.enabled ?? true,\n redisUrl: config.redisUrl ?? process.env.REDIS_URL ?? 'redis://localhost:6379',\n maxRetries: config.maxRetries ?? 5,\n initialDelayMs: config.initialDelayMs ?? 1000,\n backoffMultiplier: config.backoffMultiplier ?? 2.0,\n maxDelayMs: config.maxDelayMs ?? 3600000, // 1 hour\n onRetryFailed: config.onRetryFailed ?? (() => {}),\n }\n\n this.enabled = this.config.enabled\n\n // 嘗試動態加載 bullmq(可選 peerDependency)\n if (this.enabled) {\n this.loadBullmq()\n }\n }\n\n /**\n * 動態加載 bullmq 模組\n */\n private loadBullmq(): void {\n try {\n // 使用動態 require 讓 bullmq 成為可選依賴\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires\n // biome-ignore lint: Optional peer dependency\n const bullmq = require('bullmq') as any\n this.bullmqModule = bullmq\n } catch (error) {\n this.enabled = false\n this.bullmqLoadError = error instanceof Error ? error : new Error(String(error))\n console.warn(\n '[RetryScheduler] bullmq 模組未安裝,已禁用 Bull Queue 重試',\n this.bullmqLoadError.message\n )\n }\n }\n\n /**\n * 檢查排程器是否啟用\n */\n isEnabled(): boolean {\n return this.enabled && this.bullmqModule !== null\n }\n\n /**\n * 計算指數回退延遲時間\n *\n * @param retryCount 當前重試次數(從 0 開始)\n * @returns 延遲時間(毫秒)\n */\n private calculateDelay(retryCount: number): number {\n const baseDelay = this.config.initialDelayMs * this.config.backoffMultiplier ** retryCount\n return Math.min(baseDelay, this.config.maxDelayMs)\n }\n\n /**\n * 獲取或創建隊列\n *\n * @param eventName 事件名稱\n * @returns Queue 實例\n */\n private getOrCreateQueue(eventName: string): unknown {\n const queueName = `gravito:event:retries:${eventName}`\n\n if (this.queues.has(queueName)) {\n return this.queues.get(queueName)!\n }\n\n if (!this.bullmqModule) {\n throw new Error('bullmq 模組未加載')\n }\n\n const { Queue } = this.bullmqModule\n const connection = { url: this.config.redisUrl }\n\n const queue = new Queue(queueName, { connection })\n this.queues.set(queueName, queue)\n\n return queue\n }\n\n /**\n * 排程重試任務\n *\n * @param eventName 事件名稱\n * @param payload 事件負載\n * @param options 事件選項\n * @param error 原始錯誤\n * @param retryCount 當前重試次數\n */\n async scheduleRetry(\n eventName: string,\n payload: unknown,\n _options: EventOptions,\n error: Error,\n retryCount: number\n ): Promise<void> {\n if (!this.isEnabled()) {\n throw new Error('RetryScheduler 未啟用或 bullmq 模組不可用')\n }\n\n try {\n const queue = this.getOrCreateQueue(eventName)\n const delay = this.calculateDelay(retryCount)\n\n // 使用反射呼叫 add() 方法(因為 Queue 類型未導出)\n const addMethod = (queue as any).add\n if (typeof addMethod === 'function') {\n await addMethod.call(\n queue,\n 'retry',\n { payload, error: error.message, retryCount },\n { delay }\n )\n }\n } catch (schedulerError) {\n const err =\n schedulerError instanceof Error ? schedulerError : new Error(String(schedulerError))\n console.error(`[RetryScheduler] 排程重試失敗: ${eventName}`, err)\n throw err\n }\n }\n\n /**\n * 獲取特定事件的隊列\n *\n * @param eventName 事件名稱\n * @returns Queue 實例或 undefined\n */\n getQueue(eventName: string): unknown {\n const queueName = `gravito:event:retries:${eventName}`\n return this.queues.get(queueName)\n }\n\n /**\n * 取得所有隊列統計\n */\n getStats(): Map<string, QueueStats> {\n const stats = new Map<string, QueueStats>()\n\n for (const [queueName, queue] of this.queues.entries()) {\n const queueObj = queue as any\n\n stats.set(queueName, {\n name: queueName,\n jobCounts: {\n waiting: queueObj.count?.waiting ?? 0,\n active: queueObj.count?.active ?? 0,\n delayed: queueObj.count?.delayed ?? 0,\n failed: queueObj.count?.failed ?? 0,\n },\n completedCount: queueObj.count?.completed ?? 0,\n failedCount: queueObj.count?.failed ?? 0,\n })\n }\n\n return stats\n }\n\n /**\n * 關閉所有隊列並清理資源\n */\n async shutdown(): Promise<void> {\n const closePromises: Promise<void>[] = []\n\n for (const queue of this.queues.values()) {\n const queueObj = queue as any\n if (typeof queueObj.close === 'function') {\n closePromises.push(queueObj.close())\n }\n }\n\n await Promise.all(closePromises)\n this.queues.clear()\n }\n}\n",
149
- "/**\n * Worker Pool Metrics for OpenTelemetry integration.\n *\n * Tracks worker pool statistics and emits metrics using OpenTelemetry.\n * Follows the Provider Callback pattern for dynamic metric collection.\n *\n * @internal\n */\n\nimport type { Counter, Histogram, Meter } from '@opentelemetry/api'\n\n/**\n * Worker Pool Metrics Recorder\n */\nexport class WorkerPoolMetrics {\n private taskDurationHistogram?: Histogram\n private taskCounter?: Counter\n private autoScalingCounter?: Counter\n private poolSizeCallback?: () => number\n private utilizationCallback?: () => number\n private queueDepthCallback?: () => number\n\n constructor(private meter: Meter) {\n this.initializeMetrics()\n }\n\n /**\n * Initialize OpenTelemetry metrics\n */\n private initializeMetrics(): void {\n // Histogram for task execution duration (in milliseconds)\n this.taskDurationHistogram = this.meter.createHistogram('gravito_worker_task_duration_ms', {\n description: 'Duration of task execution in milliseconds',\n unit: 'ms',\n })\n\n // Counter for task execution\n this.taskCounter = this.meter.createCounter('gravito_worker_task_total', {\n description: 'Total number of tasks processed',\n })\n\n // Counter for auto-scaling events\n this.autoScalingCounter = this.meter.createCounter('gravito_worker_autoscale_total', {\n description: 'Total number of auto-scaling events',\n })\n\n // Note: Observable Gauges for pool metrics are not created here as they require\n // callback registration which is deferred to when setPoolSizeProvider/etc are called\n }\n\n /**\n * Set provider callback for pool size metric\n */\n setPoolSizeProvider(callback: () => number): void {\n this.poolSizeCallback = callback\n }\n\n /**\n * Set provider callback for utilization metric\n */\n setUtilizationProvider(callback: () => number): void {\n this.utilizationCallback = callback\n }\n\n /**\n * Set provider callback for queue depth metric\n */\n setQueueDepthProvider(callback: () => number): void {\n this.queueDepthCallback = callback\n }\n\n /**\n * Record task execution\n *\n * @param durationMs - Task execution duration in milliseconds\n * @param priority - Task priority level\n * @param success - Whether task succeeded\n */\n recordTaskExecution(durationMs: number, priority: string, success: boolean): void {\n const status = success ? 'success' : 'failure'\n\n if (this.taskDurationHistogram) {\n this.taskDurationHistogram.record(durationMs, {\n priority,\n status,\n })\n }\n\n if (this.taskCounter) {\n this.taskCounter.add(1, {\n priority,\n status,\n })\n }\n }\n\n /**\n * Record auto-scaling event\n *\n * @param action - 'scale-up' or 'scale-down'\n * @param reason - Reason for scaling\n */\n recordAutoScaling(action: 'scale-up' | 'scale-down', reason: string): void {\n if (this.autoScalingCounter) {\n this.autoScalingCounter.add(1, {\n action,\n reason,\n })\n }\n }\n\n /**\n * Get the current pool size (for provider callbacks)\n */\n getPoolSize(): number {\n return this.poolSizeCallback?.() ?? 0\n }\n\n /**\n * Get the current utilization (for provider callbacks)\n */\n getUtilization(): number {\n return this.utilizationCallback?.() ?? 0\n }\n\n /**\n * Get the current queue depth (for provider callbacks)\n */\n getQueueDepth(): number {\n return this.queueDepthCallback?.() ?? 0\n }\n}\n",
150
- "/**\n * Worker Pool for concurrent event task processing.\n *\n * Manages a pool of workers for executing event tasks concurrently.\n * Supports auto-scaling, health checks, and OpenTelemetry metrics integration.\n *\n * @internal\n */\n\nimport type { Meter } from '@opentelemetry/api'\nimport { randomUUID } from '../compat/crypto'\nimport type { EventTask } from './types'\nimport type { TaskSource, WorkerPoolConfig, WorkerPoolStats, WorkerStats } from './WorkerPoolConfig'\nimport { WorkerPoolMetrics } from './WorkerPoolMetrics'\n\n/**\n * Internal Worker representation\n */\ninterface Worker {\n id: string\n state: 'idle' | 'busy' | 'terminated'\n tasksProcessed: number\n tasksSuccess: number\n tasksFailed: number\n totalDurationMs: number\n createdAt: number\n}\n\n/**\n * Worker Pool for managing concurrent task execution\n */\nexport class WorkerPool {\n private workers: Worker[] = []\n private taskQueue: EventTask[] = []\n private config: {\n concurrency: number\n workerThreads: number\n taskTimeout: number\n maxRetries: number\n enableAutoScaling: boolean\n minWorkers: number\n maxWorkers: number\n scaleUpThreshold: number\n scaleDownThreshold: number\n metricsInterval: number\n taskSource?: TaskSource\n }\n private metrics?: WorkerPoolMetrics\n private healthCheckTimer?: any\n private metricsTimer?: any\n private isRunning = false\n private scaleDownCounter = 0\n\n constructor(config: WorkerPoolConfig = {}, meter?: Meter) {\n // Set defaults\n let cpuCores = 1\n try {\n if (typeof process !== 'undefined' && !(process as any).browser) {\n // biome-ignore lint/security/noGlobalEval: hide from Vite\n cpuCores = Math.max(1, eval('require')('node:os').cpus().length)\n }\n } catch (_e) {\n // Fallback to 1\n }\n\n this.config = {\n concurrency: config.concurrency ?? 4,\n workerThreads: config.workerThreads ?? cpuCores,\n taskTimeout: config.taskTimeout ?? 30000,\n maxRetries: config.maxRetries ?? 3,\n enableAutoScaling: config.enableAutoScaling ?? true,\n minWorkers: config.minWorkers ?? 1,\n maxWorkers: config.maxWorkers ?? cpuCores * 2,\n scaleUpThreshold: config.scaleUpThreshold ?? 0.8,\n scaleDownThreshold: config.scaleDownThreshold ?? 0.2,\n metricsInterval: config.metricsInterval ?? 5000,\n taskSource: config.taskSource,\n }\n\n if (meter) {\n this.metrics = new WorkerPoolMetrics(meter)\n // Set up provider callbacks\n this.metrics.setPoolSizeProvider(() => this.getActiveWorkerCount())\n this.metrics.setUtilizationProvider(() => this.getUtilization())\n this.metrics.setQueueDepthProvider(() => this.taskQueue.length)\n }\n }\n\n /**\n * Start the worker pool\n */\n async start(): Promise<void> {\n if (this.isRunning) {\n return\n }\n\n this.isRunning = true\n\n // Initialize workers\n for (let i = 0; i < this.config.minWorkers; i++) {\n this.createWorker()\n }\n\n // Start health check\n this.healthCheckTimer = setInterval(\n () => this.performHealthCheck(),\n this.config.metricsInterval\n )\n\n // Start metrics collection\n this.metricsTimer = setInterval(() => this.collectMetrics(), this.config.metricsInterval)\n\n // Start auto-scaling if enabled\n if (this.config.enableAutoScaling) {\n setInterval(() => this.performAutoScaling(), this.config.metricsInterval)\n }\n }\n\n /**\n * Stop the worker pool\n */\n async stop(): Promise<void> {\n this.isRunning = false\n\n if (this.healthCheckTimer) {\n clearInterval(this.healthCheckTimer)\n }\n\n if (this.metricsTimer) {\n clearInterval(this.metricsTimer)\n }\n\n // Mark all workers as terminated\n for (const worker of this.workers) {\n worker.state = 'terminated'\n }\n\n // Wait for queue to drain\n const maxWaitTime = 5000\n const startTime = Date.now()\n while (this.taskQueue.length > 0 && Date.now() - startTime < maxWaitTime) {\n await new Promise((resolve) => setTimeout(resolve, 100))\n }\n\n this.workers = []\n this.taskQueue = []\n }\n\n /**\n * Submit a task to the worker pool\n */\n async submitTask(task: EventTask): Promise<void> {\n if (!this.isRunning) {\n throw new Error('Worker pool is not running')\n }\n\n this.taskQueue.push(task)\n this.processQueue()\n }\n\n /**\n * Process next task in queue\n */\n private processQueue(): void {\n if (!this.isRunning) {\n return\n }\n\n for (const worker of this.workers) {\n if (worker.state === 'idle' && this.taskQueue.length > 0) {\n const task = this.taskQueue.shift()\n if (task) {\n this.executeTask(worker, task)\n }\n }\n }\n }\n\n /**\n * Execute task on a worker\n */\n private async executeTask(worker: Worker, task: EventTask): Promise<void> {\n worker.state = 'busy'\n const startTime = performance.now()\n\n try {\n // Execute task callbacks\n await this.executeTaskCallbacks(task)\n\n worker.tasksSuccess++\n\n // Acknowledge completion to task source\n if (this.config.taskSource) {\n await this.config.taskSource.acknowledgeCompletion(task.id)\n }\n\n const duration = performance.now() - startTime\n this.metrics?.recordTaskExecution(duration, task.options.priority || 'normal', true)\n } catch (error) {\n worker.tasksFailed++\n\n // Acknowledge failure to task source\n if (this.config.taskSource && error instanceof Error) {\n await this.config.taskSource.acknowledgeFailure(task.id, error)\n }\n\n const duration = performance.now() - startTime\n this.metrics?.recordTaskExecution(duration, task.options.priority || 'normal', false)\n } finally {\n worker.tasksProcessed++\n worker.totalDurationMs += performance.now() - startTime\n\n worker.state = 'idle'\n\n // Process next task\n setImmediate(() => this.processQueue())\n }\n }\n\n /**\n * Execute task callbacks\n */\n private async executeTaskCallbacks(task: EventTask): Promise<void> {\n for (const callback of task.callbacks) {\n await Promise.race([callback(task.args), this.createTimeout(this.config.taskTimeout)])\n }\n }\n\n /**\n * Create a timeout promise\n */\n private createTimeout(ms: number): Promise<never> {\n return new Promise((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Task timeout after ${ms}ms`))\n }, ms)\n })\n }\n\n /**\n * Create a new worker\n */\n private createWorker(): Worker {\n const worker: Worker = {\n id: randomUUID(),\n state: 'idle',\n tasksProcessed: 0,\n tasksSuccess: 0,\n tasksFailed: 0,\n totalDurationMs: 0,\n createdAt: Date.now(),\n }\n this.workers.push(worker)\n return worker\n }\n\n /**\n * Remove a worker\n */\n private removeWorker(workerId: string): void {\n const index = this.workers.findIndex((w) => w.id === workerId)\n if (index !== -1) {\n this.workers[index].state = 'terminated'\n this.workers.splice(index, 1)\n }\n }\n\n /**\n * Perform health check and cleanup\n */\n private performHealthCheck(): void {\n // Remove terminated workers\n this.workers = this.workers.filter((w) => w.state !== 'terminated')\n\n // If no workers, create minimum\n if (this.workers.length === 0 && this.isRunning) {\n for (let i = 0; i < this.config.minWorkers; i++) {\n this.createWorker()\n }\n }\n }\n\n /**\n * Perform auto-scaling based on load\n */\n private async performAutoScaling(): Promise<void> {\n if (!this.config.enableAutoScaling) {\n return\n }\n\n const utilization = this.getUtilization()\n const activeWorkers = this.getActiveWorkerCount()\n\n // Scale up if utilization is high\n if (utilization > this.config.scaleUpThreshold && activeWorkers < this.config.maxWorkers) {\n this.createWorker()\n this.metrics?.recordAutoScaling('scale-up', `Utilization: ${(utilization * 100).toFixed(1)}%`)\n this.scaleDownCounter = 0 // Reset scale down counter\n }\n // Scale down if utilization is low (with delay)\n else if (\n utilization < this.config.scaleDownThreshold &&\n activeWorkers > this.config.minWorkers\n ) {\n this.scaleDownCounter++\n if (this.scaleDownCounter >= 3) {\n const workerToRemove = this.workers.find((w) => w.state === 'idle')\n if (workerToRemove) {\n this.removeWorker(workerToRemove.id)\n this.metrics?.recordAutoScaling(\n 'scale-down',\n `Utilization: ${(utilization * 100).toFixed(1)}%`\n )\n }\n this.scaleDownCounter = 0\n }\n } else {\n this.scaleDownCounter = 0 // Reset if utilization is in range\n }\n }\n\n /**\n * Collect metrics\n */\n private collectMetrics(): void {\n // Metrics are collected through provider callbacks\n // This method can be extended for additional logic\n }\n\n /**\n * Get number of active workers (not terminated)\n */\n private getActiveWorkerCount(): number {\n return this.workers.filter((w) => w.state !== 'terminated').length\n }\n\n /**\n * Get worker utilization (0-1)\n */\n private getUtilization(): number {\n const busyWorkers = this.workers.filter((w) => w.state === 'busy').length\n const totalWorkers = this.getActiveWorkerCount()\n\n if (totalWorkers === 0) {\n return 0\n }\n\n return busyWorkers / totalWorkers\n }\n\n /**\n * Get queue depth\n */\n getQueueDepth(): number {\n return this.taskQueue.length\n }\n\n /**\n * Get worker utilization\n */\n getWorkerUtilization(): number {\n return this.getUtilization()\n }\n\n /**\n * Get worker statistics\n */\n getWorkerStats(): WorkerStats[] {\n return this.workers.map((w) => ({\n id: w.id,\n state: w.state,\n tasksProcessed: w.tasksProcessed,\n tasksSuccess: w.tasksSuccess,\n tasksFailed: w.tasksFailed,\n avgDurationMs: w.tasksProcessed > 0 ? w.totalDurationMs / w.tasksProcessed : 0,\n uptime: Date.now() - w.createdAt,\n }))\n }\n\n /**\n * Get pool statistics\n */\n getPoolStats(): WorkerPoolStats {\n const stats: WorkerPoolStats = {\n queueDepth: this.taskQueue.length,\n utilization: this.getUtilization(),\n activeWorkers: this.getActiveWorkerCount(),\n totalTasksProcessed: 0,\n totalSuccess: 0,\n totalFailures: 0,\n }\n\n for (const worker of this.workers) {\n stats.totalTasksProcessed += worker.tasksProcessed\n stats.totalSuccess += worker.tasksSuccess\n stats.totalFailures += worker.tasksFailed\n }\n\n return stats\n }\n}\n\nexport type { WorkerPoolConfig, WorkerStats, WorkerPoolStats }\n",
151
- "import type { DeadLetterQueue } from '../events/DeadLetterQueue'\nimport type { EventPriorityQueue } from '../events/EventPriorityQueue'\nimport type { MessageQueueBridge } from '../events/MessageQueueBridge'\nimport type { WorkerPool } from '../events/WorkerPool'\nimport type { HookManager } from '../HookManager'\n\n/**\n * Configuration for QueueDashboard\n * All subsystem references are optional to support progressive integration\n */\nexport interface QueueDashboardConfig {\n eventQueue?: EventPriorityQueue\n workerPool?: WorkerPool\n hookManager?: HookManager\n dlq?: DeadLetterQueue\n messageQueueBridge?: MessageQueueBridge\n}\n\n/**\n * Queue depth and backpressure metrics\n */\nexport interface QueueMetrics {\n depth: {\n total: number\n high: number\n normal: number\n low: number\n }\n backpressure: {\n state: string\n rejectedCount: number\n degradedCount: number\n enqueueRate: number\n }\n processing: boolean\n}\n\n/**\n * Worker pool and thread statistics\n */\nexport interface WorkerMetrics {\n poolSize: number\n activeWorkers: number\n utilization: number\n queueDepth: number\n totalProcessed: number\n totalSuccess: number\n totalFailures: number\n successRate: number\n workers: Array<{\n id: string\n state: string\n tasksProcessed: number\n tasksSucceeded: number\n tasksFailed: number\n avgDurationMs: number\n currentLoad: number\n }>\n}\n\n/**\n * Timeline event for job processing history\n */\nexport interface JobEvent {\n id: string\n hook: string\n status: 'pending' | 'processing' | 'completed' | 'failed' | 'in_dlq'\n priority: string\n createdAt: number\n error?: string\n retryCount: number\n}\n\n/**\n * Error statistics and circuit breaker status\n */\nexport interface ErrorStats {\n totalErrors: number\n byEvent: Record<string, number>\n circuitBreakers: Array<{\n eventName: string\n state: string\n failures: number\n successes: number\n }>\n dlqCount: number\n}\n\n/**\n * Complete dashboard snapshot at a point in time\n */\nexport interface DashboardSnapshot {\n timestamp: number\n queue: QueueMetrics\n workers: WorkerMetrics\n timeline: JobEvent[]\n errors: ErrorStats\n}\n\n/**\n * QueueDashboard aggregates metrics from all event processing subsystems\n * Uses Facade pattern to read-only aggregate data without modifying subsystems\n */\nexport class QueueDashboard {\n private readonly config: QueueDashboardConfig\n\n constructor(config: QueueDashboardConfig) {\n this.config = config\n }\n\n /**\n * Get current queue metrics (depth, backpressure state, enqueue rate)\n */\n getQueueMetrics(): QueueMetrics {\n const eventQueue = this.config.eventQueue\n const backpressureManager = eventQueue?.getBackpressureManager?.()\n\n // Default values when no event queue configured\n if (!eventQueue) {\n return {\n depth: { total: 0, high: 0, normal: 0, low: 0 },\n backpressure: {\n state: 'NORMAL',\n rejectedCount: 0,\n degradedCount: 0,\n enqueueRate: 0,\n },\n processing: false,\n }\n }\n\n const depth = {\n total: eventQueue.getDepth(),\n high: eventQueue.getDepthByPriority?.('high') ?? 0,\n normal: eventQueue.getDepthByPriority?.('normal') ?? 0,\n low: eventQueue.getDepthByPriority?.('low') ?? 0,\n }\n\n let backpressure = {\n state: 'NORMAL',\n rejectedCount: 0,\n degradedCount: 0,\n enqueueRate: 0,\n }\n\n if (backpressureManager) {\n const state = backpressureManager.getState?.()\n const metrics = backpressureManager.getMetrics?.()\n\n backpressure = {\n state: state ?? 'NORMAL',\n rejectedCount: metrics?.rejectedCount ?? 0,\n degradedCount: metrics?.degradedCount ?? 0,\n enqueueRate: metrics?.enqueueRate ?? 0,\n }\n }\n\n return {\n depth,\n backpressure,\n processing: depth.total > 0,\n }\n }\n\n /**\n * Get current worker pool metrics (size, utilization, success rate)\n */\n getWorkerMetrics(): WorkerMetrics {\n const workerPool = this.config.workerPool\n\n // Default values when no worker pool configured\n if (!workerPool) {\n return {\n poolSize: 0,\n activeWorkers: 0,\n utilization: 0,\n queueDepth: 0,\n totalProcessed: 0,\n totalSuccess: 0,\n totalFailures: 0,\n successRate: 1.0,\n workers: [],\n }\n }\n\n const poolStats = workerPool.getPoolStats?.() ?? {\n queueDepth: 0,\n utilization: 0,\n activeWorkers: 0,\n totalTasksProcessed: 0,\n totalSuccess: 0,\n totalFailures: 0,\n }\n\n const workerStats = workerPool.getWorkerStats?.() ?? []\n\n const totalProcessed = poolStats.totalTasksProcessed ?? 0\n const successRate = totalProcessed > 0 ? (poolStats.totalSuccess ?? 0) / totalProcessed : 1.0\n\n return {\n poolSize: (workerPool as any).config?.workerThreads ?? 0,\n activeWorkers: poolStats.activeWorkers ?? 0,\n utilization: poolStats.utilization ?? 0,\n queueDepth: poolStats.queueDepth ?? 0,\n totalProcessed,\n totalSuccess: poolStats.totalSuccess ?? 0,\n totalFailures: poolStats.totalFailures ?? 0,\n successRate,\n workers: workerStats.map((w) => ({\n id: w.id,\n state: w.state,\n tasksProcessed: w.tasksProcessed ?? 0,\n tasksSucceeded: w.tasksSuccess ?? 0,\n tasksFailed: w.tasksFailed ?? 0,\n avgDurationMs: w.avgDurationMs ?? 0,\n currentLoad: 0,\n })),\n }\n }\n\n /**\n * Get job event timeline from DLQ entries (recent failures)\n * @param limit Maximum number of entries to return (default: 50)\n */\n getJobTimeline(limit = 50): JobEvent[] {\n const dlq = this.config.dlq\n\n if (!dlq) {\n return []\n }\n\n const dlqEntries = dlq.list?.({ limit }) ?? []\n\n return dlqEntries.map((entry) => ({\n id: entry.id ?? '',\n hook: entry.eventName ?? 'unknown',\n status: 'in_dlq' as const,\n priority: entry.options?.priority ?? 'normal',\n createdAt: entry.firstFailedAt ?? Date.now(),\n error: entry.error?.message ?? String(entry.error),\n retryCount: entry.retryCount ?? 0,\n }))\n }\n\n /**\n * Get error statistics including circuit breaker status and DLQ counts\n */\n getErrorBreakdown(): ErrorStats {\n const dlq = this.config.dlq\n const hookManager = this.config.hookManager\n\n // Get DLQ statistics\n const dlqCount = dlq?.getCount?.() ?? 0\n const dlqEntries = dlq?.list?.({ limit: 1000 }) ?? []\n\n // Count errors by event name\n const byEvent: Record<string, number> = {}\n for (const entry of dlqEntries) {\n const eventName = entry.eventName ?? 'unknown'\n byEvent[eventName] = (byEvent[eventName] ?? 0) + 1\n }\n\n // Get circuit breaker statistics\n const circuitBreakers = hookManager?.getCircuitBreakerStats?.() ?? []\n\n const totalErrors =\n dlqCount + circuitBreakers.reduce((sum, cb) => sum + (cb.totalFailures ?? 0), 0)\n\n return {\n totalErrors,\n byEvent,\n circuitBreakers: circuitBreakers.map((cb) => ({\n eventName: cb.eventName ?? '',\n state: cb.state ?? 'CLOSED',\n failures: cb.totalFailures ?? 0,\n successes: cb.totalSuccesses ?? 0,\n })),\n dlqCount,\n }\n }\n\n /**\n * Export metrics in JSON or Prometheus format\n * @param format Export format: 'json' or 'prometheus'\n */\n exportMetrics(format: 'json' | 'prometheus'): string {\n const snapshot = this.getSnapshot()\n\n if (format === 'json') {\n return JSON.stringify(snapshot, null, 2)\n }\n\n return this.formatPrometheus(snapshot)\n }\n\n /**\n * Get complete snapshot of all metrics at a point in time\n */\n getSnapshot(options?: { timelineLimit?: number }): DashboardSnapshot {\n return {\n timestamp: Date.now(),\n queue: this.getQueueMetrics(),\n workers: this.getWorkerMetrics(),\n timeline: this.getJobTimeline(options?.timelineLimit ?? 50),\n errors: this.getErrorBreakdown(),\n }\n }\n\n /**\n * Format metrics in Prometheus/OpenMetrics text format\n */\n private formatPrometheus(snapshot: DashboardSnapshot): string {\n const lines: string[] = []\n\n // Queue depth metrics\n lines.push('# HELP gravito_queue_depth Current queue depth by priority')\n lines.push('# TYPE gravito_queue_depth gauge')\n lines.push(`gravito_queue_depth{priority=\"high\"} ${snapshot.queue.depth.high}`)\n lines.push(`gravito_queue_depth{priority=\"normal\"} ${snapshot.queue.depth.normal}`)\n lines.push(`gravito_queue_depth{priority=\"low\"} ${snapshot.queue.depth.low}`)\n lines.push(`gravito_queue_depth{priority=\"total\"} ${snapshot.queue.depth.total}`)\n lines.push('')\n\n // Backpressure metrics\n lines.push('# HELP gravito_backpressure_state Current backpressure state')\n lines.push('# TYPE gravito_backpressure_state gauge')\n const stateValue =\n snapshot.queue.backpressure.state === 'CRITICAL'\n ? 3\n : snapshot.queue.backpressure.state === 'WARNING'\n ? 2\n : snapshot.queue.backpressure.state === 'OVERFLOW'\n ? 4\n : 1\n lines.push(`gravito_backpressure_state ${stateValue}`)\n lines.push('')\n\n lines.push(\n '# HELP gravito_backpressure_rejected_total Total rejected events due to backpressure'\n )\n lines.push('# TYPE gravito_backpressure_rejected_total counter')\n lines.push(`gravito_backpressure_rejected_total ${snapshot.queue.backpressure.rejectedCount}`)\n lines.push('')\n\n lines.push('# HELP gravito_backpressure_enqueue_rate Current enqueue rate')\n lines.push('# TYPE gravito_backpressure_enqueue_rate gauge')\n lines.push(`gravito_backpressure_enqueue_rate ${snapshot.queue.backpressure.enqueueRate}`)\n lines.push('')\n\n // Worker pool metrics\n lines.push('# HELP gravito_worker_pool_size Total worker threads in pool')\n lines.push('# TYPE gravito_worker_pool_size gauge')\n lines.push(`gravito_worker_pool_size ${snapshot.workers.poolSize}`)\n lines.push('')\n\n lines.push('# HELP gravito_worker_pool_active Active workers')\n lines.push('# TYPE gravito_worker_pool_active gauge')\n lines.push(`gravito_worker_pool_active ${snapshot.workers.activeWorkers}`)\n lines.push('')\n\n lines.push('# HELP gravito_worker_pool_utilization Worker pool utilization ratio')\n lines.push('# TYPE gravito_worker_pool_utilization gauge')\n lines.push(`gravito_worker_pool_utilization ${snapshot.workers.utilization}`)\n lines.push('')\n\n // Task processing metrics\n lines.push('# HELP gravito_worker_tasks_processed Total tasks processed')\n lines.push('# TYPE gravito_worker_tasks_processed counter')\n lines.push(`gravito_worker_tasks_processed ${snapshot.workers.totalProcessed}`)\n lines.push('')\n\n lines.push('# HELP gravito_worker_tasks_success Total successful tasks')\n lines.push('# TYPE gravito_worker_tasks_success counter')\n lines.push(`gravito_worker_tasks_success ${snapshot.workers.totalSuccess}`)\n lines.push('')\n\n lines.push('# HELP gravito_worker_tasks_failed Total failed tasks')\n lines.push('# TYPE gravito_worker_tasks_failed counter')\n lines.push(`gravito_worker_tasks_failed ${snapshot.workers.totalFailures}`)\n lines.push('')\n\n lines.push('# HELP gravito_worker_success_rate Task success rate ratio')\n lines.push('# TYPE gravito_worker_success_rate gauge')\n lines.push(`gravito_worker_success_rate ${snapshot.workers.successRate}`)\n lines.push('')\n\n // Circuit breaker metrics\n lines.push('# HELP gravito_circuit_breaker_failures Total failures per circuit breaker')\n lines.push('# TYPE gravito_circuit_breaker_failures gauge')\n for (const cb of snapshot.errors.circuitBreakers) {\n lines.push(\n `gravito_circuit_breaker_failures{event=\"${this.escapePrometheusLabel(cb.eventName)}\"} ${cb.failures}`\n )\n }\n lines.push('')\n\n lines.push('# HELP gravito_circuit_breaker_successes Total successes per circuit breaker')\n lines.push('# TYPE gravito_circuit_breaker_successes gauge')\n for (const cb of snapshot.errors.circuitBreakers) {\n lines.push(\n `gravito_circuit_breaker_successes{event=\"${this.escapePrometheusLabel(cb.eventName)}\"} ${cb.successes}`\n )\n }\n lines.push('')\n\n // Error metrics by event\n lines.push('# HELP gravito_errors_by_event Total errors per event name')\n lines.push('# TYPE gravito_errors_by_event gauge')\n for (const [eventName, count] of Object.entries(snapshot.errors.byEvent)) {\n lines.push(\n `gravito_errors_by_event{event=\"${this.escapePrometheusLabel(eventName)}\"} ${count}`\n )\n }\n lines.push('')\n\n // Error metrics\n lines.push('# HELP gravito_errors_total Total number of errors')\n lines.push('# TYPE gravito_errors_total counter')\n lines.push(`gravito_errors_total ${snapshot.errors.totalErrors}`)\n lines.push('')\n\n lines.push('# HELP gravito_dlq_size Current size of dead letter queue')\n lines.push('# TYPE gravito_dlq_size gauge')\n lines.push(`gravito_dlq_size ${snapshot.errors.dlqCount}`)\n lines.push('')\n\n return lines.join('\\n')\n }\n\n /**\n * Escape special characters in Prometheus labels\n */\n private escapePrometheusLabel(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n')\n }\n}\n",
152
- "import { GravitoException } from './GravitoException'\n\n/**\n * Exception thrown when authentication fails.\n * @public\n */\nexport class AuthenticationException extends GravitoException {\n constructor(message = 'Unauthenticated.') {\n super(401, 'UNAUTHENTICATED', {\n message,\n i18nKey: 'errors.authentication.unauthenticated',\n })\n }\n}\n",
153
- "import { GravitoException } from './GravitoException'\n\n/**\n * Exception thrown when user is not authorized to perform an action.\n * @public\n */\nexport class AuthorizationException extends GravitoException {\n constructor(message = 'This action is unauthorized.') {\n super(403, 'FORBIDDEN', {\n message,\n i18nKey: 'errors.authorization.forbidden',\n })\n }\n}\n",
154
- "import type { ConfigManager } from './ConfigManager'\nimport type { Container } from './Container'\nimport type { PlanetCore } from './PlanetCore'\n\n/**\n * ServiceProvider - The foundation for modular service registration.\n *\n * Service providers are the central place to configure your application.\n * They bind services to the container and bootstrap application features.\n *\n * Lifecycle:\n * 1. register() - Called during registration phase (sync or async)\n * 2. boot() - Called after ALL providers have registered\n *\n * @since 1.0.0\n * @example\n * ```typescript\n * class DatabaseServiceProvider extends ServiceProvider {\n * register(container: Container) {\n * container.singleton('db', () => new DatabaseManager());\n * }\n *\n * boot(core: PlanetCore) {\n * const db = core.container.make<DatabaseManager>('db');\n * db.setDefaultConnection(core.config.get('database.default'));\n * }\n * }\n * ```\n */\nexport abstract class ServiceProvider {\n /**\n * Reference to the application core instance.\n * Set during provider registration.\n */\n protected core?: PlanetCore\n\n /**\n * Whether this provider should be deferred.\n * Deferred providers are only registered when one of their\n * provided services is actually requested from the container.\n */\n public deferred = false\n\n /**\n * Get the services provided by this provider.\n * Used for deferred loading - provider is only loaded when\n * one of these services is requested.\n *\n * @returns Array of service keys this provider offers\n *\n * @example\n * ```typescript\n * provides(): string[] {\n * return ['db', 'db.connection'];\n * }\n * ```\n */\n provides(): string[] {\n return []\n }\n\n /**\n * Register bindings in the container.\n *\n * This method is called during the registration phase.\n * **Warning**: Do not resolve services from other providers here,\n * as they may not be registered yet.\n *\n * Supports both synchronous and asynchronous registration.\n *\n * @param container - The IoC container instance\n */\n abstract register(container: Container): void | Promise<void>\n\n /**\n * Bootstrap any application services.\n *\n * This method is called after ALL providers have registered.\n * You can safely resolve services from the container here.\n *\n * @param core - The PlanetCore application instance\n */\n boot?(core: PlanetCore): void | Promise<void>\n\n /**\n * Called when the application is ready to accept requests.\n *\n * This method is called after ALL providers have booted.\n * Use this for final initialization before the server starts accepting traffic.\n *\n * @param core - The PlanetCore application instance\n * @since 2.2.0\n */\n onReady?(core: PlanetCore): void | Promise<void>\n\n /**\n * Called when the application is shutting down.\n *\n * This method is called during graceful shutdown.\n * Use this to clean up resources, close connections, etc.\n *\n * Providers are called in reverse order (LIFO).\n *\n * @param core - The PlanetCore application instance\n * @since 2.2.0\n */\n onShutdown?(core: PlanetCore): void | Promise<void>\n\n /**\n * Set the core instance reference.\n * Called internally by the application during registration.\n *\n * @internal\n */\n setCore(core: PlanetCore): void {\n this.core = core\n }\n\n // ─────────────────────────────────────────────────────────────\n // Configuration Helpers\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Merge configuration from a value into the application config.\n *\n * If the configuration key already exists and both the existing value and\n * the new value are objects, they will be shallow-merged. Otherwise, the\n * new value will overwrite the existing one.\n *\n * @param config - The ConfigManager instance.\n * @param key - The configuration key to set (supports dot notation).\n * @param value - The configuration value or object to merge.\n *\n * @example\n * ```typescript\n * this.mergeConfig(config, 'database', {\n * default: 'mysql',\n * connections: { ... }\n * });\n * ```\n */\n protected mergeConfig(config: ConfigManager, key: string, value: unknown): void {\n const existing = config.has(key) ? config.get(key) : {}\n\n if (\n typeof existing === 'object' &&\n existing !== null &&\n typeof value === 'object' &&\n value !== null\n ) {\n // Deep merge for objects\n config.set(key, { ...existing, ...value })\n } else {\n config.set(key, value)\n }\n }\n\n /**\n * Merge configuration from an async loader.\n * Useful for loading config from .ts files dynamically.\n *\n * @param config - The ConfigManager instance\n * @param key - The configuration key\n * @param loader - Async function that returns config value\n *\n * @example\n * ```typescript\n * await this.mergeConfigFrom(config, 'database', async () => {\n * return (await import('./config/database')).default;\n * });\n * ```\n */\n protected async mergeConfigFrom(\n config: ConfigManager,\n key: string,\n loader: () => Promise<unknown>\n ): Promise<void> {\n const value = await loader()\n this.mergeConfig(config, key, value)\n }\n\n // ─────────────────────────────────────────────────────────────\n // Publishing (for CLI support)\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Paths that should be published by the CLI.\n * Maps source paths to destination paths.\n */\n private static publishables: Map<string, Map<string, string>> = new Map()\n\n /**\n * Register paths to be published by the CLI.\n *\n * Used by CLI commands like `gravito vendor:publish` to copy configuration,\n * views, or assets from the package to the application directory.\n *\n * @param paths - A record mapping source paths to destination paths.\n * @param group - Optional group name for selective publishing (e.g., 'config', 'views').\n *\n * @example\n * ```typescript\n * this.publishes({\n * './config/cache.ts': 'config/cache.ts',\n * './views/errors': 'resources/views/errors'\n * }, 'config');\n * ```\n */\n protected publishes(paths: Record<string, string>, group?: string): void {\n const groupKey = group ?? this.constructor.name\n\n if (!ServiceProvider.publishables.has(groupKey)) {\n ServiceProvider.publishables.set(groupKey, new Map())\n }\n\n const groupPaths = ServiceProvider.publishables.get(groupKey)!\n for (const [source, dest] of Object.entries(paths)) {\n groupPaths.set(source, dest)\n }\n }\n\n /**\n * Get all publishable paths for a group.\n *\n * @param group - The group name (defaults to provider class name)\n * @returns Map of source to destination paths\n */\n static getPublishables(group?: string): Map<string, string> {\n if (group) {\n return ServiceProvider.publishables.get(group) ?? new Map()\n }\n\n // Return all publishables merged\n const all = new Map<string, string>()\n for (const paths of ServiceProvider.publishables.values()) {\n for (const [source, dest] of paths) {\n all.set(source, dest)\n }\n }\n return all\n }\n\n /**\n * Get all publish groups.\n *\n * @returns Array of group names\n */\n static getPublishGroups(): string[] {\n return Array.from(ServiceProvider.publishables.keys())\n }\n}\n",
155
- "import { type GravitoConfig, PlanetCore } from './PlanetCore'\nimport { ServiceProvider } from './ServiceProvider'\n\n/**\n * Manifest describing a Gravito application structure.\n * @public\n */\nexport interface GravitoManifest {\n name: string\n version?: string\n modules: string[]\n config?: GravitoConfig\n}\n\n/**\n * Function type for asynchronous module resolution.\n * @public\n */\nexport type ModuleResolver = () => Promise<any>\n\n/**\n * Gravito 核心啟動引擎 (已解耦)\n */\nexport class GravitoServer {\n /**\n * 一鍵建立並組裝伺服器\n * @param manifest 站點描述清單\n * @param resolvers 模組解析器字典\n * @param baseOrbits 基礎軌道模組 (例如 OrbitMonolith)\n */\n static async create(\n manifest: GravitoManifest,\n resolvers: Record<string, ModuleResolver>,\n baseOrbits: any[] = []\n ): Promise<PlanetCore> {\n const core = new PlanetCore(manifest.config || {})\n\n // 掛載基礎設施軌道\n for (const Orbit of baseOrbits) {\n core.orbit(Orbit)\n }\n\n console.log(`\n🌌 [Gravito Core] 正在點燃: ${manifest.name} v${manifest.version || '1.0.0'}`)\n\n for (const moduleId of manifest.modules) {\n const resolver = resolvers[moduleId]\n if (!resolver) {\n continue\n }\n\n try {\n const exported = await resolver()\n let instance: ServiceProvider\n\n if (typeof exported === 'function' && exported.prototype instanceof ServiceProvider) {\n instance = new exported()\n } else if (exported instanceof ServiceProvider) {\n instance = exported\n } else {\n continue\n }\n\n core.register(instance)\n console.log(` ✅ 模組點火成功: [${moduleId}]`)\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error)\n console.error(` ❌ 模組 [${moduleId}] 點火失敗: ${message}`)\n }\n }\n\n return core\n }\n}\n",
156
- "/**\n * @fileoverview HealthProvider - Cloud-native health checks\n *\n * Provides liveness and readiness probes for Kubernetes and cloud deployments\n *\n * @module @gravito/core/health\n * @since 2.2.0\n */\n\nimport type { Container } from '../Container'\nimport type { PlanetCore } from '../PlanetCore'\nimport { ServiceProvider } from '../ServiceProvider'\n\n/**\n * Health check result\n * @public\n */\nexport interface HealthCheckResult {\n /** Health status */\n status: 'healthy' | 'unhealthy'\n /** Optional message */\n message?: string\n}\n\n/**\n * Health check function interface\n * @public\n */\nexport interface HealthCheck {\n /** Unique name for this check */\n name: string\n /** Check function that returns health status */\n check(): Promise<HealthCheckResult>\n}\n\n/**\n * HealthProvider - Provides /health/liveness and /health/readiness endpoints\n *\n * - Liveness: Always returns 200 OK (just checks if server is running)\n * - Readiness: Returns 200 if all checks are healthy, 503 otherwise\n *\n * @public\n */\nexport class HealthProvider extends ServiceProvider {\n private checks: HealthCheck[] = []\n\n register(container: Container) {\n container.singleton('health', () => this)\n }\n\n /**\n * Register a health check\n *\n * @param check - The health check to register\n *\n * @example\n * ```typescript\n * const health = core.container.make<HealthProvider>('health')\n * health.registerCheck({\n * name: 'database',\n * check: async () => {\n * try {\n * await db.ping()\n * return { status: 'healthy' }\n * } catch {\n * return { status: 'unhealthy', message: 'DB unreachable' }\n * }\n * }\n * })\n * ```\n */\n registerCheck(check: HealthCheck): void {\n this.checks.push(check)\n }\n\n boot(core: PlanetCore) {\n // Liveness probe - always 200\n core.router.get('/health/liveness', () => {\n return new Response('OK', { status: 200 })\n })\n\n // Readiness probe - depends on checks\n core.router.get('/health/readiness', async () => {\n const results = await Promise.all(this.checks.map((c) => c.check()))\n\n const checkResults: Record<string, HealthCheckResult> = {}\n for (let i = 0; i < this.checks.length; i++) {\n checkResults[this.checks[i].name] = results[i]\n }\n\n const allHealthy = results.every((r) => r.status === 'healthy')\n\n return Response.json(\n {\n status: allHealthy ? 'healthy' : 'unhealthy',\n timestamp: new Date().toISOString(),\n checks: checkResults,\n },\n {\n status: allHealthy ? 200 : 503,\n }\n )\n })\n }\n}\n\nexport default HealthProvider\n",
157
- "import { CookieJar, type CookieOptions } from './CookieJar'\nimport type { GravitoContext } from './types'\n\n/**\n * Get a cookie value from the request\n * @param c - Context object\n * @param name - Cookie name\n * @returns Cookie value or undefined\n * @public\n */\nexport function getCookie(c: GravitoContext, name: string): string | undefined {\n const cookieHeader = c.req.header('Cookie') || ''\n const cookies = CookieJar.parseCookies(cookieHeader)\n return cookies[name]\n}\n\n/**\n * Set a cookie in the response\n * @param c - Context object\n * @param name - Cookie name\n * @param value - Cookie value\n * @param options - Cookie options\n * @public\n */\nexport function setCookie(\n c: GravitoContext,\n name: string,\n value: string,\n options: CookieOptions & { maxAge?: number } = {}\n): void {\n // Try to use CookieJar if available (when using PlanetCore)\n const cookieJar = c.get('cookieJar') as CookieJar | undefined\n if (cookieJar) {\n // Convert maxAge (seconds) to minutes for CookieJar\n const minutes = options.maxAge ? Math.floor(options.maxAge / 60) : 60\n cookieJar.queue(name, value, minutes, options)\n return\n }\n\n // Fallback: 直接設置 Set-Cookie header(使用 Bun 原生 Cookie API)\n const cookie = new Bun.Cookie(name, value, {\n path: options.path,\n domain: options.domain,\n expires: options.expires,\n maxAge: options.maxAge,\n secure: options.secure,\n httpOnly: options.httpOnly,\n sameSite: options.sameSite?.toLowerCase() as 'strict' | 'lax' | 'none' | undefined,\n })\n c.header('Set-Cookie', cookie.toString(), { append: true })\n}\n\n/**\n * Delete a cookie (expire it)\n * @param c - Context object\n * @param name - Cookie name\n * @param options - Cookie options (path, domain, etc.)\n * @public\n */\nexport function deleteCookie(c: GravitoContext, name: string, options: CookieOptions = {}): void {\n // Try to use CookieJar if available\n const cookieJar = c.get('cookieJar') as CookieJar | undefined\n if (cookieJar) {\n cookieJar.forget(name, options)\n return\n }\n\n // Fallback: Set cookie with expired date\n setCookie(c, name, '', {\n ...options,\n maxAge: 0,\n expires: new Date(0),\n })\n}\n",
158
- "/**\n * @fileoverview RequestContext - AsyncLocalStorage-based request context management\n *\n * Allows deep service layers to access request-scoped data (requestId, userId, etc.)\n * without passing parameters through the call stack.\n *\n * @module @gravito/core/RequestContext\n * @since 2.2.0\n */\n\nimport { AsyncLocalStorage } from './compat/async-local-storage'\n\n/**\n * 請求上下文資料介面\n * 包含請求相關的唯一識別碼和上下文資訊\n * @public\n */\nexport interface RequestContextData {\n /** 唯一的請求識別碼 */\n requestId: string\n /** 使用者 ID(可選) */\n userId?: string\n /** 租戶 ID(可選) */\n tenantId?: string\n /** 追蹤 ID(可選) */\n traceId?: string\n /** 自訂欄位 */\n [key: string]: unknown\n}\n\n/**\n * AsyncLocalStorage 實例,用於隔離非同步上下文\n * @internal\n */\nconst storage = new AsyncLocalStorage<RequestContextData>()\n\n/**\n * RequestContext 物件 - 管理請求上下文的 API\n *\n * 提供在非同步鏈中存取和設定請求上下文的方法\n * @public\n */\nexport const RequestContext = {\n /**\n * 在給定的上下文中執行函式\n *\n * 確保函式及其所有非同步呼叫都在同一個上下文中執行\n *\n * @param data - 請求上下文資料\n * @param fn - 要執行的函式(可以是非同步的或同步的)\n * @returns 如果函式是非同步的,返回 Promise;如果是同步的,直接返回值\n *\n * @example\n * ```typescript\n * await RequestContext.run({ requestId: 'req-123' }, async () => {\n * const userId = RequestContext.get()?.userId;\n * });\n *\n * const result = RequestContext.run({ requestId: 'req-123' }, () => {\n * return 'sync-result';\n * });\n * ```\n */\n run<T>(data: RequestContextData, fn: () => T | Promise<T>): T | Promise<T> {\n return storage.run(data, fn)\n },\n\n /**\n * 獲取當前請求的上下文資料\n *\n * @returns 請求上下文資料,如果不在請求上下文中則返回 undefined\n *\n * @example\n * ```typescript\n * const context = RequestContext.get();\n * if (context) {\n * console.log(context.requestId);\n * }\n * ```\n */\n get(): RequestContextData | undefined {\n return storage.getStore()\n },\n\n /**\n * 獲取當前請求的上下文資料,如果不存在則拋出錯誤\n *\n * @returns 請求上下文資料\n * @throws Error 如果不在請求上下文中\n *\n * @example\n * ```typescript\n * const context = RequestContext.getOrThrow();\n * console.log(context.requestId); // 保證不為 undefined\n * ```\n */\n getOrThrow(): RequestContextData {\n const context = storage.getStore()\n if (!context) {\n throw new Error('RequestContext is not available in the current async context')\n }\n return context\n },\n\n /**\n * 在當前上下文中設定或修改值\n *\n * @param key - 要設定的欄位名稱\n * @param value - 要設定的值\n * @throws Error 如果不在請求上下文中\n *\n * @example\n * ```typescript\n * RequestContext.set('userId', 'user-456');\n * const userId = RequestContext.get()?.userId; // 'user-456'\n * ```\n */\n set(key: string, value: unknown): void {\n const context = storage.getStore()\n if (!context) {\n throw new Error('RequestContext is not available in the current async context')\n }\n context[key] = value\n },\n}\n\nexport default RequestContext\n",
159
- "import { expect } from 'bun:test'\n\n/**\n * TestResponse wraps a standard Fetch Response and provides fluent assertion methods\n * inspired by Laravel's TestResponse.\n */\nexport class TestResponse {\n private _jsonData: any = null\n private _textData: string | null = null\n\n constructor(public readonly response: Response) {}\n\n /**\n * Assert the response status code\n */\n assertStatus(status: number): this {\n expect(this.response.status).toBe(status)\n return this\n }\n\n /**\n * Assert that the response has a 200 status code\n */\n assertOk(): this {\n return this.assertStatus(200)\n }\n\n /**\n * Assert that the response has a 201 status code\n */\n assertCreated(): this {\n return this.assertStatus(201)\n }\n\n /**\n * Assert that the response has a 404 status code\n */\n assertNotFound(): this {\n return this.assertStatus(404)\n }\n\n /**\n * Assert that the response has a 403 status code\n */\n assertForbidden(): this {\n return this.assertStatus(403)\n }\n\n /**\n * Assert that the response has a 401 status code\n */\n assertUnauthorized(): this {\n return this.assertStatus(401)\n }\n\n /**\n * Assert the response is a redirect\n */\n assertRedirect(uri?: string): this {\n expect([301, 302, 303, 307, 308]).toContain(this.response.status)\n if (uri) {\n expect(this.response.headers.get('Location')).toBe(uri)\n }\n return this\n }\n\n /**\n * Assert that the response contains the given JSON data.\n */\n async assertJson(data: any): Promise<this> {\n const json = await this.getJson()\n expect(json).toMatchObject(data)\n return this\n }\n\n /**\n * Assert that the response contains exactly the given JSON data.\n */\n async assertExactJson(data: any): Promise<this> {\n const json = await this.getJson()\n expect(json).toEqual(data)\n return this\n }\n\n /**\n * Assert the structure of the JSON response.\n */\n async assertJsonStructure(structure: any): Promise<this> {\n const json = await this.getJson()\n // Simple implementation: check keys recursively\n const checkKeys = (data: any, struct: any) => {\n for (const key in struct) {\n if (Array.isArray(struct[key])) {\n expect(Array.isArray(data[key])).toBe(true)\n if (data[key].length > 0) {\n checkKeys(data[key][0], struct[key][0])\n }\n } else if (typeof struct[key] === 'object') {\n expect(typeof data[key]).toBe('object')\n checkKeys(data[key], struct[key])\n } else {\n expect(data).toHaveProperty(key)\n }\n }\n }\n checkKeys(json, structure)\n return this\n }\n\n /**\n * Assert that the response contains the given string.\n */\n async assertSee(value: string): Promise<this> {\n const text = await this.getText()\n expect(text).toContain(value)\n return this\n }\n\n /**\n * Assert that the response does not contain the given string.\n */\n async assertDontSee(value: string): Promise<this> {\n const text = await this.getText()\n expect(text).not.toContain(value)\n return this\n }\n\n /**\n * Assert a header exists and matches value\n */\n assertHeader(header: string, value: string): this {\n expect(this.response.headers.get(header)).toBe(value)\n return this\n }\n\n /**\n * Assert a header does not exist\n */\n assertHeaderMissing(header: string): this {\n expect(this.response.headers.has(header)).toBe(false)\n return this\n }\n\n /**\n * Get the JSON content\n */\n async getJson(): Promise<any> {\n if (this._jsonData) {\n return this._jsonData\n }\n this._jsonData = await this.response.json()\n return this._jsonData\n }\n\n /**\n * Get the text content\n */\n async getText(): Promise<string> {\n if (this._textData !== null) {\n return this._textData\n }\n this._textData = await this.response.text()\n return this._textData\n }\n\n /**\n * Alias for getText for standard expectations if needed\n */\n get body(): Promise<string> {\n return this.getText()\n }\n}\n",
160
- "import type { PlanetCore } from '../PlanetCore'\nimport { TestResponse } from './TestResponse'\n\n/**\n * HttpTester provides a way to simulate HTTP requests against a PlanetCore instance\n * and returns a TestResponse for assertions.\n */\nexport class HttpTester {\n private cookies: Map<string, string> = new Map()\n\n constructor(private core: PlanetCore) {}\n\n /**\n * Make a GET request\n */\n async get(uri: string, headers: Record<string, string> = {}): Promise<TestResponse> {\n return this.call('GET', uri, null, headers)\n }\n\n /**\n * Make a POST request\n */\n async post(\n uri: string,\n data: any = null,\n headers: Record<string, string> = {}\n ): Promise<TestResponse> {\n return this.call('POST', uri, data, headers)\n }\n\n /**\n * Make a PUT request\n */\n async put(\n uri: string,\n data: any = null,\n headers: Record<string, string> = {}\n ): Promise<TestResponse> {\n return this.call('PUT', uri, data, headers)\n }\n\n /**\n * Make a PATCH request\n */\n async patch(\n uri: string,\n data: any = null,\n headers: Record<string, string> = {}\n ): Promise<TestResponse> {\n return this.call('PATCH', uri, data, headers)\n }\n\n /**\n * Make a DELETE request\n */\n async delete(\n uri: string,\n data: any = null,\n headers: Record<string, string> = {}\n ): Promise<TestResponse> {\n return this.call('DELETE', uri, data, headers)\n }\n\n /**\n * Core call method\n */\n private async call(\n method: string,\n uri: string,\n data: any,\n headers: Record<string, string>\n ): Promise<TestResponse> {\n const url = uri.startsWith('http')\n ? uri\n : `http://localhost${uri.startsWith('/') ? '' : '/'}${uri}`\n\n let body = null\n const requestHeaders = { ...headers }\n\n // Add cookies to headers\n if (this.cookies.size > 0) {\n const cookieString = Array.from(this.cookies.entries())\n .map(([name, value]) => `${name}=${value}`)\n .join('; ')\n requestHeaders.Cookie = cookieString\n }\n\n if (data) {\n if (typeof data === 'object' && !(data instanceof FormData) && !(data instanceof Blob)) {\n body = JSON.stringify(data)\n if (!requestHeaders['Content-Type'] && !requestHeaders['content-type']) {\n requestHeaders['Content-Type'] = 'application/json'\n }\n } else {\n body = data\n }\n }\n\n const request = new Request(url, {\n method,\n headers: requestHeaders,\n body,\n })\n\n // Use the core adapter's fetch directly to avoid network overhead\n const response = await this.core.adapter.fetch(request)\n\n // Capture cookies from response\n const setCookie = response.headers.get('Set-Cookie')\n if (setCookie) {\n // Handle multiple Set-Cookie headers (often separated by commas in Fetch API's get())\n const parts = setCookie.split(/,(?=[^;]+=[^;]+)/)\n for (const part of parts) {\n const cookiePair = part.split(';')[0].trim()\n const [name, ...valueParts] = cookiePair.split('=')\n if (name) {\n this.cookies.set(name, valueParts.join('='))\n }\n }\n }\n\n return new TestResponse(response)\n }\n}\n\n/**\n * Helper to create an HttpTester for a PlanetCore instance\n */\nexport function createHttpTester(core: PlanetCore): HttpTester {\n return new HttpTester(core)\n}\n",
161
- "import { getRuntimeAdapter, type RuntimeAdapter, type RuntimeFileSink } from './runtime'\n\n/**\n * Safe append file operation with automatic fallback to node:fs/promises if not supported\n * @public\n */\nexport async function runtimeAppendFile(\n adapter: RuntimeAdapter,\n path: string,\n data: string\n): Promise<void> {\n if (adapter.appendFile) {\n return adapter.appendFile(path, data)\n }\n // Fallback: use node:fs/promises\n const fs = await import('node:fs/promises')\n await fs.appendFile(path, data, 'utf8')\n}\n\n/**\n * Safe text file reading with automatic fallback to node:fs/promises if not supported\n * @public\n */\nexport async function runtimeReadText(adapter: RuntimeAdapter, path: string): Promise<string> {\n if (adapter.readFileAsText) {\n return adapter.readFileAsText(path)\n }\n // Fallback: read as buffer and decode\n const buffer = await adapter.readFile(path)\n return new TextDecoder().decode(buffer)\n}\n\n/**\n * Safe JSON file reading with automatic fallback\n * @public\n */\nexport async function runtimeReadJSON<T = unknown>(\n adapter: RuntimeAdapter,\n path: string\n): Promise<T> {\n if (adapter.readFileAsJSON) {\n return adapter.readFileAsJSON<T>(path)\n }\n // Fallback: read as text and parse\n const text = await runtimeReadText(adapter, path)\n return JSON.parse(text || '{}') as T\n}\n\n/**\n * Safe directory creation with automatic fallback\n * @public\n */\nexport async function runtimeMkdir(\n adapter: RuntimeAdapter,\n path: string,\n options?: { recursive?: boolean }\n): Promise<void> {\n if (adapter.mkdir) {\n return adapter.mkdir(path, options)\n }\n // Fallback: use node:fs/promises\n const fs = await import('node:fs/promises')\n await fs.mkdir(path, { recursive: options?.recursive ?? true })\n}\n\n/**\n * Safe directory reading with automatic fallback\n * @public\n */\nexport async function runtimeReadDir(\n adapter: RuntimeAdapter,\n path: string\n): Promise<Array<{ name: string; isFile: boolean; isDirectory: boolean }>> {\n if (adapter.readDir) {\n return adapter.readDir(path)\n }\n // Fallback: use node:fs/promises\n const fs = await import('node:fs/promises')\n const entries = await fs.readdir(path, { withFileTypes: true })\n return entries.map((e) => ({\n name: e.name,\n isFile: e.isFile(),\n isDirectory: e.isDirectory(),\n }))\n}\n\n/**\n * Safe full file statistics reading with automatic fallback\n * @public\n */\nexport async function runtimeStatFull(\n adapter: RuntimeAdapter,\n path: string\n): Promise<{ size: number; mtimeMs: number; isFile: boolean; isDirectory: boolean }> {\n if (adapter.statFull) {\n return adapter.statFull(path)\n }\n // Fallback: use node:fs/promises and stat()\n const fs = await import('node:fs/promises')\n const stats = await fs.stat(path)\n return {\n size: stats.size,\n mtimeMs: stats.mtimeMs,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n }\n}\n\n/**\n * Safe file rename/move with automatic fallback\n * @public\n */\nexport async function runtimeRename(\n adapter: RuntimeAdapter,\n oldPath: string,\n newPath: string\n): Promise<void> {\n if (adapter.rename) {\n return adapter.rename(oldPath, newPath)\n }\n // Fallback: use node:fs/promises\n const fs = await import('node:fs/promises')\n await fs.rename(oldPath, newPath)\n}\n\n/**\n * Safe file sink creation with automatic fallback\n * @public\n */\nexport function runtimeCreateFileSink(adapter: RuntimeAdapter, path: string): RuntimeFileSink {\n if (adapter.createFileSink) {\n return adapter.createFileSink(path)\n }\n // Fallback: simple write accumulator (not efficient but functional)\n const chunks: Uint8Array[] = []\n return {\n write(data) {\n const buffer =\n typeof data === 'string'\n ? new TextEncoder().encode(data)\n : data instanceof ArrayBuffer\n ? new Uint8Array(data)\n : data\n chunks.push(buffer)\n },\n async flush() {\n // Flush all accumulated chunks to disk\n if (chunks.length > 0) {\n const full = new Uint8Array(chunks.reduce((acc, c) => acc + c.length, 0))\n let offset = 0\n for (const chunk of chunks) {\n full.set(chunk, offset)\n offset += chunk.length\n }\n await adapter.writeFile(path, full)\n }\n },\n async end() {\n await this.flush()\n chunks.length = 0\n },\n }\n}\n\n/**\n * Safe recursive directory removal with automatic fallback\n * @public\n */\nexport async function runtimeRemoveRecursive(adapter: RuntimeAdapter, path: string): Promise<void> {\n if (adapter.removeRecursive) {\n return adapter.removeRecursive(path)\n }\n // Fallback: use node:fs/promises\n const fs = await import('node:fs/promises')\n try {\n await fs.rm(path, { recursive: true, force: true })\n } catch {\n // Ignore if not found\n }\n}\n\n/**\n * Safe exclusive file write with automatic fallback\n * @public\n */\nexport async function runtimeWriteFileExclusive(\n adapter: RuntimeAdapter,\n path: string,\n data: string | Uint8Array\n): Promise<void> {\n if (adapter.writeFileExclusive) {\n return adapter.writeFileExclusive(path, data)\n }\n // Fallback: use node:fs/promises\n const fs = await import('node:fs/promises')\n const payload = typeof data === 'string' ? data : new TextDecoder().decode(data)\n await fs.writeFile(path, payload, { flag: 'wx' })\n}\n\n/**\n * Get default runtime adapter instance\n * @public\n */\nexport function getDefaultRuntimeAdapter(): RuntimeAdapter {\n return getRuntimeAdapter()\n}\n",
162
- "/**\n * BinaryUtils - 統一的二進制轉換工具類\n *\n * 支援 Bun 原生 API 優化,並提供 Node.js 回退路徑。\n * 設計為 isomorphic,可在 Bun 和 Node.js 環境中運行。\n * @public\n */\n\n/**\n * 偵測當前是否在 Bun 運行時中\n */\nconst isBunRuntime = (): boolean =>\n typeof globalThis !== 'undefined' &&\n typeof (globalThis as Record<string, unknown>).Bun !== 'undefined'\n\n/**\n * BinaryUtils - 提供統一的二進制轉換、編碼、壓縮工具\n * 所有方法均為靜態方法,可直接呼叫\n * @public\n */\nexport class BinaryUtils {\n /**\n * 將各種資料類型轉換為 Uint8Array\n * @param data - 輸入資料(Blob、Buffer、string、ArrayBuffer 或 Uint8Array)\n * @returns Uint8Array\n * @public\n */\n static async toUint8Array(\n data: Blob | Buffer | string | ArrayBuffer | Uint8Array\n ): Promise<Uint8Array> {\n if (data instanceof Uint8Array) {\n return data\n }\n if (typeof data === 'string') {\n return new TextEncoder().encode(data)\n }\n if (data instanceof ArrayBuffer) {\n return new Uint8Array(data)\n }\n if (typeof Buffer !== 'undefined' && data instanceof Buffer) {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n }\n if (data instanceof Blob) {\n return new Uint8Array(await data.arrayBuffer())\n }\n throw new TypeError('[BinaryUtils] toUint8Array: 不支援的資料類型')\n }\n\n /**\n * 將各種資料類型轉換為 ArrayBuffer\n * @param data - 輸入資料\n * @returns ArrayBuffer\n * @public\n */\n static async toArrayBuffer(\n data: Blob | Buffer | string | Uint8Array | ArrayBuffer\n ): Promise<ArrayBuffer> {\n if (data instanceof ArrayBuffer) {\n return data\n }\n const bytes = await BinaryUtils.toUint8Array(data as Blob | Buffer | string | Uint8Array)\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer\n }\n\n /**\n * 將 Uint8Array 編碼為 Base64 字串\n * 在 Bun 環境中使用原生 toBase64(),否則使用 Buffer\n * @param data - 輸入的 Uint8Array\n * @returns Base64 字串\n * @public\n */\n static toBase64(data: Uint8Array): string {\n if (data.length === 0) {\n return ''\n }\n const bunTyped = data as Uint8Array & { toBase64?: () => string }\n if (typeof bunTyped.toBase64 === 'function') {\n return bunTyped.toBase64()\n }\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(data).toString('base64')\n }\n let binary = ''\n for (let i = 0; i < data.length; i++) {\n binary += String.fromCharCode(data[i] as number)\n }\n return btoa(binary)\n }\n\n /**\n * 將 Base64 字串解碼為 Uint8Array\n * @param base64 - Base64 字串\n * @returns Uint8Array\n * @public\n */\n static fromBase64(base64: string): Uint8Array {\n if (!base64 || base64.length === 0) {\n return new Uint8Array(0)\n }\n const BunUint8Array = Uint8Array as typeof Uint8Array & {\n fromBase64?: (s: string) => Uint8Array\n }\n if (typeof BunUint8Array.fromBase64 === 'function') {\n return BunUint8Array.fromBase64(base64)\n }\n if (typeof Buffer !== 'undefined') {\n const buf = Buffer.from(base64, 'base64')\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength)\n }\n const binary = atob(base64)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return bytes\n }\n\n /**\n * 將 Uint8Array 編碼為 Base64URL 字串(URL 安全,無填充)\n * @param data - 輸入的 Uint8Array\n * @returns Base64URL 字串\n * @public\n */\n static toBase64Url(data: Uint8Array): string {\n if (data.length === 0) {\n return ''\n }\n // 使用 Node.js Buffer 或標準 Base64 並進行轉換\n const base64 = BinaryUtils.toBase64(data)\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '')\n }\n\n /**\n * 將 Base64URL 字串解碼為 Uint8Array\n * @param base64url - Base64URL 字串\n * @returns Uint8Array\n * @public\n */\n static fromBase64Url(base64url: string): Uint8Array {\n if (!base64url || base64url.length === 0) {\n return new Uint8Array(0)\n }\n const BunUint8Array = Uint8Array as typeof Uint8Array & {\n fromBase64?: (s: string, opts?: { alphabet?: string }) => Uint8Array\n }\n if (typeof BunUint8Array.fromBase64 === 'function') {\n return BunUint8Array.fromBase64(base64url, { alphabet: 'base64url' })\n }\n const base64 = base64url.replace(/-/g, '+').replace(/_/g, '/')\n const padded = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), '=')\n return BinaryUtils.fromBase64(padded)\n }\n\n /**\n * 將 Uint8Array 編碼為十六進制字串\n * 在 Bun 環境中使用原生 toHex(),否則使用 Buffer\n * @param data - 輸入的 Uint8Array\n * @returns 十六進制字串(小寫)\n * @public\n */\n static toHex(data: Uint8Array): string {\n if (data.length === 0) {\n return ''\n }\n const bunTyped = data as Uint8Array & { toHex?: () => string }\n if (typeof bunTyped.toHex === 'function') {\n return bunTyped.toHex()\n }\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(data).toString('hex')\n }\n return Array.from(data)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n }\n\n /**\n * 將十六進制字串解碼為 Uint8Array\n * @param hex - 十六進制字串\n * @returns Uint8Array\n * @throws {TypeError} 如果輸入不是有效的十六進制字串\n * @public\n */\n static fromHex(hex: string): Uint8Array {\n if (!hex || hex.length === 0) {\n return new Uint8Array(0)\n }\n if (hex.length % 2 !== 0) {\n throw new TypeError(\n `[BinaryUtils] fromHex: 十六進制字串長度必須為偶數,收到長度 ${hex.length}`\n )\n }\n if (!/^[0-9a-fA-F]+$/.test(hex)) {\n throw new TypeError('[BinaryUtils] fromHex: 輸入包含無效的十六進制字元')\n }\n const BunUint8Array = Uint8Array as typeof Uint8Array & {\n fromHex?: (s: string) => Uint8Array\n }\n if (typeof BunUint8Array.fromHex === 'function') {\n return BunUint8Array.fromHex(hex)\n }\n if (typeof Buffer !== 'undefined') {\n const buf = Buffer.from(hex, 'hex')\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength)\n }\n const bytes = new Uint8Array(hex.length / 2)\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(hex.substring(i * 2, i * 2 + 2), 16)\n }\n return bytes\n }\n\n /**\n * 使用 gzip 壓縮資料\n * 在 Bun 環境中使用原生 Bun.gzipSync(),在 Node.js 中使用 zlib\n * @param data - 輸入資料\n * @param level - 壓縮等級(0-9),預設為 6\n * @returns 壓縮後的 Uint8Array\n * @public\n */\n static async gzip(data: Uint8Array, level = 6): Promise<Uint8Array> {\n if (data.length === 0) {\n return data\n }\n if (isBunRuntime()) {\n const bunGlobal = (globalThis as Record<string, unknown>).Bun as {\n gzipSync?: (data: Uint8Array, opts?: { level?: number }) => Uint8Array\n }\n if (typeof bunGlobal?.gzipSync === 'function') {\n return bunGlobal.gzipSync(data, { level })\n }\n }\n const { gzipSync } = await import('node:zlib')\n const result = gzipSync(data, { level })\n return new Uint8Array(result.buffer, result.byteOffset, result.byteLength)\n }\n\n /**\n * 解壓縮 gzip 資料\n * 在 Bun 環境中使用原生 Bun.gunzipSync(),在 Node.js 中使用 zlib\n * @param data - gzip 壓縮的 Uint8Array\n * @returns 解壓縮後的 Uint8Array\n * @public\n */\n static async gunzip(data: Uint8Array): Promise<Uint8Array> {\n if (data.length === 0) {\n return data\n }\n if (isBunRuntime()) {\n const bunGlobal = (globalThis as Record<string, unknown>).Bun as {\n gunzipSync?: (data: Uint8Array) => Uint8Array\n }\n if (typeof bunGlobal?.gunzipSync === 'function') {\n return bunGlobal.gunzipSync(data)\n }\n }\n const { gunzipSync } = await import('node:zlib')\n const result = gunzipSync(data)\n return new Uint8Array(result.buffer, result.byteOffset, result.byteLength)\n }\n\n /**\n * 將 ReadableStream<Uint8Array> 讀取為 Uint8Array\n * 在 Bun 環境中使用原生 Bun.readableStreamToBytes(),否則手動讀取 chunks\n * @param stream - 輸入的 ReadableStream\n * @returns Uint8Array\n * @public\n */\n static async readableStreamToBytes(stream: ReadableStream<Uint8Array>): Promise<Uint8Array> {\n if (isBunRuntime()) {\n const bunGlobal = (globalThis as Record<string, unknown>).Bun as {\n readableStreamToBytes?: (\n stream: ReadableStream<Uint8Array>\n ) => Promise<Uint8Array | ArrayBuffer>\n }\n if (typeof bunGlobal?.readableStreamToBytes === 'function') {\n const result = await bunGlobal.readableStreamToBytes(stream)\n // 如果返回 ArrayBuffer,轉換為 Uint8Array\n if (result instanceof ArrayBuffer) {\n return new Uint8Array(result)\n }\n return result as Uint8Array\n }\n }\n const chunks: Uint8Array[] = []\n let totalLength = 0\n const reader = stream.getReader()\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) {\n break\n }\n if (value) {\n chunks.push(value)\n totalLength += value.length\n }\n }\n } finally {\n reader.releaseLock()\n }\n const result = new Uint8Array(totalLength)\n let offset = 0\n for (const chunk of chunks) {\n result.set(chunk, offset)\n offset += chunk.length\n }\n return result\n }\n\n /**\n * 將 ReadableStream<Uint8Array> 讀取為 ArrayBuffer\n * @param stream - 輸入的 ReadableStream\n * @returns ArrayBuffer\n * @public\n */\n static async readableStreamToArrayBuffer(\n stream: ReadableStream<Uint8Array>\n ): Promise<ArrayBuffer> {\n const bytes = await BinaryUtils.readableStreamToBytes(stream)\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer\n }\n}\n",
163
- "/// <reference types=\"bun-types\" />\n/**\n * @gravito/core\n *\n * The core micro-kernel for the Galaxy Architecture.\n *\n * @packageDocumentation\n */\n\n// Export version from package.json\nimport packageJson from '../package.json'\nimport type { GravitoConfig } from './PlanetCore'\n\n/**\n * Current version of @gravito/core.\n * @public\n */\nexport const VERSION = packageJson.version\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Gravito HTTP Abstractions (v2.0 - Adapter Pattern)\n// These types enable swapping out the underlying HTTP engine.\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport { GravitoEngineAdapter } from './adapters/GravitoEngineAdapter'\n\n// Adapters\nexport type { AdapterConfig, AdapterFactory, HttpAdapter, RouteDefinition } from './adapters/types'\nexport { isHttpAdapter } from './adapters/types'\n// HTTP Types\nexport type {\n ContentfulStatusCode,\n GravitoContext,\n GravitoErrorHandler,\n GravitoHandler,\n GravitoMiddleware,\n GravitoNext,\n GravitoNotFoundHandler,\n GravitoRequest,\n GravitoVariables,\n HttpMethod,\n ProxyOptions,\n StatusCode,\n ValidationTarget,\n} from './http/types'\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Core Exports\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Application (Enterprise Container)\nexport { Application, type ApplicationConfig } from './Application'\nexport { type CommandHandler, CommandKernel } from './CommandKernel'\nexport { ConfigManager } from './ConfigManager'\nexport { Container, type Factory, type ServiceKey, type ServiceMap } from './Container'\nexport { RequestScopeManager } from './Container/RequestScopeManager'\nexport {\n RequestScopeMetrics,\n RequestScopeMetricsCollector,\n type RequestScopeObserver,\n} from './Container/RequestScopeMetrics'\nexport { registerQueueCommands } from './cli/queue-commands'\n// Error Handler (extracted from PlanetCore for SRP)\nexport {\n codeFromStatus,\n ErrorHandler,\n type ErrorHandlerDeps,\n messageFromStatus,\n} from './ErrorHandler'\n// Events\nexport { EventManager } from './EventManager'\n// RequestScope-Aware Error Handling\nexport {\n cleanupRequestScopeOnError,\n detectRequestScopeLeaks,\n extractRequestScopeErrorContext,\n RequestScopeCleanupError,\n type RequestScopeErrorContext,\n withRequestScopeCleanup,\n} from './error-handling/RequestScopeErrorContext'\n// Event System\nexport type {\n BackpressureConfig,\n BackpressureDecision,\n BackpressureMetricsSnapshot,\n BackpressureStrategy,\n CircuitBreakerMetrics,\n CircuitBreakerMetricsRecorder,\n CircuitBreakerOptions,\n DeadLetterDecision,\n DLQEntry,\n DLQEntryCallback,\n DLQEntrySource,\n DLQFilter,\n EventBackend,\n EventOptions,\n EventQueueConfig,\n EventTask,\n FlowControlContext,\n FlowControlStrategy,\n MultiPriorityQueueDepth,\n PriorityStatistics,\n RetrySchedulerConfig,\n WindowAdjustment,\n WorkerPoolConfig,\n WorkerPoolStats,\n WorkerStats,\n} from './events'\nexport {\n BackpressureManager,\n BackpressureState,\n CircuitBreaker,\n CircuitBreakerState,\n CompositeStrategy,\n DEFAULT_EVENT_OPTIONS,\n DeadLetterQueue,\n EventPriorityQueue,\n IdempotencyCache,\n PriorityEscalationManager,\n PriorityRebalanceStrategy,\n QueueDepthStrategy,\n RateLimitStrategy,\n RetryScheduler,\n StarvationProtectionStrategy,\n WorkerPool,\n WorkerPoolMetrics,\n} from './events'\n// Event System Observability\nexport type {\n EventTracingConfig,\n ObservabilityConfig,\n QueueDepthCallback,\n} from './events/observability'\nexport {\n EventMetrics,\n EventTracer,\n EventTracing,\n getEventTracing,\n ObservableHookManager,\n OTelEventMetrics,\n} from './events/observability'\n// ─────────────────────────────────────────────────────────────────────────────\n// Observability Contracts (Phase 2.2)\n// ─────────────────────────────────────────────────────────────────────────────\n// Abstract interfaces for observability providers\n// Concrete implementations provided by @gravito/monitor\nexport type {\n EventMetricsRecorder,\n EventTracingProvider,\n ObservabilityProvider,\n TracingSpan,\n WorkerMetricsProvider,\n} from './observability/contracts'\nexport { createNoOpObservabilityProvider } from './observability/contracts'\n// Queue Dashboard & CLI\nexport {\n type DashboardSnapshot,\n type ErrorStats,\n type JobEvent,\n QueueDashboard,\n type QueueDashboardConfig,\n type QueueMetrics,\n type WorkerMetrics as QueueWorkerMetrics,\n} from './observability/QueueDashboard'\n\n// ─────────────────────────────────────────────────────────────────────────────\n// OpenTelemetry Instrumentation\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Exceptions\nexport * from './exceptions'\n// Global Error Handlers\nexport {\n type GlobalErrorHandlersMode,\n type GlobalProcessErrorHandlerContext,\n type GlobalProcessErrorKind,\n type RegisterGlobalErrorHandlersOptions,\n registerGlobalErrorHandlers,\n} from './GlobalErrorHandlers'\nexport { type GravitoManifest, GravitoServer } from './GravitoServer'\n// Hooks\nexport type { ActionCallback, FilterCallback, ListenerInfo, ListenerOptions } from './HookManager'\nexport { HookManager, type HookManagerConfig } from './HookManager'\n// Health\nexport type { HealthCheck, HealthCheckResult } from './health/HealthProvider'\nexport { HealthProvider } from './health/HealthProvider'\nexport type { DumpOptions } from './helpers'\n// Helpers\nexport {\n Arr,\n abort,\n abortIf,\n abortUnless,\n app,\n blank,\n config,\n DumpDieError,\n dd,\n dump,\n env,\n filled,\n hasApp,\n logger,\n router,\n Str,\n setApp,\n tap,\n throwIf,\n throwUnless,\n value,\n} from './helpers'\nexport * from './helpers/data'\nexport * from './helpers/errors'\nexport * from './helpers/response'\n// HTTP / Security utilities\nexport { CookieJar, type CookieOptions } from './http/CookieJar'\nexport { deleteCookie, getCookie, setCookie } from './http/cookie'\n// HTTP Middleware moved to @gravito/photon/middleware (Phase 2.1)\n// - bodySizeLimit → @gravito/photon/middleware/body\n// - cors → @gravito/photon/middleware/cors\n// - csrfProtection, getCsrfToken → @gravito/photon/middleware/security\n// - createHeaderGate, requireHeaderToken → @gravito/photon/middleware/security\n// - securityHeaders → @gravito/photon/middleware/security\n// - throttleRequests (was ThrottleRequests) → @gravito/photon/middleware/rate-limit\n// OpenTelemetry exports moved to @gravito/monitor (Phase 2.2)\n// Import from @gravito/monitor for OTel functionality\n// Listeners\nexport type { Listener, ShouldQueue } from './Listener'\n// Logger\nexport type { Logger } from './Logger'\nexport { ConsoleLogger } from './Logger'\n// PlanetCore (Main Application Class)\nexport {\n type CacheService,\n type ErrorHandlerContext,\n type GravitoConfig,\n type GravitoOrbit,\n PlanetCore,\n type ViewService,\n} from './PlanetCore'\n// Request Context\nexport {\n RequestContext,\n type RequestContextData,\n} from './RequestContext'\n// Routing\nexport { Route } from './Route'\nexport {\n type ControllerClass,\n FORM_REQUEST_SYMBOL,\n type FormRequestClass,\n type FormRequestLike,\n RouteGroup,\n type RouteHandler,\n type RouteOptions,\n Router,\n} from './Router'\n// Reliability\nexport type { DLQManagerFilter, DLQRecord, DLQStats, RetryPolicy } from './reliability'\nexport {\n DeadLetterQueueManager,\n getDefaultRetryPolicy,\n getPresetRetryPolicy,\n RetryEngine,\n} from './reliability'\n// Service Provider\nexport { ServiceProvider } from './ServiceProvider'\n// Security\nexport { Encrypter, type EncrypterOptions } from './security/Encrypter'\n// Event Types\nexport type { Channel, ShouldBroadcast } from './types/events'\nexport { Event } from './types/events'\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Testing Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport * from './testing'\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Runtime Adapters\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport {\n type ArchiveCreateOptions,\n type ArchiveEntry,\n type ArchiveExtractOptions,\n type ArchiveFileInfo,\n type ArchiveFromDirectoryOptions,\n archiveFromDirectory,\n type CompressionOptions,\n createHtmlRenderCallbacks,\n createSqliteDatabase,\n type EscapeHtmlFn,\n getArchiveAdapter,\n getCompressionAdapter,\n getEscapeHtml,\n getMarkdownAdapter,\n getPasswordAdapter,\n getRuntimeAdapter,\n getRuntimeEnv,\n getRuntimeKind,\n type MarkdownRenderCallbacks,\n type MarkdownRenderOptions,\n type RuntimeAdapter,\n type RuntimeArchiveAdapter,\n type RuntimeCompressionAdapter,\n type RuntimeFileSink,\n type RuntimeFileStat,\n type RuntimeKind,\n type RuntimeMarkdownAdapter,\n type RuntimePasswordAdapter,\n type RuntimeProcess,\n type RuntimeProcessOutput,\n type RuntimeResourceUsage,\n type RuntimeServeConfig,\n type RuntimeServer,\n type RuntimeSpawnOptions,\n type RuntimeSpawnSyncResult,\n type RuntimeSqliteDatabase,\n type RuntimeSqliteStatement,\n toUint8Array,\n} from './runtime'\nexport {\n getDefaultRuntimeAdapter,\n runtimeAppendFile,\n runtimeCreateFileSink,\n runtimeMkdir,\n runtimeReadDir,\n runtimeReadJSON,\n runtimeReadText,\n runtimeRemoveRecursive,\n runtimeRename,\n runtimeStatFull,\n runtimeWriteFileExclusive,\n} from './runtime-helpers'\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Deep Equals & Binary Utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport { BinaryUtils } from './binary'\nexport type { DeepEqualsFn, DeepEqualsOptions } from './runtime/deep-equals'\nexport { getDeepEquals } from './runtime/deep-equals'\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Standalone Engine (High-Performance Bun-Only Engine)\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Re-export engine module for @gravito/core/engine import path\nexport * as engine from './engine'\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FFI (Foreign Function Interface) - Native Acceleration Layer\n// Re-export via @gravito/core/ffi to avoid compile-time FFI initialization\n// ─────────────────────────────────────────────────────────────────────────────\n// Note: Import via `import { NativeAccelerator } from '@gravito/core/ffi'`\n// Do NOT import directly from main entry to avoid compile-time FFI loading\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Configuration Helper\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Configure your Gravito application\n *\n * @example\n * ```typescript\n * const config = defineConfig({\n * config: {\n * APP_NAME: 'My App',\n * PORT: 3000,\n * },\n * orbits: [], // Add your orbits here\n * })\n *\n * const core = await PlanetCore.boot(config)\n * ```\n */\nexport function defineConfig(config: GravitoConfig): GravitoConfig {\n return config\n}\n"
164
- ],
165
- "mappings": "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",
166
- "debugId": "2D8AB22E246F40CD64756E2164756E21",
167
- "names": []
168
- }