@rivetkit/engine-test-runner 2.3.0-rc.6 → 2.3.0-rc.7
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/.turbo/turbo-build.log +5 -5
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/log.ts +1 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @rivetkit/engine-test-runner@2.3.0-rc.
|
|
2
|
+
> @rivetkit/engine-test-runner@2.3.0-rc.7 build /home/runner/work/rivet/rivet/engine/sdks/typescript/test-runner
|
|
3
3
|
> tsup src/index.ts
|
|
4
4
|
|
|
5
5
|
[34mCLI[39m Building entry: src/index.ts
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
[34mCLI[39m Target: node16
|
|
10
10
|
[34mCLI[39m Cleaning output folder
|
|
11
11
|
[34mESM[39m Build start
|
|
12
|
-
[32mESM[39m [1mdist/index.js [22m[32m10.
|
|
13
|
-
[32mESM[39m [1mdist/index.js.map [22m[
|
|
14
|
-
[32mESM[39m ⚡️ Build success in
|
|
12
|
+
[32mESM[39m [1mdist/index.js [22m[32m10.73 KB[39m
|
|
13
|
+
[32mESM[39m [1mdist/index.js.map [22m[32m21.00 KB[39m
|
|
14
|
+
[32mESM[39m ⚡️ Build success in 9ms
|
|
15
15
|
[34mDTS[39m Build start
|
|
16
|
-
[32mDTS[39m ⚡️ Build success in
|
|
16
|
+
[32mDTS[39m ⚡️ Build success in 862ms
|
|
17
17
|
[32mDTS[39m [1mdist/index.d.ts [22m[32m175.00 B[39m
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/log.ts"],"sourcesContent":["import { serve } from \"@hono/node-server\";\nimport type { ActorConfig, RunnerConfig } from \"@rivetkit/engine-runner\";\nimport { Runner } from \"@rivetkit/engine-runner\";\nimport { Hono, type Context as HonoContext, type Next } from \"hono\";\nimport { streamSSE } from \"hono/streaming\";\nimport type { Logger } from \"pino\";\nimport type WebSocket from \"ws\";\nimport { getLogger } from \"./log\";\n\nconst INTERNAL_SERVER_PORT = process.env.INTERNAL_SERVER_PORT\n\t? Number(process.env.INTERNAL_SERVER_PORT)\n\t: 5051;\nconst RIVET_NAMESPACE = process.env.RIVET_NAMESPACE ?? \"default\";\nconst RIVET_RUNNER_NAME = process.env.RIVET_RUNNER_NAME ?? \"test-runner\";\nconst RIVET_RUNNER_VERSION = process.env.RIVET_RUNNER_VERSION\n\t? Number(process.env.RIVET_RUNNER_VERSION)\n\t: 1;\nconst RIVET_RUNNER_TOTAL_SLOTS = parseInt(process.env.RIVET_RUNNER_TOTAL_SLOTS ?? \"1\");\nconst RIVET_ENDPOINT = process.env.RIVET_ENDPOINT ?? \"http://127.0.0.1:6420\";\nconst RIVET_TOKEN = process.env.RIVET_TOKEN ?? \"dev\";\nconst AUTOSTART_SERVER = (process.env.AUTOSTART_SERVER ?? \"1\") == \"1\";\nconst AUTOSTART_RUNNER = (process.env.AUTOSTART_RUNNER ?? \"0\") == \"1\";\nconst AUTOCONFIGURE_SERVERLESS = (process.env.AUTOCONFIGURE_SERVERLESS ?? \"1\") == \"1\";\n\nconst runnerStarted = Promise.withResolvers<Runner>();\nconst runnerStopped = Promise.withResolvers<Runner>();\nlet runner: Runner | null = null;\nconst websocketLastMsgIndexes: Map<string, number> = new Map();\n\n// Create internal server\nconst app = new Hono();\n\nfunction loggerMiddleware(logger: Logger) {\n\treturn async (c: HonoContext, next: Next) => {\n\t\tconst method = c.req.method;\n\t\tconst path = c.req.path;\n\t\tconst startTime = Date.now();\n\n\t\tawait next();\n\n\t\tconst duration = Date.now() - startTime;\n\t\tlogger.debug({\n\t\t\tmsg: \"http request\",\n\t\t\tmethod,\n\t\t\tpath,\n\t\t\tstatus: c.res.status,\n\t\t\tdt: `${duration}ms`,\n\t\t\treqSize: c.req.header(\"content-length\"),\n\t\t\tresSize: c.res.headers.get(\"content-length\"),\n\t\t\tuserAgent: c.req.header(\"user-agent\"),\n\t\t});\n\t};\n}\napp.use(\"*\", loggerMiddleware(getLogger()));\n\napp.get(\"/wait-ready\", async (c) => {\n\tconst runner = await runnerStarted.promise;\n\treturn c.json(runner.runnerId);\n});\n\napp.get(\"/has-actor\", async (c) => {\n\tconst actorIdQuery = c.req.query(\"actor\");\n\tconst generationQuery = c.req.query(\"generation\");\n\tconst generation = generationQuery ? Number(generationQuery) : undefined;\n\n\tif (!actorIdQuery || !runner?.hasActor(actorIdQuery, generation)) {\n\t\treturn c.text(\"\", 404);\n\t}\n\treturn c.text(\"ok\");\n});\n\napp.get(\"/health\", (c) => {\n\treturn c.text(\"ok\");\n});\n\napp.get(\"/shutdown\", async (c) => {\n\tawait runner?.shutdown(true);\n\treturn c.text(\"ok\");\n});\n\napp.get(\"/api/rivet/start\", async (c) => {\n\treturn streamSSE(c, async (stream) => {\n\t\tconst runnerStarted = Promise.withResolvers<Runner>();\n\t\tconst runnerStopped = Promise.withResolvers<Runner>();\n\t\tconst runner = await startRunner(runnerStarted, runnerStopped);\n\n\t\tc.req.raw.signal.addEventListener(\"abort\", () => {\n\t\t\tgetLogger().debug(\"SSE aborted, shutting down runner\");\n\t\t\trunner!.shutdown(true);\n\t\t});\n\n\t\tawait runnerStarted.promise;\n\n\t\tstream.writeSSE({ data: runner.getServerlessInitPacket()! });\n\n\t\tawait runnerStopped.promise;\n\t});\n});\n\napp.get(\"/api/rivet/metadata\", async (c) => {\n\treturn c.json({\n\t\t// Not actually rivetkit\n\t\truntime: \"rivetkit\",\n\t\tversion: \"1\",\n\t});\n});\n\nif (AUTOSTART_SERVER) {\n\tserve({\n\t\tfetch: app.fetch,\n\t\tport: INTERNAL_SERVER_PORT,\n\t});\n\tgetLogger().info(\n\t\t`Internal HTTP server listening on port ${INTERNAL_SERVER_PORT}`,\n\t);\n}\n\nif (AUTOSTART_RUNNER) {\n\trunner = await startRunner(runnerStarted, runnerStopped);\n} else if (AUTOCONFIGURE_SERVERLESS) {\n\tawait autoConfigureServerless();\n}\n\nprocess.on(\"SIGTERM\", async () => {\n\tgetLogger().debug(\"received SIGTERM, force exiting in 3s\");\n\n\tawait new Promise(res => setTimeout(res, 3000));\n\n\tprocess.exit(0);\n});\nprocess.on(\"SIGINT\", async () => {\n\tgetLogger().debug(\"received SIGTERM, force exiting in 3s\");\n\n\tawait new Promise(res => setTimeout(res, 3000));\n\n\tprocess.exit(0);\n});\n\nasync function autoConfigureServerless() {\n\tgetLogger().info(\"Configuring serverless\");\n\n\tconst res = await fetch(\n\t\t`${RIVET_ENDPOINT}/runner-configs/${RIVET_RUNNER_NAME}?namespace=${RIVET_NAMESPACE}`,\n\t\t{\n\t\t\tmethod: \"PUT\",\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${RIVET_TOKEN}`,\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tdatacenters: {\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tserverless: {\n\t\t\t\t\t\t\turl: `http://localhost:${INTERNAL_SERVER_PORT}/api/rivet`,\n\t\t\t\t\t\t\tmax_runners: 10000,\n\t\t\t\t\t\t\tslots_per_runner: 1,\n\t\t\t\t\t\t\trequest_lifespan: 300,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t},\n\t);\n\n\tif (!res.ok) {\n\t\tthrow new Error(\n\t\t\t`request failed: ${res.statusText} (${res.status}):\\n${await res.text()}`,\n\t\t);\n\t}\n}\n\nasync function startRunner(\n\trunnerStarted: PromiseWithResolvers<Runner>,\n\trunnerStopped: PromiseWithResolvers<Runner>,\n): Promise<Runner> {\n\tgetLogger().info(\"Starting runner\");\n\tlet runner: Runner;\n\tconst config: RunnerConfig = {\n\t\tlogger: getLogger(),\n\t\tversion: RIVET_RUNNER_VERSION,\n\t\tendpoint: RIVET_ENDPOINT,\n\t\ttoken: RIVET_TOKEN,\n\t\tnamespace: RIVET_NAMESPACE,\n\t\trunnerName: RIVET_RUNNER_NAME,\n\t\ttotalSlots: RIVET_RUNNER_TOTAL_SLOTS,\n\t\tprepopulateActorNames: {},\n\t\tonConnected: () => {\n\t\t\trunnerStarted.resolve(runner);\n\t\t},\n\t\tonDisconnected: () => { },\n\t\tonShutdown: () => {\n\t\t\trunnerStopped.resolve(runner);\n\t\t},\n\t\tfetch: async (\n\t\t\trunner: Runner,\n\t\t\tactorId: string,\n\t\t\t_gatewayId: ArrayBuffer,\n\t\t\t_requestId: ArrayBuffer,\n\t\t\trequest: Request,\n\t\t) => {\n\t\t\tgetLogger().info(\n\t\t\t\t`Fetch called for actor ${actorId}, URL: ${request.url}`,\n\t\t\t);\n\t\t\tconst url = new URL(request.url);\n\t\t\tif (url.pathname === \"/ping\") {\n\t\t\t\t// Return the actor ID in response\n\t\t\t\tconst responseData = {\n\t\t\t\t\tactorId,\n\t\t\t\t\tstatus: \"ok\",\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t};\n\n\t\t\t\treturn new Response(JSON.stringify(responseData), {\n\t\t\t\t\tstatus: 200,\n\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t});\n\t\t\t} else if (url.pathname === \"/sleep\") {\n\t\t\t\trunner.sleepActor(actorId);\n\n\t\t\t\treturn new Response(\"ok\", {\n\t\t\t\t\tstatus: 200,\n\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn new Response(\"ok\", { status: 200 });\n\t\t},\n\t\tonActorStart: async (\n\t\t\t_actorId: string,\n\t\t\t_generation: number,\n\t\t\t_config: ActorConfig,\n\t\t) => {\n\t\t\tgetLogger().info(\n\t\t\t\t`Actor ${_actorId} started (generation ${_generation})`,\n\t\t\t);\n\t\t},\n\t\tonActorStop: async (_actorId: string, _generation: number) => {\n\t\t\tgetLogger().info(\n\t\t\t\t`Actor ${_actorId} stopped (generation ${_generation})`,\n\t\t\t);\n\t\t},\n\t\twebsocket: async (\n\t\t\trunner: Runner,\n\t\t\tactorId: string,\n\t\t\tws: WebSocket,\n\t\t\t_gatewayId: ArrayBuffer,\n\t\t\t_requestId: ArrayBuffer,\n\t\t\t_request: Request,\n\t\t) => {\n\t\t\tgetLogger().info(`WebSocket connected for actor ${actorId}`);\n\n\t\t\t// Echo server - send back any messages received\n\t\t\tws.addEventListener(\"message\", (event) => {\n\t\t\t\tconst data = event.data;\n\t\t\t\tgetLogger().info({\n\t\t\t\t\tmsg: `WebSocket message from actor ${actorId}`,\n\t\t\t\t\tdata,\n\t\t\t\t\tindex: (event as any).rivetMessageIndex,\n\t\t\t\t});\n\n\t\t\t\tws.send(`Echo: ${data}`);\n\n\t\t\t\t// Ack\n\t\t\t\tconst websocketId = Buffer.from(\n\t\t\t\t\t(event as any).rivetRequestId,\n\t\t\t\t).toString(\"base64\");\n\t\t\t\twebsocketLastMsgIndexes.set(\n\t\t\t\t\twebsocketId,\n\t\t\t\t\t(event as any).rivetMessageIndex,\n\t\t\t\t);\n\t\t\t\trunner.sendHibernatableWebSocketMessageAck(\n\t\t\t\t\t(event as any).rivetGatewayId,\n\t\t\t\t\t(event as any).rivetRequestId,\n\t\t\t\t\t(event as any).rivetMessageIndex,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tws.addEventListener(\"close\", () => {\n\t\t\t\tgetLogger().info(`WebSocket closed for actor ${actorId}`);\n\t\t\t});\n\n\t\t\tws.addEventListener(\"error\", (error) => {\n\t\t\t\tgetLogger().error({\n\t\t\t\t\tmsg: `WebSocket error for actor ${actorId}:`,\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\thibernatableWebSocket: {\n\t\t\tcanHibernate() {\n\t\t\t\treturn true;\n\t\t\t},\n\t\t},\n\t};\n\n\trunner = new Runner(config);\n\n\t// Start runner\n\tawait runner.start();\n\n\t// Wait for runner to be ready\n\tgetLogger().info(\"Waiting runner start...\");\n\tawait runnerStarted.promise;\n\n\tgetLogger().info(\"Runner started\");\n\n\treturn runner;\n}\n\nexport default app;\n","import { inspect } from \"node:util\";\nimport {\n\ttype Level,\n\ttype LevelWithSilent,\n\ttype Logger,\n\tpino,\n\tstdTimeFunctions,\n} from \"pino\";\n\nexport type { Logger } from \"pino\";\n\nlet baseLogger: Logger | undefined;\n\n/** Cache of child loggers by logger name. */\nconst loggerCache = new Map<string, Logger>();\n\nexport function getPinoLevel(): LevelWithSilent {\n\t// Priority: env > default\n\treturn (process.env[\"LOG_LEVEL\"] || \"warn\")\n\t\t.toString()\n\t\t.toLowerCase() as LevelWithSilent;\n}\n\nexport function getIncludeTarget(): boolean {\n\treturn process.env[\"LOG_TARGET\"] === \"1\";\n}\n\n/**\n * Configure a custom base logger.\n */\nexport function configureBaseLogger(logger: Logger): void {\n\tbaseLogger = logger;\n\tloggerCache.clear();\n}\n\n// TODO: This can be simplified in logfmt.ts\nfunction customWrite(level: string, o: any) {\n\tconst entries: any = {};\n\n\t// Add timestamp if enabled\n\tif (process.env[\"LOG_TIMESTAMP\"] === \"1\" && o.time) {\n\t\tconst date = typeof o.time === \"number\" ? new Date(o.time) : new Date();\n\t\tentries.ts = date;\n\t}\n\n\t// Add level\n\tentries.level = level.toUpperCase();\n\n\t// Add target if present\n\tif (o.target) {\n\t\tentries.target = o.target;\n\t}\n\n\t// Add message\n\tif (o.msg) {\n\t\tentries.msg = o.msg;\n\t}\n\n\t// Add other properties\n\tfor (const [key, value] of Object.entries(o)) {\n\t\tif (\n\t\t\tkey !== \"time\" &&\n\t\t\tkey !== \"level\" &&\n\t\t\tkey !== \"target\" &&\n\t\t\tkey !== \"msg\" &&\n\t\t\tkey !== \"pid\" &&\n\t\t\tkey !== \"hostname\"\n\t\t) {\n\t\t\tentries[key] = value;\n\t\t}\n\t}\n\n\tconst output = inspect(entries, {\n\t\tcompact: true,\n\t\tbreakLength: Infinity,\n\t\tcolors: true,\n\t});\n\tconsole.log(output);\n}\n\n/**\n * Configure the default logger with optional log level.\n */\nexport async function configureDefaultLogger(): Promise<void> {\n\tbaseLogger = pino({\n\t\tlevel: getPinoLevel(),\n\t\tmessageKey: \"msg\",\n\t\t// Do not include pid/hostname in output\n\t\tbase: {},\n\t\t// Keep a string level in the output\n\t\tformatters: {\n\t\t\tlevel(_label: string, number: number) {\n\t\t\t\treturn { level: number };\n\t\t\t},\n\t\t},\n\t\ttimestamp:\n\t\t\tprocess.env[\"LOG_TIMESTAMP\"] === \"1\"\n\t\t\t\t? stdTimeFunctions.epochTime\n\t\t\t\t: false,\n\t\tbrowser: {\n\t\t\twrite: {\n\t\t\t\tfatal: customWrite.bind(null, \"fatal\"),\n\t\t\t\terror: customWrite.bind(null, \"error\"),\n\t\t\t\twarn: customWrite.bind(null, \"warn\"),\n\t\t\t\tinfo: customWrite.bind(null, \"info\"),\n\t\t\t\tdebug: customWrite.bind(null, \"debug\"),\n\t\t\t\ttrace: customWrite.bind(null, \"trace\"),\n\t\t\t},\n\t\t},\n\t\thooks: {\n\t\t\tlogMethod(inputArgs, _method, level) {\n\t\t\t\t// TODO: This is a hack to not implement our own transport target. We can get better perf if we have our own transport target.\n\n\t\t\t\tconst levelMap: Record<number, string> = {\n\t\t\t\t\t10: \"trace\",\n\t\t\t\t\t20: \"debug\",\n\t\t\t\t\t30: \"info\",\n\t\t\t\t\t40: \"warn\",\n\t\t\t\t\t50: \"error\",\n\t\t\t\t\t60: \"fatal\",\n\t\t\t\t};\n\t\t\t\tconst levelName = levelMap[level] || \"info\";\n\t\t\t\tconst time =\n\t\t\t\t\tprocess.env[\"LOG_TIMESTAMP\"] === \"1\"\n\t\t\t\t\t\t? Date.now()\n\t\t\t\t\t\t: undefined;\n\t\t\t\t// TODO: This can be simplified in logfmt.ts\n\t\t\t\tif (inputArgs.length >= 2) {\n\t\t\t\t\tconst [objOrMsg, msg] = inputArgs;\n\t\t\t\t\tif (typeof objOrMsg === \"object\" && objOrMsg !== null) {\n\t\t\t\t\t\tcustomWrite(levelName, { ...objOrMsg, msg, time });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcustomWrite(levelName, { msg: String(objOrMsg), time });\n\t\t\t\t\t}\n\t\t\t\t} else if (inputArgs.length === 1) {\n\t\t\t\t\tconst [objOrMsg] = inputArgs;\n\t\t\t\t\tif (typeof objOrMsg === \"object\" && objOrMsg !== null) {\n\t\t\t\t\t\tcustomWrite(levelName, { ...objOrMsg, time });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcustomWrite(levelName, { msg: String(objOrMsg), time });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t});\n\n\tloggerCache.clear();\n}\n\n/**\n * Get or initialize the base logger.\n */\nexport function getBaseLogger(): Logger {\n\tif (!baseLogger) {\n\t\tconfigureDefaultLogger();\n\t}\n\treturn baseLogger!;\n}\n\n/**\n * Returns a child logger with `target` bound for the given name.\n */\nexport function getLogger(name = \"default\"): Logger {\n\t// Check cache first\n\tconst cached = loggerCache.get(name);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\t// Create\n\tconst base = getBaseLogger();\n\n\t// Add target to log if enabled\n\tconst child = getIncludeTarget() ? base.child({ target: name }) : base;\n\n\t// Cache the logger\n\tloggerCache.set(name, child);\n\n\treturn child;\n}\n"],"mappings":"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","names":["runner","runnerStarted","runnerStopped"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/log.ts"],"sourcesContent":["import { serve } from \"@hono/node-server\";\nimport type { ActorConfig, RunnerConfig } from \"@rivetkit/engine-runner\";\nimport { Runner } from \"@rivetkit/engine-runner\";\nimport { Hono, type Context as HonoContext, type Next } from \"hono\";\nimport { streamSSE } from \"hono/streaming\";\nimport type { Logger } from \"pino\";\nimport type WebSocket from \"ws\";\nimport { getLogger } from \"./log\";\n\nconst INTERNAL_SERVER_PORT = process.env.INTERNAL_SERVER_PORT\n\t? Number(process.env.INTERNAL_SERVER_PORT)\n\t: 5051;\nconst RIVET_NAMESPACE = process.env.RIVET_NAMESPACE ?? \"default\";\nconst RIVET_RUNNER_NAME = process.env.RIVET_RUNNER_NAME ?? \"test-runner\";\nconst RIVET_RUNNER_VERSION = process.env.RIVET_RUNNER_VERSION\n\t? Number(process.env.RIVET_RUNNER_VERSION)\n\t: 1;\nconst RIVET_RUNNER_TOTAL_SLOTS = parseInt(process.env.RIVET_RUNNER_TOTAL_SLOTS ?? \"1\");\nconst RIVET_ENDPOINT = process.env.RIVET_ENDPOINT ?? \"http://127.0.0.1:6420\";\nconst RIVET_TOKEN = process.env.RIVET_TOKEN ?? \"dev\";\nconst AUTOSTART_SERVER = (process.env.AUTOSTART_SERVER ?? \"1\") == \"1\";\nconst AUTOSTART_RUNNER = (process.env.AUTOSTART_RUNNER ?? \"0\") == \"1\";\nconst AUTOCONFIGURE_SERVERLESS = (process.env.AUTOCONFIGURE_SERVERLESS ?? \"1\") == \"1\";\n\nconst runnerStarted = Promise.withResolvers<Runner>();\nconst runnerStopped = Promise.withResolvers<Runner>();\nlet runner: Runner | null = null;\nconst websocketLastMsgIndexes: Map<string, number> = new Map();\n\n// Create internal server\nconst app = new Hono();\n\nfunction loggerMiddleware(logger: Logger) {\n\treturn async (c: HonoContext, next: Next) => {\n\t\tconst method = c.req.method;\n\t\tconst path = c.req.path;\n\t\tconst startTime = Date.now();\n\n\t\tawait next();\n\n\t\tconst duration = Date.now() - startTime;\n\t\tlogger.debug({\n\t\t\tmsg: \"http request\",\n\t\t\tmethod,\n\t\t\tpath,\n\t\t\tstatus: c.res.status,\n\t\t\tdt: `${duration}ms`,\n\t\t\treqSize: c.req.header(\"content-length\"),\n\t\t\tresSize: c.res.headers.get(\"content-length\"),\n\t\t\tuserAgent: c.req.header(\"user-agent\"),\n\t\t});\n\t};\n}\napp.use(\"*\", loggerMiddleware(getLogger()));\n\napp.get(\"/wait-ready\", async (c) => {\n\tconst runner = await runnerStarted.promise;\n\treturn c.json(runner.runnerId);\n});\n\napp.get(\"/has-actor\", async (c) => {\n\tconst actorIdQuery = c.req.query(\"actor\");\n\tconst generationQuery = c.req.query(\"generation\");\n\tconst generation = generationQuery ? Number(generationQuery) : undefined;\n\n\tif (!actorIdQuery || !runner?.hasActor(actorIdQuery, generation)) {\n\t\treturn c.text(\"\", 404);\n\t}\n\treturn c.text(\"ok\");\n});\n\napp.get(\"/health\", (c) => {\n\treturn c.text(\"ok\");\n});\n\napp.get(\"/shutdown\", async (c) => {\n\tawait runner?.shutdown(true);\n\treturn c.text(\"ok\");\n});\n\napp.get(\"/api/rivet/start\", async (c) => {\n\treturn streamSSE(c, async (stream) => {\n\t\tconst runnerStarted = Promise.withResolvers<Runner>();\n\t\tconst runnerStopped = Promise.withResolvers<Runner>();\n\t\tconst runner = await startRunner(runnerStarted, runnerStopped);\n\n\t\tc.req.raw.signal.addEventListener(\"abort\", () => {\n\t\t\tgetLogger().debug(\"SSE aborted, shutting down runner\");\n\t\t\trunner!.shutdown(true);\n\t\t});\n\n\t\tawait runnerStarted.promise;\n\n\t\tstream.writeSSE({ data: runner.getServerlessInitPacket()! });\n\n\t\tawait runnerStopped.promise;\n\t});\n});\n\napp.get(\"/api/rivet/metadata\", async (c) => {\n\treturn c.json({\n\t\t// Not actually rivetkit\n\t\truntime: \"rivetkit\",\n\t\tversion: \"1\",\n\t});\n});\n\nif (AUTOSTART_SERVER) {\n\tserve({\n\t\tfetch: app.fetch,\n\t\tport: INTERNAL_SERVER_PORT,\n\t});\n\tgetLogger().info(\n\t\t`Internal HTTP server listening on port ${INTERNAL_SERVER_PORT}`,\n\t);\n}\n\nif (AUTOSTART_RUNNER) {\n\trunner = await startRunner(runnerStarted, runnerStopped);\n} else if (AUTOCONFIGURE_SERVERLESS) {\n\tawait autoConfigureServerless();\n}\n\nprocess.on(\"SIGTERM\", async () => {\n\tgetLogger().debug(\"received SIGTERM, force exiting in 3s\");\n\n\tawait new Promise(res => setTimeout(res, 3000));\n\n\tprocess.exit(0);\n});\nprocess.on(\"SIGINT\", async () => {\n\tgetLogger().debug(\"received SIGTERM, force exiting in 3s\");\n\n\tawait new Promise(res => setTimeout(res, 3000));\n\n\tprocess.exit(0);\n});\n\nasync function autoConfigureServerless() {\n\tgetLogger().info(\"Configuring serverless\");\n\n\tconst res = await fetch(\n\t\t`${RIVET_ENDPOINT}/runner-configs/${RIVET_RUNNER_NAME}?namespace=${RIVET_NAMESPACE}`,\n\t\t{\n\t\t\tmethod: \"PUT\",\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${RIVET_TOKEN}`,\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tdatacenters: {\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tserverless: {\n\t\t\t\t\t\t\turl: `http://localhost:${INTERNAL_SERVER_PORT}/api/rivet`,\n\t\t\t\t\t\t\tmax_runners: 10000,\n\t\t\t\t\t\t\tslots_per_runner: 1,\n\t\t\t\t\t\t\trequest_lifespan: 300,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t},\n\t);\n\n\tif (!res.ok) {\n\t\tthrow new Error(\n\t\t\t`request failed: ${res.statusText} (${res.status}):\\n${await res.text()}`,\n\t\t);\n\t}\n}\n\nasync function startRunner(\n\trunnerStarted: PromiseWithResolvers<Runner>,\n\trunnerStopped: PromiseWithResolvers<Runner>,\n): Promise<Runner> {\n\tgetLogger().info(\"Starting runner\");\n\tlet runner: Runner;\n\tconst config: RunnerConfig = {\n\t\tlogger: getLogger(),\n\t\tversion: RIVET_RUNNER_VERSION,\n\t\tendpoint: RIVET_ENDPOINT,\n\t\ttoken: RIVET_TOKEN,\n\t\tnamespace: RIVET_NAMESPACE,\n\t\trunnerName: RIVET_RUNNER_NAME,\n\t\ttotalSlots: RIVET_RUNNER_TOTAL_SLOTS,\n\t\tprepopulateActorNames: {},\n\t\tonConnected: () => {\n\t\t\trunnerStarted.resolve(runner);\n\t\t},\n\t\tonDisconnected: () => { },\n\t\tonShutdown: () => {\n\t\t\trunnerStopped.resolve(runner);\n\t\t},\n\t\tfetch: async (\n\t\t\trunner: Runner,\n\t\t\tactorId: string,\n\t\t\t_gatewayId: ArrayBuffer,\n\t\t\t_requestId: ArrayBuffer,\n\t\t\trequest: Request,\n\t\t) => {\n\t\t\tgetLogger().info(\n\t\t\t\t`Fetch called for actor ${actorId}, URL: ${request.url}`,\n\t\t\t);\n\t\t\tconst url = new URL(request.url);\n\t\t\tif (url.pathname === \"/ping\") {\n\t\t\t\t// Return the actor ID in response\n\t\t\t\tconst responseData = {\n\t\t\t\t\tactorId,\n\t\t\t\t\tstatus: \"ok\",\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t};\n\n\t\t\t\treturn new Response(JSON.stringify(responseData), {\n\t\t\t\t\tstatus: 200,\n\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t});\n\t\t\t} else if (url.pathname === \"/sleep\") {\n\t\t\t\trunner.sleepActor(actorId);\n\n\t\t\t\treturn new Response(\"ok\", {\n\t\t\t\t\tstatus: 200,\n\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn new Response(\"ok\", { status: 200 });\n\t\t},\n\t\tonActorStart: async (\n\t\t\t_actorId: string,\n\t\t\t_generation: number,\n\t\t\t_config: ActorConfig,\n\t\t) => {\n\t\t\tgetLogger().info(\n\t\t\t\t`Actor ${_actorId} started (generation ${_generation})`,\n\t\t\t);\n\t\t},\n\t\tonActorStop: async (_actorId: string, _generation: number) => {\n\t\t\tgetLogger().info(\n\t\t\t\t`Actor ${_actorId} stopped (generation ${_generation})`,\n\t\t\t);\n\t\t},\n\t\twebsocket: async (\n\t\t\trunner: Runner,\n\t\t\tactorId: string,\n\t\t\tws: WebSocket,\n\t\t\t_gatewayId: ArrayBuffer,\n\t\t\t_requestId: ArrayBuffer,\n\t\t\t_request: Request,\n\t\t) => {\n\t\t\tgetLogger().info(`WebSocket connected for actor ${actorId}`);\n\n\t\t\t// Echo server - send back any messages received\n\t\t\tws.addEventListener(\"message\", (event) => {\n\t\t\t\tconst data = event.data;\n\t\t\t\tgetLogger().info({\n\t\t\t\t\tmsg: `WebSocket message from actor ${actorId}`,\n\t\t\t\t\tdata,\n\t\t\t\t\tindex: (event as any).rivetMessageIndex,\n\t\t\t\t});\n\n\t\t\t\tws.send(`Echo: ${data}`);\n\n\t\t\t\t// Ack\n\t\t\t\tconst websocketId = Buffer.from(\n\t\t\t\t\t(event as any).rivetRequestId,\n\t\t\t\t).toString(\"base64\");\n\t\t\t\twebsocketLastMsgIndexes.set(\n\t\t\t\t\twebsocketId,\n\t\t\t\t\t(event as any).rivetMessageIndex,\n\t\t\t\t);\n\t\t\t\trunner.sendHibernatableWebSocketMessageAck(\n\t\t\t\t\t(event as any).rivetGatewayId,\n\t\t\t\t\t(event as any).rivetRequestId,\n\t\t\t\t\t(event as any).rivetMessageIndex,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tws.addEventListener(\"close\", () => {\n\t\t\t\tgetLogger().info(`WebSocket closed for actor ${actorId}`);\n\t\t\t});\n\n\t\t\tws.addEventListener(\"error\", (error) => {\n\t\t\t\tgetLogger().error({\n\t\t\t\t\tmsg: `WebSocket error for actor ${actorId}:`,\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\thibernatableWebSocket: {\n\t\t\tcanHibernate() {\n\t\t\t\treturn true;\n\t\t\t},\n\t\t},\n\t};\n\n\trunner = new Runner(config);\n\n\t// Start runner\n\tawait runner.start();\n\n\t// Wait for runner to be ready\n\tgetLogger().info(\"Waiting runner start...\");\n\tawait runnerStarted.promise;\n\n\tgetLogger().info(\"Runner started\");\n\n\treturn runner;\n}\n\nexport default app;\n","import { inspect } from \"node:util\";\nimport {\n\ttype Level,\n\ttype LevelWithSilent,\n\ttype Logger,\n\tpino,\n\tstdTimeFunctions,\n} from \"pino\";\n\nexport type { Logger } from \"pino\";\n\nlet baseLogger: Logger | undefined;\n\n/** Cache of child loggers by logger name. */\nconst loggerCache = new Map<string, Logger>();\n\nexport function getPinoLevel(): LevelWithSilent {\n\t// Priority: env > default\n\treturn (process.env[\"LOG_LEVEL\"] || \"warn\")\n\t\t.toString()\n\t\t.toLowerCase() as LevelWithSilent;\n}\n\nexport function getIncludeTarget(): boolean {\n\treturn process.env[\"LOG_TARGET\"] === \"1\";\n}\n\n/**\n * Configure a custom base logger.\n */\nexport function configureBaseLogger(logger: Logger): void {\n\tbaseLogger = logger;\n\tloggerCache.clear();\n}\n\n// TODO: This can be simplified in logfmt.ts\nfunction customWrite(level: string, o: any) {\n\tconst entries: any = {};\n\n\t// Add timestamp if enabled\n\tif (process.env[\"LOG_TIMESTAMP\"] === \"1\" && o.time) {\n\t\tconst date = typeof o.time === \"number\" ? new Date(o.time) : new Date();\n\t\tentries.ts = date;\n\t}\n\n\t// Add level\n\tentries.level = level.toUpperCase();\n\n\t// Add target if present\n\tif (o.target) {\n\t\tentries.target = o.target;\n\t}\n\n\t// Add message\n\tif (o.msg) {\n\t\tentries.msg = o.msg;\n\t}\n\n\t// Add other properties\n\tfor (const [key, value] of Object.entries(o)) {\n\t\tif (\n\t\t\tkey !== \"time\" &&\n\t\t\tkey !== \"level\" &&\n\t\t\tkey !== \"target\" &&\n\t\t\tkey !== \"msg\" &&\n\t\t\tkey !== \"pid\" &&\n\t\t\tkey !== \"hostname\"\n\t\t) {\n\t\t\tentries[key] = value;\n\t\t}\n\t}\n\n\tconst output = inspect(entries, {\n\t\tcompact: true,\n\t\tbreakLength: Infinity,\n\t\tcolors: true,\n\t});\n\tconsole.log(output);\n}\n\n/**\n * Configure the default logger with optional log level.\n */\nexport async function configureDefaultLogger(): Promise<void> {\n\tbaseLogger = pino({\n\t\tlevel: getPinoLevel(),\n\t\tmessageKey: \"msg\",\n\t\terrorKey: \"error\",\n\t\t// Do not include pid/hostname in output\n\t\tbase: {},\n\t\t// Keep a string level in the output\n\t\tformatters: {\n\t\t\tlevel(_label: string, number: number) {\n\t\t\t\treturn { level: number };\n\t\t\t},\n\t\t},\n\t\ttimestamp:\n\t\t\tprocess.env[\"LOG_TIMESTAMP\"] === \"1\"\n\t\t\t\t? stdTimeFunctions.epochTime\n\t\t\t\t: false,\n\t\tbrowser: {\n\t\t\twrite: {\n\t\t\t\tfatal: customWrite.bind(null, \"fatal\"),\n\t\t\t\terror: customWrite.bind(null, \"error\"),\n\t\t\t\twarn: customWrite.bind(null, \"warn\"),\n\t\t\t\tinfo: customWrite.bind(null, \"info\"),\n\t\t\t\tdebug: customWrite.bind(null, \"debug\"),\n\t\t\t\ttrace: customWrite.bind(null, \"trace\"),\n\t\t\t},\n\t\t},\n\t\thooks: {\n\t\t\tlogMethod(inputArgs, _method, level) {\n\t\t\t\t// TODO: This is a hack to not implement our own transport target. We can get better perf if we have our own transport target.\n\n\t\t\t\tconst levelMap: Record<number, string> = {\n\t\t\t\t\t10: \"trace\",\n\t\t\t\t\t20: \"debug\",\n\t\t\t\t\t30: \"info\",\n\t\t\t\t\t40: \"warn\",\n\t\t\t\t\t50: \"error\",\n\t\t\t\t\t60: \"fatal\",\n\t\t\t\t};\n\t\t\t\tconst levelName = levelMap[level] || \"info\";\n\t\t\t\tconst time =\n\t\t\t\t\tprocess.env[\"LOG_TIMESTAMP\"] === \"1\"\n\t\t\t\t\t\t? Date.now()\n\t\t\t\t\t\t: undefined;\n\t\t\t\t// TODO: This can be simplified in logfmt.ts\n\t\t\t\tif (inputArgs.length >= 2) {\n\t\t\t\t\tconst [objOrMsg, msg] = inputArgs;\n\t\t\t\t\tif (typeof objOrMsg === \"object\" && objOrMsg !== null) {\n\t\t\t\t\t\tcustomWrite(levelName, { ...objOrMsg, msg, time });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcustomWrite(levelName, { msg: String(objOrMsg), time });\n\t\t\t\t\t}\n\t\t\t\t} else if (inputArgs.length === 1) {\n\t\t\t\t\tconst [objOrMsg] = inputArgs;\n\t\t\t\t\tif (typeof objOrMsg === \"object\" && objOrMsg !== null) {\n\t\t\t\t\t\tcustomWrite(levelName, { ...objOrMsg, time });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcustomWrite(levelName, { msg: String(objOrMsg), time });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t});\n\n\tloggerCache.clear();\n}\n\n/**\n * Get or initialize the base logger.\n */\nexport function getBaseLogger(): Logger {\n\tif (!baseLogger) {\n\t\tconfigureDefaultLogger();\n\t}\n\treturn baseLogger!;\n}\n\n/**\n * Returns a child logger with `target` bound for the given name.\n */\nexport function getLogger(name = \"default\"): Logger {\n\t// Check cache first\n\tconst cached = loggerCache.get(name);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\t// Create\n\tconst base = getBaseLogger();\n\n\t// Add target to log if enabled\n\tconst child = getIncludeTarget() ? base.child({ target: name }) : base;\n\n\t// Cache the logger\n\tloggerCache.set(name, child);\n\n\treturn child;\n}\n"],"mappings":"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","names":["runner","runnerStarted","runnerStopped"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rivetkit/engine-test-runner",
|
|
3
|
-
"version": "2.3.0-rc.
|
|
3
|
+
"version": "2.3.0-rc.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"start": "tsx src/index.ts",
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
},
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@hono/node-server": "^1.19.1",
|
|
12
|
-
"@rivetkit/engine-runner": "2.3.0-rc.
|
|
13
|
-
"@rivetkit/engine-runner-protocol": "2.3.0-rc.
|
|
12
|
+
"@rivetkit/engine-runner": "2.3.0-rc.7",
|
|
13
|
+
"@rivetkit/engine-runner-protocol": "2.3.0-rc.7",
|
|
14
14
|
"hono": "^4.7.0",
|
|
15
15
|
"pino": "^9.9.5",
|
|
16
16
|
"ws": "^8.18.3"
|
package/src/log.ts
CHANGED