arkos 2.0.0-next.18 → 2.0.0-next.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli.js +8 -1
- package/dist/esm/app.js +1 -1
- package/dist/esm/app.js.map +1 -1
- package/dist/esm/components/arkos-gateway/arkos-gateway.js +5 -4
- package/dist/esm/components/arkos-gateway/arkos-gateway.js.map +1 -1
- package/dist/esm/components/arkos-gateway/socket-extensions.js +7 -0
- package/dist/esm/components/arkos-gateway/socket-extensions.js.map +1 -1
- package/dist/esm/components/arkos-gateway/utils/memory-gateway-store.js +2 -4
- package/dist/esm/components/arkos-gateway/utils/memory-gateway-store.js.map +1 -1
- package/dist/esm/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.js +1 -0
- package/dist/esm/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.js.map +1 -1
- package/dist/esm/components/arkos-loadable-registry/index.js +1 -3
- package/dist/esm/components/arkos-loadable-registry/index.js.map +1 -1
- package/dist/esm/components/arkos-route-hook/reader.js.map +1 -1
- package/dist/esm/components/arkos-route-hook/types.js.map +1 -1
- package/dist/esm/exports/index.js +1 -1
- package/dist/esm/exports/index.js.map +1 -1
- package/dist/esm/exports/middlewares/index.js +1 -1
- package/dist/esm/exports/middlewares/index.js.map +1 -1
- package/dist/esm/modules/auth/auth.controller.js +213 -221
- package/dist/esm/modules/auth/auth.controller.js.map +1 -1
- package/dist/esm/modules/auth/auth.service.js +11 -58
- package/dist/esm/modules/auth/auth.service.js.map +1 -1
- package/dist/esm/modules/auth/utils/auth-prisma-json-schema-generator.js +1 -0
- package/dist/esm/modules/auth/utils/auth-prisma-json-schema-generator.js.map +1 -1
- package/dist/esm/modules/auth/utils/services/auth-action.service.js +10 -12
- package/dist/esm/modules/auth/utils/services/auth-action.service.js.map +1 -1
- package/dist/esm/modules/base/base.controller.js +179 -177
- package/dist/esm/modules/base/base.controller.js.map +1 -1
- package/dist/esm/modules/base/base.middlewares.js +6 -21
- package/dist/esm/modules/base/base.middlewares.js.map +1 -1
- package/dist/esm/modules/base/base.service.js +28 -25
- package/dist/esm/modules/base/base.service.js.map +1 -1
- package/dist/esm/modules/base/utils/error-prettifier.js +26 -30
- package/dist/esm/modules/base/utils/error-prettifier.js.map +1 -1
- package/dist/esm/modules/email/email.service.js +2 -2
- package/dist/esm/modules/email/email.service.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/app-error.js +5 -1
- package/dist/esm/modules/error-handler/utils/app-error.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.controller.js +203 -205
- package/dist/esm/modules/file-upload/file-upload.controller.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.router.js +3 -3
- package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.service.js +12 -7
- package/dist/esm/modules/file-upload/file-upload.service.js.map +1 -1
- package/dist/esm/modules/file-upload/utils/file-upload-json-schema-generator.js +1 -1
- package/dist/esm/modules/file-upload/utils/file-upload-json-schema-generator.js.map +1 -1
- package/dist/esm/modules/swagger/swagger.router.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js +1 -0
- package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/types/new-arkos-config.js.map +1 -1
- package/dist/esm/types/router-config.js.map +1 -1
- package/dist/esm/types/validation/validation-manager.js +21 -22
- package/dist/esm/types/validation/validation-manager.js.map +1 -1
- package/dist/esm/utils/arkos-router/index.js +1 -6
- package/dist/esm/utils/arkos-router/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/route-config-registry.js +2 -3
- package/dist/esm/utils/arkos-router/route-config-registry.js.map +1 -1
- package/dist/esm/utils/arkos-router/types/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/index.js +86 -43
- package/dist/esm/utils/arkos-router/utils/helpers/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js +12 -14
- package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js.map +1 -1
- package/dist/esm/utils/bundler.js +6 -6
- package/dist/esm/utils/bundler.js.map +1 -1
- package/dist/esm/utils/cli/dev.js +4 -17
- package/dist/esm/utils/cli/dev.js.map +1 -1
- package/dist/esm/utils/cli/prisma-generate.js +8 -37
- package/dist/esm/utils/cli/prisma-generate.js.map +1 -1
- package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/esm/utils/cli/utils/smart-fs-watcher.js +3 -0
- package/dist/esm/utils/cli/utils/smart-fs-watcher.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
- package/dist/esm/utils/dynamic-loader.js +2 -1
- package/dist/esm/utils/dynamic-loader.js.map +1 -1
- package/dist/esm/utils/features/api.features.js +24 -20
- package/dist/esm/utils/features/api.features.js.map +1 -1
- package/dist/esm/utils/features/port-and-host-allocator.js +4 -3
- package/dist/esm/utils/features/port-and-host-allocator.js.map +1 -1
- package/dist/esm/utils/helpers/arkos-config.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/query-parser.helpers.js +7 -22
- package/dist/esm/utils/helpers/query-parser.helpers.js.map +1 -1
- package/dist/esm/utils/initialize-app.js +1 -1
- package/dist/esm/utils/initialize-app.js.map +1 -1
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js +1 -3
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/esm/utils/prisma/prisma-schema-parser.js +14 -8
- package/dist/esm/utils/prisma/prisma-schema-parser.js.map +1 -1
- package/dist/esm/utils/validate-schema.js +23 -21
- package/dist/esm/utils/validate-schema.js.map +1 -1
- package/dist/types/app.d.ts +1 -1
- package/dist/types/components/arkos-route-hook/reader.d.ts +2 -5
- package/dist/types/components/arkos-route-hook/types.d.ts +4 -4
- package/dist/types/exports/index.d.ts +3 -4
- package/dist/types/exports/middlewares/index.d.ts +1 -1
- package/dist/types/modules/auth/auth.service.d.ts +1 -40
- package/dist/types/modules/base/base.middlewares.d.ts +1 -10
- package/dist/types/modules/swagger/swagger.router.d.ts +1 -2
- package/dist/types/types/index.d.ts +3 -3
- package/dist/types/types/new-arkos-config.d.ts +0 -14
- package/dist/types/types/router-config.d.ts +0 -111
- package/dist/types/utils/arkos-router/types/index.d.ts +3 -3
- package/dist/types/utils/arkos-router/utils/helpers/index.d.ts +2 -6
- package/dist/types/utils/dynamic-loader.d.ts +2 -2
- package/dist/types/utils/helpers/query-parser.helpers.d.ts +1 -1
- package/dist/types/utils/prisma/prisma-schema-parser.d.ts +1 -0
- package/package.json +41 -41
- package/dist/esm/components/arkos-loadable-translator/index.js +0 -138
- package/dist/esm/components/arkos-loadable-translator/index.js.map +0 -1
- package/dist/types/components/arkos-loadable-translator/index.d.ts +0 -53
package/cli.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
(async () => {
|
|
3
|
-
const { join } = await import("path");
|
|
3
|
+
const { join, dirname } = await import("path");
|
|
4
4
|
const { existsSync, readFileSync } = await import("fs");
|
|
5
5
|
const { spawn } = await import("child_process");
|
|
6
|
+
const { fileURLToPath } = await import("node:url");
|
|
7
|
+
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = dirname(__filename);
|
|
10
|
+
|
|
6
11
|
const pkgPath = join(process.cwd(), "package.json");
|
|
7
12
|
let useEsm = false;
|
|
8
13
|
if (existsSync(pkgPath)) {
|
|
@@ -31,3 +36,5 @@
|
|
|
31
36
|
});
|
|
32
37
|
child.on("exit", (code) => process.exit(code ?? 0));
|
|
33
38
|
})();
|
|
39
|
+
|
|
40
|
+
|
package/dist/esm/app.js
CHANGED
|
@@ -13,7 +13,7 @@ let appServer;
|
|
|
13
13
|
export const docsLink = "https://www.arkosjs.com/docs/core-concepts/routing/setup#setting-up-your-app";
|
|
14
14
|
let instanciated = false;
|
|
15
15
|
export let state = "idle";
|
|
16
|
-
export function arkos() {
|
|
16
|
+
export default function arkos() {
|
|
17
17
|
if (process.env.__ARKOS_CLI !== "true")
|
|
18
18
|
throw ExitError(`Arkos.js application must be started the built-in cli ${isProduction() ? "'arkos start' in production" : `'arkos dev' in development`} see https://www.arkosjs.com/docs/getting-started/installation#7-set-up-packagejson-scripts`);
|
|
19
19
|
if (instanciated)
|
package/dist/esm/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,sCAAsC,CAAC;AAC9C,OAAO,OAAoB,MAAM,SAAS,CAAC;AAC3C,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AAEzC,OAAO,aAAa,EAAE,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,mBAAmB,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAmB,MAAM,EAAkB,MAAM,MAAM,CAAC;AAC/D,OAAO,SAAS,MAAM,4BAA4B,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6DAA6D,CAAC;AACpG,OAAO,EACL,YAAY,EACZ,mBAAmB,GACpB,MAAM,sCAAsC,CAAC;AAC9C,MAAM,CAAC,MAAM,GAAG,GAAoB,OAAO,EAAE,CAAC;AAE9C,IAAI,SAAgE,CAAC;AACrE,MAAM,CAAC,MAAM,QAAQ,GACnB,8EAA8E,CAAC;AACjF,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB,MAAM,CAAC,IAAI,KAAK,GAAa,MAAM,CAAC;AAwCpC,MAAM,UAAU,KAAK;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/app.ts"],"names":[],"mappings":"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","sourcesContent":["import \"./utils/helpers/arkos-config.helpers\";\nimport express, { Express } from \"express\";\nimport setupApp from \"./utils/setup-app\";\nimport { Arkos } from \"./types/arkos\";\nimport initializeApp, { addGlobalErrorHandler } from \"./utils/initialize-app\";\nimport { logAppStartup } from \"./server\";\nimport runtimeCliCommander from \"./utils/cli/utils/runtime-cli-commander\";\nimport { IncomingMessage, Server, ServerResponse } from \"http\";\nimport ExitError from \"./utils/helpers/exit-error\";\nimport { applyArkosRouterProxy } from \"./utils/arkos-router/utils/helpers/apply-arkos-router-proxy\";\nimport {\n isProduction,\n validateArkosConfig,\n} from \"./utils/helpers/arkos-config.helpers\";\nexport const app: express.Express = express();\n\nlet appServer: Server<typeof IncomingMessage, typeof ServerResponse>;\nexport const docsLink =\n \"https://www.arkosjs.com/docs/core-concepts/routing/setup#setting-up-your-app\";\nlet instanciated = false;\ntype AppState = \"idle\" | \"building\" | \"built\" | \"listening\";\nexport let state: AppState = \"idle\";\n\n/**\n * Creates and configures an Arkos application instance.\n *\n * Arkos extends Express with a small set of methods for registering routers,\n * loading route/service hooks, and booting the application. All Arkos-specific\n * setup (`app.build()`) must happen before the app starts\n * accepting requests.\n *\n * @example\n * ```ts\n * // Simple setup\n * import arkos from \"arkos\";\n *\n * const app = arkos();\n *\n * app.use(reportsRouter);\n *\n * app.listen();\n * ```\n *\n * @example\n * ```ts\n * // Custom HTTP server (e.g. for WebSockets)\n * import arkos from \"arkos\";\n * import http from \"http\";\n *\n * const app = arkos();\n *\n * app.use(reportsRouter);\n *\n * await app.build();\n *\n * const server = http.createServer(app);\n * app.listen(server)\n * ```\n *\n * @see {@link https://www.arkosjs.com/docs/core-concepts/routing/setup}\n */\nexport default function arkos(): Arkos {\n if (process.env.__ARKOS_CLI !== \"true\")\n throw ExitError(\n `Arkos.js application must be started the built-in cli ${isProduction() ? \"'arkos start' in production\" : `'arkos dev' in development`} see https://www.arkosjs.com/docs/getting-started/installation#7-set-up-packagejson-scripts`\n );\n\n if (instanciated)\n throw ExitError(`arkos() must be called only once, see ${docsLink}`);\n\n const app = applyArkosRouterProxy(express(), {}, \"app\") as any as Arkos;\n setupApp(app);\n instanciated = true;\n\n\n\n function loadApp() {\n let _app = initializeApp(app);\n _app = addGlobalErrorHandler(_app);\n if (process.env.CLI_COMMAND) runtimeCliCommander.handle();\n return _app;\n }\n\n app.build = function() {\n if (state === \"built\" || state === \"building\")\n throw ExitError(`app.build() must only be called once, see ${docsLink}`);\n if (state === \"listening\")\n throw ExitError(\n `app.build() must be called before app.listen(), see ${docsLink}`\n );\n\n state = \"building\";\n const _app = loadApp();\n state = \"built\";\n return _app;\n };\n\n const originalListen = app.listen.bind(app) as any as Express[\"listen\"];\n type UserCallback = (err?: Error) => void;\n\n const defaultCb = (\n port: number | string,\n host: string,\n cb?: UserCallback\n ) => {\n logAppStartup(port, host);\n return cb || function() { };\n };\n\n app.listen = async function(...args: any[]): Promise<Server> {\n process.env.__ARKOS_SERVER_LISTENER = \"arkos\";\n\n if (state === \"listening\")\n throw ExitError(`app.listen() must only be called once, see ${docsLink}`);\n if (state === \"building\")\n throw ExitError(\n `app.build() must be awaited before calling app.listen(), see ${docsLink}`\n );\n\n if (state === \"idle\") {\n state = \"listening\";\n loadApp();\n }\n\n validateArkosConfig();\n\n const port = Number(process.env.__PORT || process.env.PORT || \"8000\");\n const host = process.env.__HOST! || process.env.HOST || \"0.0.0.0\";\n\n process.send?.({ started: true });\n if (process.env.__SKIP_LISTEN == \"true\") return appServer;\n\n if ((args as any)?.length === 0 || typeof args[0] === \"function\")\n appServer = originalListen(\n port,\n host,\n defaultCb(port, host, args[0] as UserCallback)\n );\n else if (args[0] instanceof Server || typeof args[0] === \"object\")\n appServer = args[0].listen(\n port,\n host,\n defaultCb(port, host, args[1] as UserCallback)\n );\n\n return appServer;\n };\n\n return app;\n}\n\nexport function getAppServer() {\n return appServer;\n}\n"]}
|
|
@@ -14,11 +14,12 @@ import ExitError from "../../utils/helpers/exit-error.js";
|
|
|
14
14
|
import { getUserFileExtension } from "../../utils/helpers/fs.helpers.js";
|
|
15
15
|
import { BadRequestError, TooManyRequestsError, } from "../../modules/error-handler/utils/errors.js";
|
|
16
16
|
export class IArkosGateway {
|
|
17
|
+
config;
|
|
18
|
+
events = [];
|
|
19
|
+
pipes = [];
|
|
20
|
+
gateways = [];
|
|
21
|
+
hooks = [];
|
|
17
22
|
constructor(config) {
|
|
18
|
-
this.events = [];
|
|
19
|
-
this.pipes = [];
|
|
20
|
-
this.gateways = [];
|
|
21
|
-
this.hooks = [];
|
|
22
23
|
this.config = config;
|
|
23
24
|
this.config.name = config.name ?? "web-socket";
|
|
24
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arkos-gateway.js","sourceRoot":"","sources":["../../../../src/components/arkos-gateway/arkos-gateway.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ArkosGatewayConfig,\n ArkosGatewayErrorHandler,\n ArkosGatewayEventConfig,\n ArkosGatewayEventEntry,\n ArkosGatewayHandler,\n ArkosGatewayHookHandler,\n ArkosGatewayHookType,\n ArkosGatewayPipe,\n ArkosGatewayConnectionHandler,\n ArkosSocket,\n ArkosGatewayRegisterOptions,\n} from \"./types\";\nimport { Validator } from \"../../types/validation/validator\";\nimport { Server } from \"socket.io\";\nimport { authActionService, authService } from \"../../exports/services\";\nimport { checkRateLimit, clearRateLimitForSocket } from \"./utils/rate-limiter\";\nimport {\n handleArkosGatewayErrors,\n runArkosGatewayPipes,\n handleGatewayEventLog,\n handleGatewayLifecycleLog,\n} from \"./utils/helpers\";\nimport authHookManager from \"../../modules/auth/utils/auth-hooks-manager\";\nimport { getArkosConfig } from \"../../server\";\nimport validationManager from \"../../types/validation/validation-manager\";\nimport { loginRequiredError } from \"../../modules/auth/utils/auth-error-objects\";\nimport errorPrettifier from \"../../modules/base/utils/error-prettifier\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { defaultGatewayStore } from \"./utils/memory-gateway-store\";\nimport { mountArkosSocketExtensions } from \"./socket-extensions\";\nimport {\n isAuthenticationEnabled,\n isUsingAuthentication,\n} from \"../../utils/helpers/arkos-config.helpers\";\nimport ExitError from \"../../utils/helpers/exit-error\";\nimport { getUserFileExtension } from \"../../utils/helpers/fs.helpers\";\nimport {\n BadRequestError,\n TooManyRequestsError,\n} from \"../../modules/error-handler/utils/errors\";\n\nexport class IArkosGateway {\n private config: ArkosGatewayConfig;\n private events: ArkosGatewayEventEntry[] = [];\n private pipes: ArkosGatewayPipe[] = [];\n private gateways: IArkosGateway[] = [];\n private hooks: {\n type: ArkosGatewayHookType;\n handler: ArkosGatewayHookHandler;\n }[] = [];\n\n constructor(config: ArkosGatewayConfig) {\n this.config = config;\n this.config.name = config.name ?? \"web-socket\";\n }\n\n /**\n * Register a Socket.io connection-level middleware — runs before a socket\n * is accepted into this gateway's namespace. Also accepts a child\n * `ArkosGateway` which will inherit this gateway's name as prefix along\n * with its auth, rateLimit, and pipes.\n *\n * @example\n * chatGateway.use((socket, next) => {\n * console.log(\"incoming connection\", socket.id)\n * })\n *\n * // nested gateway\n * chatGateway.use(notificationsGateway)\n */\n use(...middlewareOrGateway: Array<ArkosGatewayPipe | IArkosGateway>): this {\n for (const item of middlewareOrGateway) {\n if (item instanceof IArkosGateway) {\n this.gateways.push(item);\n } else if (typeof item === \"function\") {\n this.pipes.push(item as ArkosGatewayPipe);\n } else {\n throw new Error(\n `Invalid value for gateway.use() — expected an ArkosGateway instance or a middleware function but received \"${typeof item}\".`\n );\n }\n }\n return this;\n }\n\n /**\n * Register a pipe — middleware that runs before event handlers.\n *\n * When called with a function only, the pipe runs before every event\n * handler in this gateway and drills down to child gateways.\n *\n * When called with an event config object, the pipe runs only for that\n * specific event.\n *\n * @example\n * // runs before every event in this gateway\n * chatGateway.pipe((socket, data) => {\n * })\n *\n * // runs only before \"send_message\"\n * chatGateway.pipe({ event: \"send_message\" }, (socket, data) => {\n * })\n */\n pipe(fn: ArkosGatewayPipe): this;\n pipe<TSchema extends Validator = any>(\n eventConfig: { event: string },\n fn: ArkosGatewayPipe\n ): this;\n pipe<TSchema extends Validator = any>(\n fnOrConfig: ArkosGatewayPipe | ArkosGatewayEventConfig<TSchema>,\n fn?: ArkosGatewayPipe\n ): this {\n if (typeof fnOrConfig === \"function\") {\n this.pipes.push(fnOrConfig);\n } else if (fnOrConfig && typeof fnOrConfig === \"object\" && fn) {\n const entry = this.events.find(\n (e) => e.config.event === fnOrConfig.event\n );\n if (entry) {\n entry.pipes = entry.pipes ?? [];\n entry.pipes.push(fn);\n } else {\n this.events.push({\n config: { event: fnOrConfig.event, _pipeOnly: true } as any,\n handler: null as any,\n pipes: [fn],\n });\n }\n } else {\n throw new Error(\n `Invalid arguments for gateway.pipe() — pass a middleware function, or an event config object followed by a middleware function.`\n );\n }\n return this;\n }\n\n /**\n * Register an event handler.\n *\n * @example\n * chatGateway.on(\n * { event: \"send_message\", validation: MessageSchema, ack: true },\n * (socket, data, ack) => {\n * socket.to(data.room).emit(\"receive_message\", data)\n * ack?.({ status: \"ok\" })\n * }\n * )\n */\n on<TSchema extends Validator = any>(\n eventConfig: ArkosGatewayEventConfig<TSchema>,\n handler: ArkosGatewayHandler\n ): this {\n if (eventConfig.disabled) return this;\n\n if (eventConfig.authorization && this.config.authentication === false) {\n throw new Error(\n `Event \"${eventConfig.event}\" on \"${this.config.name}\" gateway defines authorization rules ` +\n `but the gateway has authentication: false. Enable authentication on the gateway to use per-event authentication.`\n );\n }\n\n const deferred = this.events.find(\n (e) => (e.config as any)._pipeOnly && e.config.event === eventConfig.event\n );\n\n const entry: ArkosGatewayEventEntry = {\n config: eventConfig,\n handler,\n pipes: [...this.pipes, ...(deferred?.pipes ?? [])],\n };\n\n if (deferred) {\n const idx = this.events.indexOf(deferred);\n this.events.splice(idx, 1, entry);\n } else {\n this.events.push(entry);\n }\n\n if (typeof eventConfig?.authorization == \"object\")\n // To reuse later on\n (eventConfig.authorization as any)._authAction = authActionService.add(\n eventConfig.authorization!.action,\n eventConfig.authorization!.resource,\n {\n [eventConfig.authorization!.action]: eventConfig.authorization?.rule,\n }\n );\n\n return this;\n }\n\n /**\n * Register a lifecycle hook.\n *\n * - `\"connection\"` — called after a socket successfully connects and passes authentication.\n * - `\"disconnect\"` — called when a socket disconnects.\n * - `\"error\"` — called when an error is thrown inside any event handler.\n * If not registered, Arkos emits a default `\"error\"` event to the socket.\n *\n * @example\n * chatGateway.hook(\"connection\", (socket) => {\n * console.log(\"connected\", socket.user.id)\n * })\n *\n * chatGateway.hook(\"error\", (err, socket) => {\n * socket.emit(\"error\", { message: err.message })\n * })\n */\n hook(type: \"connection\", handler: ArkosGatewayConnectionHandler): this;\n hook(type: \"disconnect\", handler: ArkosGatewayConnectionHandler): this;\n hook(type: \"error\", handler: ArkosGatewayErrorHandler): this;\n hook(\n type: ArkosGatewayHookType,\n handler: ArkosGatewayConnectionHandler | ArkosGatewayErrorHandler\n ): this {\n this.hooks.push({ type, handler });\n return this;\n }\n\n /**\n * Wire this gateway into a Socket.io `Server` instance.\n * Registers the namespace, auth middleware, rate limiting, pipes,\n * and all event handlers — then recurses into child gateways.\n *\n * @example\n * const io = new Server(server)\n * chatGateway.register(io)\n */\n register(io: Server, options: ArkosGatewayRegisterOptions = {}): void {\n if ((io as any)._arkosGatewayRegistered)\n throw new Error(\n `The method gateway.register() can only be called once per io server instance. Use gateway.use() to compose gateways, see https://www.arkosjs.com/docs/components/advanced-guides/web-sockets/setup.`\n );\n (io as any)._arkosGatewayRegistered = true;\n this._register(io, undefined, this.hooks || [], this.pipes || [], options);\n }\n\n private _register(\n io: Server,\n parentConfig?: ArkosGatewayConfig,\n inheritedHooks: {\n type: ArkosGatewayHookType;\n handler: ArkosGatewayHookHandler;\n }[] = [],\n inheritedPipes: ArkosGatewayPipe[] = [],\n options: ArkosGatewayRegisterOptions = {}\n ): void {\n options.store = options.store ?? defaultGatewayStore;\n const { store } = options;\n\n const parentName = parentConfig?.name;\n const ownName = this.config.name;\n this.config = deepmerge(parentConfig || {}, this.config, {\n arrayMerge: (_, sourceArray) => sourceArray,\n });\n this.config.name = ownName;\n const localConfig = this.config;\n\n const namespaceName = parentName\n ? `${parentName.replace(/\\/$/, \"\")}/${ownName.replace(/^\\//, \"\")}`\n : (ownName ?? \"\");\n\n const ns = io.of(namespaceName);\n\n const resolvedAuth =\n this.config.authentication !== false &&\n parentConfig?.authentication !== false;\n\n const resolvedRateLimit = this.config.rateLimit ?? parentConfig?.rateLimit;\n const resolvedHooks = [...inheritedHooks, ...this.hooks];\n\n const connectHandlers = resolvedHooks\n .filter((h) => h.type === \"connection\")\n .map((h) => h.handler as ArkosGatewayConnectionHandler);\n\n const disconnectHandlers = resolvedHooks\n .filter((h) => h.type === \"disconnect\")\n .map((h) => h.handler as ArkosGatewayConnectionHandler);\n\n const errorHandlers = resolvedHooks\n .filter((h) => h.type === \"error\")\n .map((h) => h.handler as ArkosGatewayErrorHandler);\n\n if (resolvedAuth && isAuthenticationEnabled()) {\n ns.use(async (socket: any, next) => {\n socket = socket as ArkosSocket;\n const startTime = new Date().getTime();\n try {\n await authHookManager.runAuthenticate(\n {\n context: socket,\n done: (err?: any) => {\n if (err) throw err;\n next();\n },\n },\n async (socket) => {\n const user = await authService.getAuthenticatedUser(socket);\n if (!user) throw loginRequiredError;\n return user;\n },\n \"currentUser\"\n );\n } catch (err: any) {\n handleArkosGatewayErrors(err, socket, errorHandlers, {\n startTime,\n namespace: this.config.name,\n event: \"authentication\",\n });\n next(err);\n }\n });\n } else if (\n (this.config.authentication || parentConfig?.authentication) &&\n !isUsingAuthentication()\n )\n throw ExitError(\n `Trying to authenticate gateway ${this.config.name ? `${this.config.name}` : \"\"} without choosing an authentication mode under arkos.config.${getUserFileExtension()}.\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n ns.on(\"connection\", async (s) => {\n const socket = s as ArkosSocket;\n socket.locals = {};\n\n socket._arkos = { store, gatewayConfig: localConfig };\n mountArkosSocketExtensions(socket);\n\n handleGatewayLifecycleLog(this.config.name, \"connected\", socket.id);\n const connectionStartTime = new Date().getTime();\n\n if (socket.currentUser?.id)\n socket.join(`arkos::user:${socket.currentUser.id}`);\n\n try {\n for (const handler of connectHandlers) await handler(socket);\n } catch (err: any) {\n handleArkosGatewayErrors(err, socket, [], {\n startTime: connectionStartTime,\n namespace: this.config.name,\n event: \"connection\",\n });\n return;\n }\n\n socket.on(\"disconnect\", async () => {\n handleGatewayLifecycleLog(this.config.name, \"disconnected\", socket.id);\n\n await clearRateLimitForSocket(socket.id, store);\n try {\n for (const handler of disconnectHandlers) await handler(socket);\n } catch (err) {\n handleArkosGatewayErrors(err, socket, [], {\n startTime: connectionStartTime,\n namespace: this.config.name,\n event: \"disconnection\",\n });\n }\n });\n\n for (const entry of this.events) {\n if ((entry.config as any)._pipeOnly || !entry.handler) continue;\n\n const { config: eventConfig, handler, pipes: eventPipes = [] } = entry;\n\n if (\n (this.config.authentication || parentConfig?.authentication) &&\n !isUsingAuthentication()\n )\n throw ExitError(\n `Trying to use authorization gateway.on(\"${eventConfig.event}\") without choosing an authentication mode under arkos.config.${getUserFileExtension()}.\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n socket.on(eventConfig.event, async (...args: any[]) => {\n socket.locals = {};\n const startTime = new Date().getTime();\n let data = args[0];\n\n const ack =\n typeof args[args.length - 1] === \"function\"\n ? args[args.length - 1]\n : undefined;\n\n let ackCalled = false;\n const wrappedAck = ack\n ? (...response: any) => {\n ackCalled = true;\n ack(...response);\n }\n : undefined;\n\n function resolveDedup() {\n if (\n eventConfig.dedup === false ||\n localConfig.dedup === false ||\n parentConfig?.dedup === false\n )\n return null;\n\n return {\n enabled: true,\n ttl: 3600,\n ...parentConfig?.dedup,\n ...localConfig?.dedup,\n ...eventConfig?.dedup,\n };\n }\n\n const dedupOpt = resolveDedup();\n\n try {\n const meta = data?._meta || {};\n const resolvedMaxAge =\n eventConfig.maxAge ?? localConfig.maxAge ?? parentConfig?.maxAge;\n\n if (resolvedMaxAge && !meta.timestamp)\n throw new BadRequestError(\n \"Missing _meta.timestamp for maxAge deduplication\"\n );\n\n if (meta.timestamp !== undefined) {\n const timestamp = new Date(meta.timestamp);\n\n if (isNaN(timestamp.getTime())) {\n throw new BadRequestError(\n \"Invalid data._meta.timestamp\",\n \"InvalidTimestamp\"\n );\n }\n\n const age = Date.now() - timestamp.getTime();\n\n if (age + 1000 < 0)\n throw new BadRequestError(\n \"Timestamp is in the future\",\n \"FutureTimestamp\"\n );\n\n if (resolvedMaxAge && age > resolvedMaxAge) {\n throw new BadRequestError(\"Message is too old\", \"StaleMessage\");\n }\n }\n\n if (dedupOpt && dedupOpt?.enabled !== false) {\n if (!meta?.mid)\n throw new BadRequestError(\n \"Missing data._meta.mid in your payload for deduplication\",\n \"MissingDedupMessageId\",\n { data }\n );\n\n if (typeof meta.mid !== \"string\" || meta.mid.trim() === \"\")\n throw new BadRequestError(\n \"Invalid data._meta.mid, it must be a non-empty string\",\n \"InvalidMessageId\"\n );\n\n const key = `arkos::dedup:${eventConfig.event}:${meta.mid}`;\n const ttl = dedupOpt?.ttl ?? 3600;\n\n const acquired = await store.setIfNotExists(key, ttl);\n\n if (acquired === false)\n return wrappedAck?.({\n success: true,\n duplicate: true,\n });\n\n const { _meta, ...payload } = data;\n data = payload;\n\n socket.meta = meta;\n }\n\n const rateLimitOptions = eventConfig.rateLimit ?? resolvedRateLimit;\n if (rateLimitOptions !== false) {\n const { allowed, retryAfter } = await checkRateLimit(\n socket.id,\n eventConfig.event,\n rateLimitOptions || {},\n options.store!\n );\n if (!allowed) {\n throw new TooManyRequestsError(undefined, undefined, {\n retryAfter,\n });\n }\n }\n\n if (\n typeof eventConfig.authorization === \"object\" &&\n resolvedAuth &&\n isAuthenticationEnabled()\n ) {\n await authHookManager.runAuthorize(\n { context: socket, done: () => {} },\n (eventConfig?.authorization as any)?._authAction,\n \"currentUser\"\n );\n }\n\n if (eventConfig.validation) {\n const arkosConfig = getArkosConfig();\n const {\n validationFn,\n isValidValidator,\n validatorName,\n validatorNameType,\n } = validationManager;\n\n if (!isValidValidator(eventConfig.validation))\n throw new Error(\n `Your validation resolver is set to ${arkosConfig.validation!.resolver}, ` +\n `please provide a valid ${validatorName} in order to use { validation: ${validatorNameType} } ` +\n `under event handler \"${eventConfig.event}\" in \"${this.config.name}\" gateway.`\n );\n\n const shouldValidate = validationManager.shouldValidate(\n eventConfig.validation,\n data\n );\n\n if (shouldValidate === \"prohibit\")\n throw new BadRequestError(\n \"Event data is not allowed for this event.\",\n \"EventDataNotAllowed\",\n { data }\n );\n else if (shouldValidate === \"passthrough\") data = data;\n else {\n try {\n data = await (validationFn as any)(\n eventConfig.validation,\n data\n );\n } catch (err: any) {\n const { validationConfig } = validationManager;\n\n const resolver = validationConfig?.resolver;\n const isZod = validationConfig?.resolver === \"zod\";\n\n const prettifiedError = errorPrettifier.prettify(\n resolver as any,\n err\n );\n const error = prettifiedError[0];\n\n throw new BadRequestError(\n error.message,\n `InvalidData`,\n isZod ? err.format() : err\n );\n }\n }\n }\n\n socket.data = data;\n\n await runArkosGatewayPipes(\n [...inheritedPipes, ...eventPipes],\n socket,\n data\n );\n\n await handler(socket, data, wrappedAck);\n\n handleGatewayEventLog(\n this.config.name,\n eventConfig.event,\n 200,\n startTime\n );\n\n if (eventConfig.ack && ack && !ackCalled) {\n ack({ success: true });\n }\n } catch (err: any) {\n handleArkosGatewayErrors(\n err,\n socket,\n errorHandlers,\n {\n startTime,\n namespace: this.config.name,\n event: eventConfig.event,\n },\n ack\n );\n }\n });\n }\n });\n\n for (const child of this.gateways) {\n child._register(\n io,\n {\n name: namespaceName,\n authentication: resolvedAuth,\n rateLimit: resolvedRateLimit,\n },\n resolvedHooks,\n inheritedPipes,\n options\n );\n }\n }\n}\n\n/**\n * Creates an Arkos WebSocket Gateway backed by Socket.io.\n *\n * Handles authentication, validation, rate limiting, pipes,\n * error handling, and nested gateways — all declaratively.\n * Enhances every connected socket with `socket.user()`, `socket.peer()`,\n * `socket.retry()`, and automatic `_meta` injection on outgoing emits.\n *\n * @example\n * ```ts\n * const chatGateway = ArkosGateway({\n * name: \"chat\",\n * authentication: true,\n * rateLimit: { windowMs: 60_000, max: 200 },\n * })\n *\n * chatGateway.on(\n * { event: \"send_message\", validation: MessageSchema, ack: true },\n * (socket, data, ack) => {\n * socket.to(data.room).emit(\"receive_message\", data)\n * ack?.({ status: \"ok\" })\n * }\n * )\n * ```\n * @since 1.7.0-canary.18\n * @see {@link https://www.arkosjs.com/docs/core-concepts/components/gateways}\n */\nfunction ArkosGateway(config: ArkosGatewayConfig) {\n return new IArkosGateway(config);\n}\n\nexport default ArkosGateway;\n"]}
|
|
1
|
+
{"version":3,"file":"arkos-gateway.js","sourceRoot":"","sources":["../../../../src/components/arkos-gateway/arkos-gateway.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ArkosGatewayConfig,\n ArkosGatewayErrorHandler,\n ArkosGatewayEventConfig,\n ArkosGatewayEventEntry,\n ArkosGatewayHandler,\n ArkosGatewayHookHandler,\n ArkosGatewayHookType,\n ArkosGatewayPipe,\n ArkosGatewayConnectionHandler,\n ArkosSocket,\n ArkosGatewayRegisterOptions,\n} from \"./types\";\nimport { Validator } from \"../../types/validation/validator\";\nimport { Server } from \"socket.io\";\nimport { authActionService, authService } from \"../../exports/services\";\nimport { checkRateLimit, clearRateLimitForSocket } from \"./utils/rate-limiter\";\nimport {\n handleArkosGatewayErrors,\n runArkosGatewayPipes,\n handleGatewayEventLog,\n handleGatewayLifecycleLog,\n} from \"./utils/helpers\";\nimport authHookManager from \"../../modules/auth/utils/auth-hooks-manager\";\nimport { getArkosConfig } from \"../../server\";\nimport validationManager from \"../../types/validation/validation-manager\";\nimport { loginRequiredError } from \"../../modules/auth/utils/auth-error-objects\";\nimport errorPrettifier from \"../../modules/base/utils/error-prettifier\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { defaultGatewayStore } from \"./utils/memory-gateway-store\";\nimport { mountArkosSocketExtensions } from \"./socket-extensions\";\nimport {\n isAuthenticationEnabled,\n isUsingAuthentication,\n} from \"../../utils/helpers/arkos-config.helpers\";\nimport ExitError from \"../../utils/helpers/exit-error\";\nimport { getUserFileExtension } from \"../../utils/helpers/fs.helpers\";\nimport {\n BadRequestError,\n TooManyRequestsError,\n} from \"../../modules/error-handler/utils/errors\";\n\nexport class IArkosGateway {\n private config: ArkosGatewayConfig;\n private events: ArkosGatewayEventEntry[] = [];\n private pipes: ArkosGatewayPipe[] = [];\n private gateways: IArkosGateway[] = [];\n private hooks: {\n type: ArkosGatewayHookType;\n handler: ArkosGatewayHookHandler;\n }[] = [];\n\n constructor(config: ArkosGatewayConfig) {\n this.config = config;\n this.config.name = config.name ?? \"web-socket\";\n }\n\n /**\n * Register a Socket.io connection-level middleware — runs before a socket\n * is accepted into this gateway's namespace. Also accepts a child\n * `ArkosGateway` which will inherit this gateway's name as prefix along\n * with its auth, rateLimit, and pipes.\n *\n * @example\n * chatGateway.use((socket, next) => {\n * console.log(\"incoming connection\", socket.id)\n * })\n *\n * // nested gateway\n * chatGateway.use(notificationsGateway)\n */\n use(...middlewareOrGateway: Array<ArkosGatewayPipe | IArkosGateway>): this {\n for (const item of middlewareOrGateway) {\n if (item instanceof IArkosGateway) {\n this.gateways.push(item);\n } else if (typeof item === \"function\") {\n this.pipes.push(item as ArkosGatewayPipe);\n } else {\n throw new Error(\n `Invalid value for gateway.use() — expected an ArkosGateway instance or a middleware function but received \"${typeof item}\".`\n );\n }\n }\n return this;\n }\n\n /**\n * Register a pipe — middleware that runs before event handlers.\n *\n * When called with a function only, the pipe runs before every event\n * handler in this gateway and drills down to child gateways.\n *\n * When called with an event config object, the pipe runs only for that\n * specific event.\n *\n * @example\n * // runs before every event in this gateway\n * chatGateway.pipe((socket, data) => {\n * })\n *\n * // runs only before \"send_message\"\n * chatGateway.pipe({ event: \"send_message\" }, (socket, data) => {\n * })\n */\n pipe(fn: ArkosGatewayPipe): this;\n pipe<TSchema extends Validator = any>(\n eventConfig: { event: string },\n fn: ArkosGatewayPipe\n ): this;\n pipe<TSchema extends Validator = any>(\n fnOrConfig: ArkosGatewayPipe | ArkosGatewayEventConfig<TSchema>,\n fn?: ArkosGatewayPipe\n ): this {\n if (typeof fnOrConfig === \"function\") {\n this.pipes.push(fnOrConfig);\n } else if (fnOrConfig && typeof fnOrConfig === \"object\" && fn) {\n const entry = this.events.find(\n (e) => e.config.event === fnOrConfig.event\n );\n if (entry) {\n entry.pipes = entry.pipes ?? [];\n entry.pipes.push(fn);\n } else {\n this.events.push({\n config: { event: fnOrConfig.event, _pipeOnly: true } as any,\n handler: null as any,\n pipes: [fn],\n });\n }\n } else {\n throw new Error(\n `Invalid arguments for gateway.pipe() — pass a middleware function, or an event config object followed by a middleware function.`\n );\n }\n return this;\n }\n\n /**\n * Register an event handler.\n *\n * @example\n * chatGateway.on(\n * { event: \"send_message\", validation: MessageSchema, ack: true },\n * (socket, data, ack) => {\n * socket.to(data.room).emit(\"receive_message\", data)\n * ack?.({ status: \"ok\" })\n * }\n * )\n */\n on<TSchema extends Validator = any>(\n eventConfig: ArkosGatewayEventConfig<TSchema>,\n handler: ArkosGatewayHandler\n ): this {\n if (eventConfig.disabled) return this;\n\n if (eventConfig.authorization && this.config.authentication === false) {\n throw new Error(\n `Event \"${eventConfig.event}\" on \"${this.config.name}\" gateway defines authorization rules ` +\n `but the gateway has authentication: false. Enable authentication on the gateway to use per-event authentication.`\n );\n }\n\n const deferred = this.events.find(\n (e) => (e.config as any)._pipeOnly && e.config.event === eventConfig.event\n );\n\n const entry: ArkosGatewayEventEntry = {\n config: eventConfig,\n handler,\n pipes: [...this.pipes, ...(deferred?.pipes ?? [])],\n };\n\n if (deferred) {\n const idx = this.events.indexOf(deferred);\n this.events.splice(idx, 1, entry);\n } else {\n this.events.push(entry);\n }\n\n if (typeof eventConfig?.authorization == \"object\")\n // To reuse later on\n (eventConfig.authorization as any)._authAction = authActionService.add(\n eventConfig.authorization!.action,\n eventConfig.authorization!.resource,\n {\n [eventConfig.authorization!.action]: eventConfig.authorization?.rule,\n }\n );\n\n return this;\n }\n\n /**\n * Register a lifecycle hook.\n *\n * - `\"connection\"` — called after a socket successfully connects and passes authentication.\n * - `\"disconnect\"` — called when a socket disconnects.\n * - `\"error\"` — called when an error is thrown inside any event handler.\n * If not registered, Arkos emits a default `\"error\"` event to the socket.\n *\n * @example\n * chatGateway.hook(\"connection\", (socket) => {\n * console.log(\"connected\", socket.user.id)\n * })\n *\n * chatGateway.hook(\"error\", (err, socket) => {\n * socket.emit(\"error\", { message: err.message })\n * })\n */\n hook(type: \"connection\", handler: ArkosGatewayConnectionHandler): this;\n hook(type: \"disconnect\", handler: ArkosGatewayConnectionHandler): this;\n hook(type: \"error\", handler: ArkosGatewayErrorHandler): this;\n hook(\n type: ArkosGatewayHookType,\n handler: ArkosGatewayConnectionHandler | ArkosGatewayErrorHandler\n ): this {\n this.hooks.push({ type, handler });\n return this;\n }\n\n /**\n * Wire this gateway into a Socket.io `Server` instance.\n * Registers the namespace, auth middleware, rate limiting, pipes,\n * and all event handlers — then recurses into child gateways.\n *\n * @example\n * const io = new Server(server)\n * chatGateway.register(io)\n */\n register(io: Server, options: ArkosGatewayRegisterOptions = {}): void {\n if ((io as any)._arkosGatewayRegistered)\n throw new Error(\n `The method gateway.register() can only be called once per io server instance. Use gateway.use() to compose gateways, see https://www.arkosjs.com/docs/components/advanced-guides/web-sockets/setup.`\n );\n (io as any)._arkosGatewayRegistered = true;\n this._register(io, undefined, this.hooks || [], this.pipes || [], options);\n }\n\n private _register(\n io: Server,\n parentConfig?: ArkosGatewayConfig,\n inheritedHooks: {\n type: ArkosGatewayHookType;\n handler: ArkosGatewayHookHandler;\n }[] = [],\n inheritedPipes: ArkosGatewayPipe[] = [],\n options: ArkosGatewayRegisterOptions = {}\n ): void {\n options.store = options.store ?? defaultGatewayStore;\n const { store } = options;\n\n const parentName = parentConfig?.name;\n const ownName = this.config.name;\n this.config = deepmerge(parentConfig || {}, this.config, {\n arrayMerge: (_, sourceArray) => sourceArray,\n });\n this.config.name = ownName;\n const localConfig = this.config;\n\n const namespaceName = parentName\n ? `${parentName.replace(/\\/$/, \"\")}/${ownName.replace(/^\\//, \"\")}`\n : (ownName ?? \"\");\n\n const ns = io.of(namespaceName);\n\n const resolvedAuth =\n this.config.authentication !== false &&\n parentConfig?.authentication !== false;\n\n const resolvedRateLimit = this.config.rateLimit ?? parentConfig?.rateLimit;\n const resolvedHooks = [...inheritedHooks, ...this.hooks];\n\n const connectHandlers = resolvedHooks\n .filter((h) => h.type === \"connection\")\n .map((h) => h.handler as ArkosGatewayConnectionHandler);\n\n const disconnectHandlers = resolvedHooks\n .filter((h) => h.type === \"disconnect\")\n .map((h) => h.handler as ArkosGatewayConnectionHandler);\n\n const errorHandlers = resolvedHooks\n .filter((h) => h.type === \"error\")\n .map((h) => h.handler as ArkosGatewayErrorHandler);\n\n if (resolvedAuth && isAuthenticationEnabled()) {\n ns.use(async (socket: any, next) => {\n socket = socket as ArkosSocket;\n const startTime = new Date().getTime();\n try {\n await authHookManager.runAuthenticate(\n {\n context: socket,\n done: (err?: any) => {\n if (err) throw err;\n next();\n },\n },\n async (socket) => {\n const user = await authService.getAuthenticatedUser(socket);\n if (!user) throw loginRequiredError;\n return user;\n },\n \"currentUser\"\n );\n } catch (err: any) {\n handleArkosGatewayErrors(err, socket, errorHandlers, {\n startTime,\n namespace: this.config.name,\n event: \"authentication\",\n });\n next(err);\n }\n });\n } else if (\n (this.config.authentication || parentConfig?.authentication) &&\n !isUsingAuthentication()\n )\n throw ExitError(\n `Trying to authenticate gateway ${this.config.name ? `${this.config.name}` : \"\"} without choosing an authentication mode under arkos.config.${getUserFileExtension()}.\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n ns.on(\"connection\", async (s) => {\n const socket = s as ArkosSocket;\n socket.locals = {};\n\n socket._arkos = { store, gatewayConfig: localConfig };\n mountArkosSocketExtensions(socket);\n\n handleGatewayLifecycleLog(this.config.name, \"connected\", socket.id);\n const connectionStartTime = new Date().getTime();\n\n if (socket.currentUser?.id)\n socket.join(`arkos::user:${socket.currentUser.id}`);\n\n try {\n for (const handler of connectHandlers) await handler(socket);\n } catch (err: any) {\n handleArkosGatewayErrors(err, socket, [], {\n startTime: connectionStartTime,\n namespace: this.config.name,\n event: \"connection\",\n });\n return;\n }\n\n socket.on(\"disconnect\", async () => {\n handleGatewayLifecycleLog(this.config.name, \"disconnected\", socket.id);\n\n await clearRateLimitForSocket(socket.id, store);\n try {\n for (const handler of disconnectHandlers) await handler(socket);\n } catch (err) {\n handleArkosGatewayErrors(err, socket, [], {\n startTime: connectionStartTime,\n namespace: this.config.name,\n event: \"disconnection\",\n });\n }\n });\n\n for (const entry of this.events) {\n if ((entry.config as any)._pipeOnly || !entry.handler) continue;\n\n const { config: eventConfig, handler, pipes: eventPipes = [] } = entry;\n\n if (\n (this.config.authentication || parentConfig?.authentication) &&\n !isUsingAuthentication()\n )\n throw ExitError(\n `Trying to use authorization gateway.on(\"${eventConfig.event}\") without choosing an authentication mode under arkos.config.${getUserFileExtension()}.\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n socket.on(eventConfig.event, async (...args: any[]) => {\n socket.locals = {};\n const startTime = new Date().getTime();\n let data = args[0];\n\n const ack =\n typeof args[args.length - 1] === \"function\"\n ? args[args.length - 1]\n : undefined;\n\n let ackCalled = false;\n const wrappedAck = ack\n ? (...response: any) => {\n ackCalled = true;\n ack(...response);\n }\n : undefined;\n\n function resolveDedup() {\n if (\n eventConfig.dedup === false ||\n localConfig.dedup === false ||\n parentConfig?.dedup === false\n )\n return null;\n\n return {\n enabled: true,\n ttl: 3600,\n ...parentConfig?.dedup,\n ...localConfig?.dedup,\n ...eventConfig?.dedup,\n };\n }\n\n const dedupOpt = resolveDedup();\n\n try {\n const meta = data?._meta || {};\n const resolvedMaxAge =\n eventConfig.maxAge ?? localConfig.maxAge ?? parentConfig?.maxAge;\n\n if (resolvedMaxAge && !meta.timestamp)\n throw new BadRequestError(\n \"Missing _meta.timestamp for maxAge deduplication\"\n );\n\n if (meta.timestamp !== undefined) {\n const timestamp = new Date(meta.timestamp);\n\n if (isNaN(timestamp.getTime())) {\n throw new BadRequestError(\n \"Invalid data._meta.timestamp\",\n \"InvalidTimestamp\"\n );\n }\n\n const age = Date.now() - timestamp.getTime();\n\n if (age + 1000 < 0)\n throw new BadRequestError(\n \"Timestamp is in the future\",\n \"FutureTimestamp\"\n );\n\n if (resolvedMaxAge && age > resolvedMaxAge) {\n throw new BadRequestError(\"Message is too old\", \"StaleMessage\");\n }\n }\n\n if (dedupOpt && dedupOpt?.enabled !== false) {\n if (!meta?.mid)\n throw new BadRequestError(\n \"Missing data._meta.mid in your payload for deduplication\",\n \"MissingDedupMessageId\",\n { data }\n );\n\n if (typeof meta.mid !== \"string\" || meta.mid.trim() === \"\")\n throw new BadRequestError(\n \"Invalid data._meta.mid, it must be a non-empty string\",\n \"InvalidMessageId\"\n );\n\n const key = `arkos::dedup:${eventConfig.event}:${meta.mid}`;\n const ttl = dedupOpt?.ttl ?? 3600;\n\n const acquired = await store.setIfNotExists(key, ttl);\n\n if (acquired === false)\n return wrappedAck?.({\n success: true,\n duplicate: true,\n });\n\n const { _meta, ...payload } = data;\n data = payload;\n\n socket.meta = meta;\n }\n\n const rateLimitOptions = eventConfig.rateLimit ?? resolvedRateLimit;\n if (rateLimitOptions !== false) {\n const { allowed, retryAfter } = await checkRateLimit(\n socket.id,\n eventConfig.event,\n rateLimitOptions || {},\n options.store!\n );\n if (!allowed) {\n throw new TooManyRequestsError(undefined, undefined, {\n retryAfter,\n });\n }\n }\n\n if (\n typeof eventConfig.authorization === \"object\" &&\n resolvedAuth &&\n isAuthenticationEnabled()\n ) {\n await authHookManager.runAuthorize(\n { context: socket, done: () => {} },\n (eventConfig?.authorization as any)?._authAction,\n \"currentUser\"\n );\n }\n\n if (eventConfig.validation) {\n const arkosConfig = getArkosConfig();\n const {\n validationFn,\n isValidValidator,\n validatorName,\n validatorNameType,\n } = validationManager;\n\n if (!isValidValidator(eventConfig.validation))\n throw new Error(\n `Your validation resolver is set to ${arkosConfig.validation!.resolver}, ` +\n `please provide a valid ${validatorName} in order to use { validation: ${validatorNameType} } ` +\n `under event handler \"${eventConfig.event}\" in \"${this.config.name}\" gateway.`\n );\n\n const shouldValidate = validationManager.shouldValidate(\n eventConfig.validation,\n data\n );\n\n if (shouldValidate === \"prohibit\")\n throw new BadRequestError(\n \"Event data is not allowed for this event.\",\n \"EventDataNotAllowed\",\n { data }\n );\n else if (shouldValidate === \"passthrough\") data = data;\n else {\n try {\n data = await (validationFn as any)(\n eventConfig.validation,\n data\n );\n } catch (err: any) {\n const { validationConfig } = validationManager;\n\n const resolver = validationConfig?.resolver;\n const isZod = validationConfig?.resolver === \"zod\";\n\n const prettifiedError = errorPrettifier.prettify(\n resolver as any,\n err\n );\n const error = prettifiedError[0];\n\n throw new BadRequestError(\n error.message,\n `InvalidData`,\n isZod ? err.format() : err\n );\n }\n }\n }\n\n socket.data = data;\n\n await runArkosGatewayPipes(\n [...inheritedPipes, ...eventPipes],\n socket,\n data\n );\n\n await handler(socket, data, wrappedAck);\n\n handleGatewayEventLog(\n this.config.name,\n eventConfig.event,\n 200,\n startTime\n );\n\n if (eventConfig.ack && ack && !ackCalled) {\n ack({ success: true });\n }\n } catch (err: any) {\n handleArkosGatewayErrors(\n err,\n socket,\n errorHandlers,\n {\n startTime,\n namespace: this.config.name,\n event: eventConfig.event,\n },\n ack\n );\n }\n });\n }\n });\n\n for (const child of this.gateways) {\n child._register(\n io,\n {\n name: namespaceName,\n authentication: resolvedAuth,\n rateLimit: resolvedRateLimit,\n },\n resolvedHooks,\n inheritedPipes,\n options\n );\n }\n }\n}\n\n/**\n * Creates an Arkos WebSocket Gateway backed by Socket.io.\n *\n * Handles authentication, validation, rate limiting, pipes,\n * error handling, and nested gateways — all declaratively.\n * Enhances every connected socket with `socket.user()`, `socket.peer()`,\n * `socket.retry()`, and automatic `_meta` injection on outgoing emits.\n *\n * @example\n * ```ts\n * const chatGateway = ArkosGateway({\n * name: \"chat\",\n * authentication: true,\n * rateLimit: { windowMs: 60_000, max: 200 },\n * })\n *\n * chatGateway.on(\n * { event: \"send_message\", validation: MessageSchema, ack: true },\n * (socket, data, ack) => {\n * socket.to(data.room).emit(\"receive_message\", data)\n * ack?.({ status: \"ok\" })\n * }\n * )\n * ```\n * @since 1.7.0-canary.18\n * @see {@link https://www.arkosjs.com/docs/core-concepts/components/gateways}\n */\nfunction ArkosGateway(config: ArkosGatewayConfig) {\n return new IArkosGateway(config);\n}\n\nexport default ArkosGateway;\n"]}
|
|
@@ -19,6 +19,8 @@ function resolveUserSocketIds(socket, userId) {
|
|
|
19
19
|
return result;
|
|
20
20
|
}
|
|
21
21
|
export class ArkosBroadcastOperatorImpl {
|
|
22
|
+
socket;
|
|
23
|
+
operator;
|
|
22
24
|
constructor(socket, operator) {
|
|
23
25
|
this.socket = socket;
|
|
24
26
|
this.operator = operator;
|
|
@@ -77,6 +79,11 @@ export class ArkosBroadcastOperatorImpl {
|
|
|
77
79
|
}
|
|
78
80
|
}
|
|
79
81
|
class ArkosRetryTargetImpl {
|
|
82
|
+
socket;
|
|
83
|
+
maxRetries;
|
|
84
|
+
baseDelay;
|
|
85
|
+
multiplier;
|
|
86
|
+
timeoutMs;
|
|
80
87
|
constructor(socket, maxRetries, baseDelay, multiplier) {
|
|
81
88
|
this.socket = socket;
|
|
82
89
|
this.maxRetries = maxRetries;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-extensions.js","sourceRoot":"","sources":["../../../../src/components/arkos-gateway/socket-extensions.ts"],"names":[],"mappings":"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","sourcesContent":["import { uuidv7 } from \"uuidv7\";\nimport {\n ArkosBroadcastOperator,\n ArkosRetryTarget,\n ArkosSocket,\n ArkosUserTarget,\n} from \"./types\";\nimport { BroadcastOperator } from \"socket.io\";\n\nfunction injectMeta<T>(\n data: T\n): T & { _meta: { mid: string; timestamp: number } } {\n return {\n ...(data as any),\n _meta: { mid: uuidv7(), timestamp: Date.now() },\n };\n}\n\nfunction resolveUserSocketIds(\n socket: ArkosSocket,\n userId: string | string[]\n): string[] {\n const ids = Array.isArray(userId) ? userId : [userId];\n const result: string[] = [];\n for (const [id, s] of socket.nsp.sockets) {\n for (const uid of ids) {\n if (s.rooms.has(`arkos::user:${uid}`)) {\n result.push(id);\n break;\n }\n }\n }\n return result;\n}\n\nexport class ArkosBroadcastOperatorImpl {\n constructor(\n private readonly socket: ArkosSocket,\n private readonly operator: BroadcastOperator<any, any>\n ) {\n const instance = Object.create(operator) as this;\n instance.emit = this.emit.bind(this);\n instance.emitWithAck = this.emitWithAck.bind(this);\n instance.except = this.except.bind(this);\n instance.compress = this.compress.bind(this);\n instance.timeout = this.timeout.bind(this);\n instance.users = this.users.bind(this);\n Object.defineProperty(instance, \"volatile\", {\n get: () => this.volatile,\n configurable: true,\n });\n return instance;\n }\n\n /**\n * Returns all unique user IDs currently in the target room(s).\n * Uses the internal `arkos::user:` room convention to map sockets to users.\n *\n * @example\n * const users = await socket.to(\"room-123\").users()\n * console.log(users) // ['user-1', 'user-2']\n */\n async users(): Promise<string[]> {\n const sockets = await this.operator.fetchSockets();\n const userIds = new Set<string>();\n for (const s of sockets) {\n for (const room of s.rooms) {\n if (room.startsWith(\"arkos::user:\")) {\n userIds.add(room.slice(\"arkos::user:\".length));\n break; // each socket has at most one user room\n }\n }\n }\n return Array.from(userIds);\n }\n\n /**\n * Excludes sockets from the broadcast.\n * Accepts a room name, socket ID, array of rooms/IDs, or `{ user: string | string[] }`\n * to exclude all sockets belonging to one or more users.\n *\n * @example\n * socket.to(\"room-101\").except(\"room-102\").emit(\"foo\", data)\n * socket.broadcast.except({ user: userId }).emit(\"foo\", data)\n * socket.broadcast.except({ user: [id1, id2] }).emit(\"foo\", data)\n */\n except(room: string | string[] | { user: string | string[] }) {\n if (typeof room === \"string\" || Array.isArray(room)) {\n return new ArkosBroadcastOperatorImpl(\n this.socket,\n this.operator.except(room)\n );\n }\n const socketIds = resolveUserSocketIds(this.socket, room.user);\n let op = this.operator;\n for (const id of socketIds) op = op.except(id);\n return new ArkosBroadcastOperatorImpl(this.socket, op);\n }\n\n /**\n * Emits an event to the target. `_meta` (`mid` + `timestamp`) is injected automatically.\n *\n * @example\n * socket.to(\"room-101\").emit(\"message\", { text: \"hello\" })\n * socket.broadcast.emit(\"announcement\", data)\n */\n emit(event: string, ...args: any[]): boolean {\n const [data, ...rest] = args;\n return this.operator.emit(event, injectMeta(data), ...rest);\n }\n\n /**\n * Sets the volatile flag — the event may be dropped if the client is not ready.\n * Useful for high-frequency non-critical events like cursor positions or typing indicators.\n *\n * @example\n * socket.to(\"room-101\").volatile.emit(\"cursor\", position)\n */\n get volatile() {\n return new ArkosBroadcastOperatorImpl(this.socket, this.operator.volatile);\n }\n\n /**\n * Sets the compress flag for the next emission.\n *\n * @example\n * socket.broadcast.compress(false).emit(\"ping\", data)\n */\n compress(value: boolean) {\n return new ArkosBroadcastOperatorImpl(\n this.socket,\n this.operator.compress(value)\n );\n }\n\n /**\n * Sets a timeout in milliseconds for `emitWithAck`.\n * Rejects the promise if no client acknowledges within the given delay.\n *\n * @example\n * socket.to(\"room-101\").timeout(3000).emitWithAck(\"confirm\", data)\n */\n timeout(ms: number) {\n return new ArkosBroadcastOperatorImpl(\n this.socket,\n this.operator.timeout(ms)\n );\n }\n\n /**\n * Emits an event and waits for acknowledgements from all matched clients.\n * `_meta` is injected automatically. Use `.timeout(ms)` to avoid hanging indefinitely.\n *\n * @example\n * const responses = await socket.to(\"room-101\").timeout(3000).emitWithAck(\"confirm\", data)\n */\n async emitWithAck(event: string, ...args: any[]): Promise<any[]> {\n const [data, ...rest] = args;\n return this.operator.emitWithAck(event, injectMeta(data), ...rest);\n }\n}\n\nclass ArkosRetryTargetImpl implements ArkosRetryTarget {\n private timeoutMs?: number;\n\n constructor(\n private readonly socket: ArkosSocket,\n private readonly maxRetries: number,\n private readonly baseDelay: number,\n private readonly multiplier: number\n ) {}\n\n /**\n * Sets a timeout in milliseconds applied on each `emitWithAck` attempt.\n *\n * @example\n * socket.retry(3).timeout(5000).emitWithAck(\"event\", data)\n */\n timeout(ms: number) {\n this.timeoutMs = ms;\n return this;\n }\n\n /**\n * Emits with ack and exponential backoff retry. `_meta` is injected automatically.\n * Each attempt respects the `.timeout(ms)` if set.\n *\n * @example\n * const ack = await socket.retry(3).timeout(5000).emitWithAck(\"confirm\", data)\n */\n async emitWithAck(event: string, data: any, ...rest: any[]): Promise<any> {\n const patched = injectMeta(data);\n return this.attemptEmitWithAck(event, patched, rest, 0);\n }\n\n private async attemptEmitWithAck(\n event: string,\n data: any,\n rest: any[],\n attempt: number\n ): Promise<any> {\n try {\n const s = this.timeoutMs\n ? this.socket.timeout(this.timeoutMs)\n : this.socket;\n return await s.emitWithAck(event, data, ...rest);\n } catch (err) {\n if (attempt < this.maxRetries) {\n const delay = Math.pow(this.multiplier, attempt) * this.baseDelay;\n await new Promise((r) => setTimeout(r, delay));\n return this.attemptEmitWithAck(event, data, rest, attempt + 1);\n }\n throw err;\n }\n }\n}\n\n/**\n * Mounts Arkos socket extensions and patches emit methods for automatic `_meta` injection.\n * Called once by the gateway at connection time, right after injecting `_arkos`.\n *\n * Patches: `emit`, `emitWithAck`, `to()`, `timeout()`, `broadcast`\n * Mounts: `user()`, `peer()`, `retry()`\n *\n * @internal\n * @since 1.7.0-canary.29\n */\nexport function mountArkosSocketExtensions(socket: ArkosSocket): void {\n const originalEmit = socket.emit.bind(socket);\n const originalEmitWithAck = socket.emitWithAck.bind(socket);\n const originalTo = socket.to.bind(socket);\n const originalTimeout = socket.timeout.bind(socket);\n\n socket.emit = function (event: string, data?: any, ...rest: any[]) {\n return originalEmit(event, injectMeta(data), ...rest);\n };\n\n socket.emitWithAck = function (event: string, data?: any, ...rest: any[]) {\n return originalEmitWithAck(event, injectMeta(data), ...rest);\n };\n\n socket.to = function (room: string | string[]) {\n return new ArkosBroadcastOperatorImpl(\n socket,\n originalTo(room)\n ) as any as ArkosBroadcastOperator;\n };\n\n socket.timeout = function (ms: number) {\n const timedSocket = originalTimeout(ms);\n const originalTimedEmitWithAck = timedSocket.emitWithAck.bind(timedSocket);\n timedSocket.emitWithAck = function (\n event: string,\n data?: any,\n ...rest: any[]\n ) {\n const result = originalTimedEmitWithAck(event, injectMeta(data), ...rest);\n return result;\n };\n return timedSocket;\n };\n\n const broadcastDescriptor = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(socket),\n \"broadcast\"\n );\n\n Object.defineProperty(socket, \"broadcast\", {\n get() {\n const operator = broadcastDescriptor!.get!.call(socket);\n return new ArkosBroadcastOperatorImpl(socket, operator);\n },\n configurable: true,\n });\n\n socket.user = function (userId: string): ArkosUserTarget {\n const target = new ArkosBroadcastOperatorImpl(\n socket,\n socket.nsp.to(`arkos::user:${userId}`)\n ) as any as ArkosUserTarget;\n\n target.activeRooms = async () => {\n const sockets = await (\n target as unknown as ArkosBroadcastOperator\n ).fetchSockets();\n const roomsSet = new Set<string>();\n for (const s of sockets as any[]) {\n for (const room of s.rooms) {\n if (!room.startsWith(\"arkos::user:\")) roomsSet.add(room);\n }\n }\n return Array.from(roomsSet);\n };\n\n return target;\n };\n socket.retry = function (\n times: number,\n baseDelay: number = 1000,\n multiplier: number = 2\n ): ArkosRetryTarget {\n return new ArkosRetryTargetImpl(socket, times, baseDelay, multiplier);\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"socket-extensions.js","sourceRoot":"","sources":["../../../../src/components/arkos-gateway/socket-extensions.ts"],"names":[],"mappings":"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","sourcesContent":["import { uuidv7 } from \"uuidv7\";\nimport {\n ArkosBroadcastOperator,\n ArkosRetryTarget,\n ArkosSocket,\n ArkosUserTarget,\n} from \"./types\";\nimport { BroadcastOperator } from \"socket.io\";\n\nfunction injectMeta<T>(\n data: T\n): T & { _meta: { mid: string; timestamp: number } } {\n return {\n ...(data as any),\n _meta: { mid: uuidv7(), timestamp: Date.now() },\n };\n}\n\nfunction resolveUserSocketIds(\n socket: ArkosSocket,\n userId: string | string[]\n): string[] {\n const ids = Array.isArray(userId) ? userId : [userId];\n const result: string[] = [];\n for (const [id, s] of socket.nsp.sockets) {\n for (const uid of ids) {\n if (s.rooms.has(`arkos::user:${uid}`)) {\n result.push(id);\n break;\n }\n }\n }\n return result;\n}\n\nexport class ArkosBroadcastOperatorImpl {\n constructor(\n private readonly socket: ArkosSocket,\n private readonly operator: BroadcastOperator<any, any>\n ) {\n const instance = Object.create(operator) as this;\n instance.emit = this.emit.bind(this);\n instance.emitWithAck = this.emitWithAck.bind(this);\n instance.except = this.except.bind(this);\n instance.compress = this.compress.bind(this);\n instance.timeout = this.timeout.bind(this);\n instance.users = this.users.bind(this);\n Object.defineProperty(instance, \"volatile\", {\n get: () => this.volatile,\n configurable: true,\n });\n return instance;\n }\n\n /**\n * Returns all unique user IDs currently in the target room(s).\n * Uses the internal `arkos::user:` room convention to map sockets to users.\n *\n * @example\n * const users = await socket.to(\"room-123\").users()\n * console.log(users) // ['user-1', 'user-2']\n */\n async users(): Promise<string[]> {\n const sockets = await this.operator.fetchSockets();\n const userIds = new Set<string>();\n for (const s of sockets) {\n for (const room of s.rooms) {\n if (room.startsWith(\"arkos::user:\")) {\n userIds.add(room.slice(\"arkos::user:\".length));\n break; // each socket has at most one user room\n }\n }\n }\n return Array.from(userIds);\n }\n\n /**\n * Excludes sockets from the broadcast.\n * Accepts a room name, socket ID, array of rooms/IDs, or `{ user: string | string[] }`\n * to exclude all sockets belonging to one or more users.\n *\n * @example\n * socket.to(\"room-101\").except(\"room-102\").emit(\"foo\", data)\n * socket.broadcast.except({ user: userId }).emit(\"foo\", data)\n * socket.broadcast.except({ user: [id1, id2] }).emit(\"foo\", data)\n */\n except(room: string | string[] | { user: string | string[] }) {\n if (typeof room === \"string\" || Array.isArray(room)) {\n return new ArkosBroadcastOperatorImpl(\n this.socket,\n this.operator.except(room)\n );\n }\n const socketIds = resolveUserSocketIds(this.socket, room.user);\n let op = this.operator;\n for (const id of socketIds) op = op.except(id);\n return new ArkosBroadcastOperatorImpl(this.socket, op);\n }\n\n /**\n * Emits an event to the target. `_meta` (`mid` + `timestamp`) is injected automatically.\n *\n * @example\n * socket.to(\"room-101\").emit(\"message\", { text: \"hello\" })\n * socket.broadcast.emit(\"announcement\", data)\n */\n emit(event: string, ...args: any[]): boolean {\n const [data, ...rest] = args;\n return this.operator.emit(event, injectMeta(data), ...rest);\n }\n\n /**\n * Sets the volatile flag — the event may be dropped if the client is not ready.\n * Useful for high-frequency non-critical events like cursor positions or typing indicators.\n *\n * @example\n * socket.to(\"room-101\").volatile.emit(\"cursor\", position)\n */\n get volatile() {\n return new ArkosBroadcastOperatorImpl(this.socket, this.operator.volatile);\n }\n\n /**\n * Sets the compress flag for the next emission.\n *\n * @example\n * socket.broadcast.compress(false).emit(\"ping\", data)\n */\n compress(value: boolean) {\n return new ArkosBroadcastOperatorImpl(\n this.socket,\n this.operator.compress(value)\n );\n }\n\n /**\n * Sets a timeout in milliseconds for `emitWithAck`.\n * Rejects the promise if no client acknowledges within the given delay.\n *\n * @example\n * socket.to(\"room-101\").timeout(3000).emitWithAck(\"confirm\", data)\n */\n timeout(ms: number) {\n return new ArkosBroadcastOperatorImpl(\n this.socket,\n this.operator.timeout(ms)\n );\n }\n\n /**\n * Emits an event and waits for acknowledgements from all matched clients.\n * `_meta` is injected automatically. Use `.timeout(ms)` to avoid hanging indefinitely.\n *\n * @example\n * const responses = await socket.to(\"room-101\").timeout(3000).emitWithAck(\"confirm\", data)\n */\n async emitWithAck(event: string, ...args: any[]): Promise<any[]> {\n const [data, ...rest] = args;\n return this.operator.emitWithAck(event, injectMeta(data), ...rest);\n }\n}\n\nclass ArkosRetryTargetImpl implements ArkosRetryTarget {\n private timeoutMs?: number;\n\n constructor(\n private readonly socket: ArkosSocket,\n private readonly maxRetries: number,\n private readonly baseDelay: number,\n private readonly multiplier: number\n ) {}\n\n /**\n * Sets a timeout in milliseconds applied on each `emitWithAck` attempt.\n *\n * @example\n * socket.retry(3).timeout(5000).emitWithAck(\"event\", data)\n */\n timeout(ms: number) {\n this.timeoutMs = ms;\n return this;\n }\n\n /**\n * Emits with ack and exponential backoff retry. `_meta` is injected automatically.\n * Each attempt respects the `.timeout(ms)` if set.\n *\n * @example\n * const ack = await socket.retry(3).timeout(5000).emitWithAck(\"confirm\", data)\n */\n async emitWithAck(event: string, data: any, ...rest: any[]): Promise<any> {\n const patched = injectMeta(data);\n return this.attemptEmitWithAck(event, patched, rest, 0);\n }\n\n private async attemptEmitWithAck(\n event: string,\n data: any,\n rest: any[],\n attempt: number\n ): Promise<any> {\n try {\n const s = this.timeoutMs\n ? this.socket.timeout(this.timeoutMs)\n : this.socket;\n return await s.emitWithAck(event, data, ...rest);\n } catch (err) {\n if (attempt < this.maxRetries) {\n const delay = Math.pow(this.multiplier, attempt) * this.baseDelay;\n await new Promise((r) => setTimeout(r, delay));\n return this.attemptEmitWithAck(event, data, rest, attempt + 1);\n }\n throw err;\n }\n }\n}\n\n/**\n * Mounts Arkos socket extensions and patches emit methods for automatic `_meta` injection.\n * Called once by the gateway at connection time, right after injecting `_arkos`.\n *\n * Patches: `emit`, `emitWithAck`, `to()`, `timeout()`, `broadcast`\n * Mounts: `user()`, `peer()`, `retry()`\n *\n * @internal\n * @since 1.7.0-canary.29\n */\nexport function mountArkosSocketExtensions(socket: ArkosSocket): void {\n const originalEmit = socket.emit.bind(socket);\n const originalEmitWithAck = socket.emitWithAck.bind(socket);\n const originalTo = socket.to.bind(socket);\n const originalTimeout = socket.timeout.bind(socket);\n\n socket.emit = function (event: string, data?: any, ...rest: any[]) {\n return originalEmit(event, injectMeta(data), ...rest);\n };\n\n socket.emitWithAck = function (event: string, data?: any, ...rest: any[]) {\n return originalEmitWithAck(event, injectMeta(data), ...rest);\n };\n\n socket.to = function (room: string | string[]) {\n return new ArkosBroadcastOperatorImpl(\n socket,\n originalTo(room)\n ) as any as ArkosBroadcastOperator;\n };\n\n socket.timeout = function (ms: number) {\n const timedSocket = originalTimeout(ms);\n const originalTimedEmitWithAck = timedSocket.emitWithAck.bind(timedSocket);\n timedSocket.emitWithAck = function (\n event: string,\n data?: any,\n ...rest: any[]\n ) {\n const result = originalTimedEmitWithAck(event, injectMeta(data), ...rest);\n return result;\n };\n return timedSocket;\n };\n\n const broadcastDescriptor = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(socket),\n \"broadcast\"\n );\n\n Object.defineProperty(socket, \"broadcast\", {\n get() {\n const operator = broadcastDescriptor!.get!.call(socket);\n return new ArkosBroadcastOperatorImpl(socket, operator);\n },\n configurable: true,\n });\n\n socket.user = function (userId: string): ArkosUserTarget {\n const target = new ArkosBroadcastOperatorImpl(\n socket,\n socket.nsp.to(`arkos::user:${userId}`)\n ) as any as ArkosUserTarget;\n\n target.activeRooms = async () => {\n const sockets = await (\n target as unknown as ArkosBroadcastOperator\n ).fetchSockets();\n const roomsSet = new Set<string>();\n for (const s of sockets as any[]) {\n for (const room of s.rooms) {\n if (!room.startsWith(\"arkos::user:\")) roomsSet.add(room);\n }\n }\n return Array.from(roomsSet);\n };\n\n return target;\n };\n socket.retry = function (\n times: number,\n baseDelay: number = 1000,\n multiplier: number = 2\n ): ArkosRetryTarget {\n return new ArkosRetryTargetImpl(socket, times, baseDelay, multiplier);\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-gateway-store.js","sourceRoot":"","sources":["../../../../../src/components/arkos-gateway/utils/memory-gateway-store.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,kBAAkB;
|
|
1
|
+
{"version":3,"file":"memory-gateway-store.js","sourceRoot":"","sources":["../../../../../src/components/arkos-gateway/utils/memory-gateway-store.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,kBAAkB;IACrB,EAAE,GAAG,IAAI,GAAG,EAA8C,CAAC;IAC3D,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAElD,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,QAAgB;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,IAAI,GAAG,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,GAAG,QAAQ,EAAE,CAAC;YACnD,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc;QACxB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;YAC9B,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK;YACnC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,GAAW;QAChC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;QACnE,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAW,EAAE,GAAW;QAC3C,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAEtC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;QACnE,KAAK,CAAC,KAAK,EAAE,CAAC;QAEd,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAE3B,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,kBAAkB,EAAE,CAAC","sourcesContent":["import { ArkosGatewayStore } from \"../types\";\n\nexport class MemoryGatewayStore implements ArkosGatewayStore {\n private rl = new Map<string, { count: number; resetAt: number }>();\n private dedup = new Map<string, NodeJS.Timeout>();\n\n async increment(key: string, windowMs: number) {\n const now = Date.now();\n const entry = this.rl.get(key);\n if (!entry || entry.resetAt <= now) {\n const next = { count: 1, resetAt: now + windowMs };\n this.rl.set(key, next);\n return next;\n }\n entry.count++;\n return entry;\n }\n\n async clear(prefix: string) {\n for (const key of this.rl.keys())\n if (key.startsWith(prefix)) this.rl.delete(key);\n for (const [key, timer] of this.dedup)\n if (key.startsWith(prefix)) {\n clearTimeout(timer);\n this.dedup.delete(key);\n }\n }\n\n async has(key: string) {\n return this.dedup.has(key);\n }\n\n async set(key: string, ttl: number) {\n if (this.dedup.has(key)) clearTimeout(this.dedup.get(key)!);\n const timer = setTimeout(() => this.dedup.delete(key), ttl * 1000);\n timer.unref();\n this.dedup.set(key, timer);\n }\n\n async setIfNotExists(key: string, ttl: number): Promise<boolean> {\n if (this.dedup.has(key)) return false;\n\n const timer = setTimeout(() => this.dedup.delete(key), ttl * 1000);\n timer.unref();\n\n this.dedup.set(key, timer);\n\n return true;\n }\n}\n\nexport const defaultGatewayStore = new MemoryGatewayStore();\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-tier-arkos-gateway-store.js","sourceRoot":"","sources":["../../../../../src/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,0BAA0B;
|
|
1
|
+
{"version":3,"file":"multi-tier-arkos-gateway-store.js","sourceRoot":"","sources":["../../../../../src/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,0BAA0B;IACjB;IAApB,YAAoB,KAA0B;QAA1B,UAAK,GAAL,KAAK,CAAqB;IAAG,CAAC;IAElD,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,QAAgB;QAE3C,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACtE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc;QACxB,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;QACvC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,GAAW;QAChC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAW,EAAE,GAAW;QAC3C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAErD,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC3B,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;wBACf,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;gBAED,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF","sourcesContent":["import { ArkosGatewayStore } from \"../types\";\n\n/**\n * Multi-tier store that chains multiple stores together.\n * Writes go to all tiers. Reads check tiers in order, promoting hits to faster tiers.\n *\n * @example\n * new MultiTierArkosStore([new MemoryArkosStore(), new RedisArkosStore(redis)])\n */\nexport class MultiTierArkosGatewayStore implements ArkosGatewayStore {\n constructor(private tiers: ArkosGatewayStore[]) {}\n\n async increment(key: string, windowMs: number) {\n // L1 first — if valid, sync to slower tiers and return\n const l1 = await this.tiers[0].increment(key, windowMs);\n for (const tier of this.tiers.slice(1)) tier.increment(key, windowMs);\n return l1;\n }\n\n async clear(prefix: string) {\n await Promise.all(this.tiers.map((t) => t.clear(prefix)));\n }\n\n async has(key: string) {\n for (const tier of this.tiers) {\n if (await tier.has(key)) return true;\n }\n return false;\n }\n\n async set(key: string, ttl: number) {\n await Promise.all(this.tiers.map((t) => t.set(key, ttl)));\n }\n\n async setIfNotExists(key: string, ttl: number): Promise<boolean> {\n for (const tier of this.tiers) {\n const acquired = await tier.setIfNotExists(key, ttl);\n\n if (acquired) {\n for (const t of this.tiers) {\n if (t !== tier) {\n t.set(key, ttl).catch(() => {});\n }\n }\n\n return true;\n }\n }\n\n return false;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/arkos-loadable-registry/index.ts"],"names":[],"mappings":"AAGA,MAAM,SAAS,GAAG,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;AAMzD,MAAM,OAAO,qBAAqB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/arkos-loadable-registry/index.ts"],"names":[],"mappings":"AAGA,MAAM,SAAS,GAAG,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;AAMzD,MAAM,OAAO,qBAAqB;IACf,KAAK,GAA4C,IAAI,GAAG,EAAE,CAAC;IAM5E,QAAQ,CAAC,IAAmB;QAC1B,MAAM,IAAI,GAAI,IAAY,CAAC,MAAM,CAAC;QAClC,MAAM,UAAU,GAAI,IAAY,CAAC,UAAU,CAAC;QAE5C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC3B,MAAM,KAAK,CACT,8CAA8C,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,GAAG,CAC5F,CAAC;QAEJ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAE3D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IAKD,OAAO,CACL,YAAmD,EACnD,UAA2B;QAE3B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;IAC/D,CAAC;IAKD,OAAO,CACL,YAAmD,EACnD,UAAkB;QAElB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC;IAChE,CAAC;CACF;AAED,MAAM,gBAAgB,GAAG,IAAI,qBAAqB,EAAE,CAAC;AAErD,eAAe,gBAAgB,CAAC","sourcesContent":["import { ArkosLoadable } from \"../../types/arkos\";\nimport { ArkosModuleType } from \"../arkos-route-hook/types\";\n\nconst LOADABLES = [\"ArkosRouteHook\", \"ArkosServiceHook\"];\n\n/**\n * Registry for all items loaded via `app.load()`.\n * Instantiated once at app start and passed through the entire Arkos chain.\n */\nexport class ArkosLoadableRegistry {\n private readonly items: Map<string, Map<string, ArkosLoadable>> = new Map();\n\n /**\n * Registers a loadable item into the registry.\n * Called internally by `app.load()`.\n */\n register(item: ArkosLoadable): void {\n const type = (item as any).__type;\n const moduleName = (item as any).moduleName;\n\n if (!LOADABLES.includes(type))\n throw Error(\n `Invalid loadable component, expected on of ${LOADABLES.join(\", \")} but received \"${item}\"`\n );\n\n if (!this.items.has(type)) this.items.set(type, new Map());\n\n this.items.get(type)!.set(moduleName, item);\n }\n\n /**\n * Returns the interceptor for the given module name, or `null` if not registered.\n */\n getItem(\n loadableType: \"ArkosRouteHook\" | \"ArkosServiceHook\",\n moduleName: ArkosModuleType\n ): ArkosLoadable | null {\n return this.items.get(loadableType)?.get(moduleName) ?? null;\n }\n\n /**\n * Returns true if an interceptor is registered for the given module name.\n */\n hasItem(\n loadableType: \"ArkosRouteHook\" | \"ArkosServiceHook\",\n moduleName: string\n ): boolean {\n return this.items.get(loadableType)?.has(moduleName) ?? false;\n }\n}\n\nconst loadableRegistry = new ArkosLoadableRegistry();\n\nexport default loadableRegistry;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../../src/components/arkos-route-hook/reader.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,0CAA0C,CAAC;AAUxE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AA4BhD,MAAM,oBAAoB;IAChB,YAAY,CAAC,UAA2B;QAC9C,OAAO,gBAAgB,CAAC,OAAO,CAAC,gBAAgB,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3E,CAAC;IAEO,QAAQ,CACd,UAA2B;QAE3B,OAAQ,IAAI,CAAC,YAAY,CAAC,UAAU,CAAS,EAAE,MAAM,IAAI,EAAE,CAAC;IAC9D,CAAC;IAKD,YAAY,CACV,UAAmB,EACnB,SAAqC;QAErC,OAAO,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;IAKD,aAAa,CACX,UAAmB,EACnB,SAAqC;QAErC,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAmB,CAAC,IAAI,IAAI,CAAC;IAChE,CAAC;IAKD,QAAQ,CACN,UAAmB,EACnB,SAAqC;QAErC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAmB,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QACvB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC1C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACpC,CAAC;IAMD,cAAc,CACZ,UAAmB,EACnB,SAAqC;QAErC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAmB,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,WAAW,EAAE,GAAG,MAAM,CAAC;QACtE,OAAO,WAAW,CAAC;IACrB,CAAC;IAKD,aAAa,CACX,UAAmB,EACnB,SAAqC;QAErC,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAmB,CAAC,EAAE,UAAU,CAAC;IACpE,CAAC;IAKD,YAAY,CACV,UAAmB,EACnB,SAAqC;
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../../src/components/arkos-route-hook/reader.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,0CAA0C,CAAC;AAUxE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AA4BhD,MAAM,oBAAoB;IAChB,YAAY,CAAC,UAA2B;QAC9C,OAAO,gBAAgB,CAAC,OAAO,CAAC,gBAAgB,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3E,CAAC;IAEO,QAAQ,CACd,UAA2B;QAE3B,OAAQ,IAAI,CAAC,YAAY,CAAC,UAAU,CAAS,EAAE,MAAM,IAAI,EAAE,CAAC;IAC9D,CAAC;IAKD,YAAY,CACV,UAAmB,EACnB,SAAqC;QAErC,OAAO,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;IAKD,aAAa,CACX,UAAmB,EACnB,SAAqC;QAErC,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAmB,CAAC,IAAI,IAAI,CAAC;IAChE,CAAC;IAKD,QAAQ,CACN,UAAmB,EACnB,SAAqC;QAErC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAmB,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QACvB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC1C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACpC,CAAC;IAMD,cAAc,CACZ,UAAmB,EACnB,SAAqC;QAErC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAmB,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,WAAW,EAAE,GAAG,MAAM,CAAC;QACtE,OAAO,WAAW,CAAC;IACrB,CAAC;IAKD,aAAa,CACX,UAAmB,EACnB,SAAqC;QAErC,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAmB,CAAC,EAAE,UAAU,CAAC;IACpE,CAAC;IAKD,YAAY,CACV,UAAmB,EACnB,SAAqC;QAKrC,MAAM,EACJ,MAAM,GAAG,EAAE,EACX,KAAK,GAAG,EAAE,EACV,OAAO,GAAG,EAAE,GACb,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;QACrE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;IAC7D,CAAC;CACF;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,oBAAoB,EAAE,CAAC","sourcesContent":["import loadableRegistry from \"../../components/arkos-loadable-registry\";\nimport {\n ArkosModuleType,\n ArkosRouteHookHooks,\n ArkosRouteHookMethodConfig,\n ArkosRouteHookInstance,\n ArkosAuthRouteHookInstance,\n ArkosFileUploadRouteHookInstance,\n} from \"./types\";\nimport { ArkosRouteConfig } from \"../../exports\";\nimport { kebabCase } from \"../../exports/utils\";\n\ntype PrismaOperations = keyof Omit<\n ArkosRouteHookInstance<any>,\n \"__type\" | \"moduleName\" | \"_configs\"\n>;\n\nexport type OperationByModule<TModule extends ArkosModuleType> =\n TModule extends \"file-upload\"\n ? keyof Omit<ArkosFileUploadRouteHookInstance, \"__type\" | \"moduleName\" | \"service\">\n : TModule extends \"auth\"\n ? keyof Omit<ArkosAuthRouteHookInstance, \"__type\" | \"moduleName\" | \"service\">\n : PrismaOperations;\n\n/**\n * Reader for `ArkosRouteHook` instances.\n * Reads config from the global loadable registry by module name.\n *\n * @example\n * ```ts\n * routeHookReader.getHooks(\"user\", \"findMany\") // { before, after, onError }\n * routeHookReader.getRouteConfig(\"user\", \"findMany\") // ArkosRouteConfig minus path and hooks\n * routeHookReader.getPrismaArgs(\"user\", \"findMany\") // prismaArgs for that operation\n * routeHookReader.getFullConfig(\"user\", \"findMany\") // full raw config object\n * routeHookReader.hasOperation(\"user\", \"findMany\") // true | false\n * routeHookReader.forOperation(\"user\", \"findMany\") // { before, after, onError, prismaArgs, routeConfig }\n * ```\n */\nclass ArkosRouteHookReader {\n private getRouteHook(moduleName: ArkosModuleType) {\n return loadableRegistry.getItem(\"ArkosRouteHook\", kebabCase(moduleName));\n }\n\n private getStore(\n moduleName: ArkosModuleType\n ): Record<string, ArkosRouteHookMethodConfig> {\n return (this.getRouteHook(moduleName) as any)?._store ?? {};\n }\n\n /**\n * Returns true if the routeHook has a config registered for the given operation.\n */\n hasOperation<TModule extends ArkosModuleType>(\n moduleName: TModule,\n operation: OperationByModule<TModule>\n ): boolean {\n return operation in this.getStore(moduleName);\n }\n\n /**\n * Returns the full raw config for the given operation, or `null` if not registered.\n */\n getFullConfig<TModule extends ArkosModuleType>(\n moduleName: TModule,\n operation: OperationByModule<TModule>\n ): ArkosRouteHookMethodConfig | null {\n return this.getStore(moduleName)[operation as string] ?? null;\n }\n\n /**\n * Returns only the lifecycle hooks (`before`, `after`, `onError`) for the given operation.\n */\n getHooks<TModule extends ArkosModuleType>(\n moduleName: TModule,\n operation: OperationByModule<TModule>\n ): ArkosRouteHookHooks | undefined {\n const config = this.getStore(moduleName)[operation as string];\n if (!config) return {};\n const { before, after, onError } = config;\n return { before, after, onError };\n }\n\n /**\n * Returns the `ArkosRouteConfig` portion of the config (excludes `path`, hooks, and `prismaArgs`)\n * for the given operation.\n */\n getRouteConfig<TModule extends ArkosModuleType>(\n moduleName: TModule,\n operation: OperationByModule<TModule>\n ): Omit<ArkosRouteConfig, \"path\"> | null {\n const config = this.getStore(moduleName)[operation as string];\n if (!config) return null;\n const { before, after, onError, prismaArgs, ...routeConfig } = config;\n return routeConfig;\n }\n\n /**\n * Returns the `prismaArgs` for the given operation, or `undefined` if not set.\n */\n getPrismaArgs<TModule extends ArkosModuleType>(\n moduleName: TModule,\n operation: OperationByModule<TModule>\n ): Record<string, any> | undefined {\n return this.getStore(moduleName)[operation as string]?.prismaArgs;\n }\n\n /**\n * Returns all extracted slices for a given operation in one call.\n */\n forOperation<TModule extends ArkosModuleType>(\n moduleName: TModule,\n operation: OperationByModule<TModule>\n ): ArkosRouteHookHooks & {\n prismaArgs?: Record<string, any>;\n routeConfig: Omit<ArkosRouteConfig, \"path\">;\n } {\n const {\n before = [],\n after = [],\n onError = [],\n } = this.getHooks(moduleName, operation) || {};\n const prismaArgs = this.getPrismaArgs(moduleName, operation);\n const routeConfig = this.getRouteConfig(moduleName, operation) ?? {};\n return { before, after, onError, prismaArgs, routeConfig };\n }\n}\n\nexport const routeHookReader = new ArkosRouteHookReader();\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/components/arkos-route-hook/types.ts"],"names":[],"mappings":"","sourcesContent":["import { ArkosRouteConfig } from \"../../exports\";\nimport { ArkosPrismaService } from \"../../exports/services\";\nimport { PrismaModels } from \"../../generated\";\nimport { ArkosRequestHandler } from \"../../types\";\n\nexport type Models = keyof PrismaModels<any>;\n\nexport interface ArkosRouteHookHooks {\n before?: ArkosRequestHandler[];\n after?: ArkosRequestHandler[];\n onError?:
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/components/arkos-route-hook/types.ts"],"names":[],"mappings":"","sourcesContent":["import { ArkosRouteConfig } from \"../../exports\";\nimport { ArkosPrismaService } from \"../../exports/services\";\nimport { PrismaModels } from \"../../generated\";\nimport { ArkosErrorRequestHandler, ArkosRequestHandler } from \"../../types\";\n\nexport type Models = keyof PrismaModels<any>;\n\nexport interface ArkosRouteHookHooks {\n before?: ArkosRequestHandler[] | ArkosRequestHandler;\n after?: ArkosRequestHandler[] | ArkosRequestHandler;\n onError?: ArkosErrorRequestHandler[] | ArkosErrorRequestHandler;\n}\n\n/**\n * Extracts the correct Prisma args type for a given model and operation.\n * Falls back to `Record<string, any>` if the model or operation is not found.\n */\ntype PrismaQueryFor<\n TModel extends string,\n TOp extends string,\n> = TModel extends keyof PrismaModels<any>\n ? TOp extends keyof PrismaModels<any>[TModel]\n ? Partial<PrismaModels<any>[TModel][TOp]>\n : Record<string, any>\n : Record<string, any>;\n\n/**\n * Full config for an interceptor method — inherits all ArkosRouteConfig options\n * (validation, auth, rate limiting, etc.) minus `path`, plus lifecycle hooks,\n * plus `prismaArgs` typed to the specific model and operation's Prisma args.\n */\nexport type ArkosRouteHookMethodConfig<\n TModel extends string = string,\n TOp extends string = string,\n> = Omit<ArkosRouteConfig, \"path\"> &\n ArkosRouteHookHooks & {\n /**\n * Prisma options merged into this operation's query.\n * Typed against the model's actual Prisma args for this operation.\n */\n prismaArgs?: PrismaQueryFor<TModel, TOp>;\n };\n\n/**\n * Union of all valid module name types for ArkosRouteHook.\n * `string & {}` preserves autocomplete for \"auth\" and \"file-upload\"\n * while still accepting arbitrary model names.\n */\nexport type ArkosModuleType = \"auth\" | \"file-upload\" | Models;\n\n/**\n * Route hook instance for standard CRUD model routes.\n * Each method's `prismaQuery` is typed against the model's actual Prisma args.\n */\nexport interface ArkosRouteHookInstance<TModel extends Models> {\n readonly __type: \"ArkosRouteHook\";\n readonly moduleName: TModel;\n readonly _configs: {\n readonly service?: ArkosPrismaService;\n }\n\n createOne(config: ArkosRouteHookMethodConfig<TModel, \"CreateArgs\">): this;\n findOne(config: ArkosRouteHookMethodConfig<TModel, \"FindFirstArgs\">): this;\n findMany(config: ArkosRouteHookMethodConfig<TModel, \"FindManyArgs\">): this;\n updateOne(config: ArkosRouteHookMethodConfig<TModel, \"UpdateArgs\">): this;\n deleteOne(config: ArkosRouteHookMethodConfig<TModel, \"DeleteArgs\">): this;\n createMany(\n config: ArkosRouteHookMethodConfig<TModel, \"CreateManyArgs\">\n ): this;\n updateMany(\n config: ArkosRouteHookMethodConfig<TModel, \"UpdateManyArgs\">\n ): this;\n deleteMany(\n config: ArkosRouteHookMethodConfig<TModel, \"DeleteManyArgs\">\n ): this;\n}\n\n/**\n * Route hook instance for the built-in auth module.\n * Only exposes methods relevant to auth routes.\n */\nexport interface ArkosAuthRouteHookInstance {\n readonly __type: \"ArkosRouteHook\";\n readonly moduleName: \"auth\";\n\n getMe(config: ArkosRouteHookMethodConfig): this;\n login(config: ArkosRouteHookMethodConfig): this;\n logout(config: ArkosRouteHookMethodConfig): this;\n signup(config: ArkosRouteHookMethodConfig): this;\n updateMe(config: ArkosRouteHookMethodConfig): this;\n deleteMe(config: ArkosRouteHookMethodConfig): this;\n updatePassword(config: ArkosRouteHookMethodConfig): this;\n findOneAuthAction(config: ArkosRouteHookMethodConfig): this;\n findManyAuthAction(config: ArkosRouteHookMethodConfig): this;\n}\n\n/**\n * Route hook instance for the built-in file-upload module.\n * Only exposes methods relevant to file routes.\n */\nexport interface ArkosFileUploadRouteHookInstance {\n readonly __type: \"ArkosRouteHook\";\n readonly moduleName: \"file-upload\";\n\n findFile(config: Omit<ArkosRouteHookMethodConfig, \"after\">): this;\n uploadFile(config: ArkosRouteHookMethodConfig): this;\n updateFile(config: ArkosRouteHookMethodConfig): this;\n deleteFile(config: ArkosRouteHookMethodConfig): this;\n}\n\n/**\n * Maps the module type string to its corresponding interceptor instance type.\n * Enables ArkosRouteHook() to return a narrowed type based on the argument.\n */\nexport type ArkosRouteHookReturn<T extends ArkosModuleType> = T extends \"auth\"\n ? ArkosAuthRouteHookInstance\n : T extends \"file-upload\"\n ? ArkosFileUploadRouteHookInstance\n : ArkosRouteHookInstance<T>;\n"]}
|
|
@@ -2,7 +2,7 @@ import { BaseController } from "./../modules/base/base.controller.js";
|
|
|
2
2
|
import { getArkosConfig } from "../server.js";
|
|
3
3
|
import ArkosRouter from "../utils/arkos-router/index.js";
|
|
4
4
|
import { loadEnvironmentVariables } from "../utils/dotenv.helpers.js";
|
|
5
|
-
import
|
|
5
|
+
import arkos from "../app.js";
|
|
6
6
|
import { ArkosRouteHook } from "../components/arkos-route-hook/index.js";
|
|
7
7
|
import { ArkosPolicy } from "../components/arkos-policy/index.js";
|
|
8
8
|
import { isProduction } from "../utils/helpers/arkos-config.helpers.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/exports/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/exports/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAUhD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAIzD,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAErE,OAAO,EAOL,cAAc,EAEd,wBAAwB,EACxB,cAAc,EACd,cAAc,EACd,WAAW,EAGX,WAAW,EAGX,YAAY,GACb,CAAC;AAEF,eAAe,KAAK,CAAC","sourcesContent":["import { BaseController } from \"./../modules/base/base.controller\";\nimport { getArkosConfig } from \"../server\";\nimport ArkosRouter from \"../utils/arkos-router\";\nimport { IArkosRouter } from \"../utils/arkos-router/types\";\nimport { ArkosRouteConfig } from \"../utils/arkos-router/types\";\nimport {\n ArkosRequest,\n ArkosResponse,\n ArkosNextFunction,\n ArkosRequestHandler,\n} from \"../types\";\nimport { ArkosConfig } from \"../types/new-arkos-config\";\nimport { loadEnvironmentVariables } from \"../utils/dotenv.helpers\";\nimport arkos from \"../app\";\nimport { ArkosRouteHook } from \"../components/arkos-route-hook\";\nimport { ArkosRouteHookInstance } from \"../components/arkos-route-hook/types\";\nimport { ArkosPolicy } from \"../components/arkos-policy\";\nimport { IArkosPolicy } from \"../components/arkos-policy/types\";\nimport type { ArkosLoadable } from \"../types/arkos\";\nimport { ArkosFile } from \"../types/upload\";\nimport { isProduction } from \"../utils/helpers/arkos-config.helpers\";\n\nexport {\n ArkosLoadable,\n ArkosRequest,\n ArkosResponse,\n ArkosNextFunction,\n ArkosRequestHandler,\n IArkosRouter,\n BaseController,\n ArkosConfig,\n loadEnvironmentVariables,\n getArkosConfig,\n ArkosRouteHook,\n ArkosRouter,\n ArkosRouteConfig,\n ArkosRouteHookInstance,\n ArkosPolicy,\n IArkosPolicy,\n ArkosFile,\n isProduction,\n};\n\nexport default arkos;\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { addPrismaQueryOptionsToRequest,
|
|
1
|
+
export { addPrismaQueryOptionsToRequest, } from "../../modules/base/base.middlewares.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/middlewares/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/middlewares/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,GAC/B,MAAM,qCAAqC,CAAC","sourcesContent":["export {\n addPrismaQueryOptionsToRequest,\n} from \"../../modules/base/base.middlewares\";\n"]}
|