{"version":3,"file":"init-DodOibyO.mjs","names":["processLike"],"sources":["../src/channels/handler.ts","../src/tako/endpoints.ts","../src/tako/init.ts"],"sourcesContent":["import type { ChannelRegistry } from \"../channels\";\n\nexport interface WsFrame {\n  type: string;\n  data: unknown;\n}\n\nexport interface DispatchInput {\n  channel: string;\n  params?: Record<string, unknown>;\n  frame: WsFrame;\n  subject?: string;\n}\n\nexport type DispatchResult =\n  | { action: \"fanout\"; data: unknown }\n  | { action: \"drop\"; error?: string }\n  | { action: \"reject\"; reason: string };\n\nexport async function dispatchWsMessage(\n  registry: ChannelRegistry,\n  input: DispatchInput,\n): Promise<DispatchResult> {\n  const matched = registry.resolve(input.channel);\n  if (!matched) return { action: \"reject\", reason: \"channel_not_defined\" };\n\n  const definition = matched.definition;\n  if (definition.handler === undefined) {\n    return { action: \"reject\", reason: \"sse_channel_not_writable\" };\n  }\n\n  const fn = definition.handler[input.frame.type as keyof typeof definition.handler];\n  if (typeof fn !== \"function\") {\n    return { action: \"fanout\", data: input.frame.data };\n  }\n\n  try {\n    const result = await fn(input.frame.data as never, {\n      channel: input.channel,\n      operation: \"publish\",\n      params: input.params ?? {},\n      ...(input.subject !== undefined && { subject: input.subject }),\n      publishedBy: \"client\",\n    });\n    if (result === undefined || result === null) return { action: \"drop\" };\n    return { action: \"fanout\", data: result };\n  } catch (err) {\n    return { action: \"drop\", error: err instanceof Error ? err.message : String(err) };\n  }\n}\n","/**\n * Tako Internal Endpoints\n *\n * These endpoints are handled by the SDK automatically on Host: <app>.tako.\n *\n * - GET  /status — Health/status check\n * - POST /channels/authorize — Channel auth callback\n */\n\nimport type { ChannelRegistry } from \"../channels\";\nimport type { ChannelAuthorizeInput, TakoStatus } from \"../types\";\nimport { dispatchWsMessage } from \"../channels/handler\";\nimport { getInternalToken, getStorageBindings } from \"./secrets\";\n\nexport const TAKO_INTERNAL_HOST_SUFFIX = \".tako\";\nexport const TAKO_INTERNAL_STATUS_PATH = \"/status\";\nexport const TAKO_INTERNAL_CHANNELS_AUTHORIZE_PATH = \"/channels/authorize\";\nexport const TAKO_INTERNAL_CHANNELS_DISPATCH_PATH = \"/channels/dispatch\";\nexport const TAKO_INTERNAL_CHANNELS_REGISTRY_PATH = \"/channels/registry\";\nexport const TAKO_INTERNAL_TOKEN_HEADER = \"x-tako-internal-token\";\nconst TAKO_LOCAL_STORAGE_PREFIX = \"/_tako/storage/\";\nconst LOOPBACK_INTERNAL_HOSTS = new Set([\"127.0.0.1\", \"localhost\", \"0.0.0.0\"]);\n\nfunction baseAppName(value: string): string {\n  const [appName = \"\"] = value.trim().toLowerCase().split(\"/\");\n  return appName.length > 0 ? appName : \"app\";\n}\n\nfunction normalizeHost(value: string | null): string | null {\n  if (!value) {\n    return null;\n  }\n  const normalized = value.trim().toLowerCase();\n  if (normalized.length === 0) {\n    return null;\n  }\n  const [host = \"\"] = normalized.split(\":\");\n  return host;\n}\n\nexport function internalAppHost(appName: string): string {\n  return `${baseAppName(appName)}${TAKO_INTERNAL_HOST_SUFFIX}`;\n}\n\nfunction runtimeAppName(): string | null {\n  const processLike = globalThis as typeof globalThis & {\n    process?: { env?: Record<string, string | undefined> };\n  };\n  const appName = processLike.process?.env?.[\"TAKO_APP_NAME\"]?.trim();\n  return appName && appName.length > 0 ? appName : null;\n}\n\nfunction isInternalHost(host: string | null): boolean {\n  if (!host) {\n    return false;\n  }\n  if (LOOPBACK_INTERNAL_HOSTS.has(host)) {\n    return true;\n  }\n  const appName = runtimeAppName();\n  if (appName) {\n    return host === internalAppHost(appName);\n  }\n  return host.endsWith(TAKO_INTERNAL_HOST_SUFFIX) && host.length > TAKO_INTERNAL_HOST_SUFFIX.length;\n}\n\nfunction internalToken(): string | null {\n  return getInternalToken();\n}\n\n// CodeQL[js/stack-trace-exposure]: body may carry `err.message` (not stack)\n// from user handler exceptions via DispatchResult. This endpoint is gated on\n// Host: <app>.tako + internal token — only the tako-server infra reaches\n// it, and the server uses the error string for operator logging, never\n// forwarding it to external WS clients.\nfunction internalResponse(\n  body: unknown,\n  status: number,\n  token: string,\n  extraHeaders?: Record<string, string>,\n): Response {\n  return new Response(JSON.stringify(body), {\n    status,\n    headers: {\n      \"Content-Type\": \"application/json\",\n      [TAKO_INTERNAL_TOKEN_HEADER]: token,\n      ...extraHeaders,\n    },\n  });\n}\n\n/**\n * Handle Tako internal endpoints (internal host only).\n *\n * Returns a Response for internal requests, or null for non-internal requests.\n */\nexport async function handleTakoEndpoint(\n  request: Request,\n  status: TakoStatus,\n  channels: ChannelRegistry,\n): Promise<Response | null> {\n  const url = new URL(request.url);\n  if (url.pathname.startsWith(TAKO_LOCAL_STORAGE_PREFIX)) {\n    return handleLocalStorageRequest(request, url);\n  }\n\n  // Fast path: check Host header before parsing the URL (avoids allocation for normal traffic)\n  const hostHeader = normalizeHost(request.headers.get(\"host\"));\n  if (hostHeader && !isInternalHost(hostHeader)) {\n    return null;\n  }\n\n  const host = hostHeader || normalizeHost(url.host);\n  if (!isInternalHost(host)) {\n    return null;\n  }\n\n  const token = internalToken();\n  const path = url.pathname;\n  if (!token || request.headers.get(TAKO_INTERNAL_TOKEN_HEADER) !== token) {\n    return new Response(JSON.stringify({ error: \"Forbidden\" }), {\n      status: 403,\n      headers: { \"Content-Type\": \"application/json\" },\n    });\n  }\n\n  switch (path) {\n    case TAKO_INTERNAL_STATUS_PATH:\n      return handleStatus(status, token);\n    case TAKO_INTERNAL_CHANNELS_AUTHORIZE_PATH:\n      return await handleChannelAuthorize(request, token, channels);\n    case TAKO_INTERNAL_CHANNELS_DISPATCH_PATH:\n      return await handleChannelDispatch(request, token, channels);\n    case TAKO_INTERNAL_CHANNELS_REGISTRY_PATH:\n      return handleChannelRegistry(request, token, channels);\n\n    default:\n      return internalResponse({ error: \"Not found\" }, 404, token);\n  }\n}\n\nfunction handleChannelRegistry(\n  request: Request,\n  token: string,\n  channels: ChannelRegistry,\n): Response {\n  if (request.method !== \"GET\") {\n    return internalResponse({ error: \"Method not allowed\" }, 405, token);\n  }\n\n  const defs = channels.all.map(({ name, definition }) => {\n    const meta: {\n      channel: string;\n      paramsSchema: object;\n      auth: false | { headerName?: string | false; cookieName?: string };\n      transport?: \"ws\";\n    } = {\n      channel: name,\n      paramsSchema: definition.paramsSchema,\n      auth:\n        definition.auth === false\n          ? false\n          : {\n              ...(definition.auth.headerName !== undefined && {\n                headerName: definition.auth.headerName,\n              }),\n              ...(definition.auth.cookieName !== undefined && {\n                cookieName: definition.auth.cookieName,\n              }),\n            },\n      ...(definition.transport !== undefined && { transport: definition.transport }),\n    };\n    return meta;\n  });\n  return internalResponse(defs, 200, token);\n}\n\nasync function handleChannelDispatch(\n  request: Request,\n  token: string,\n  channels: ChannelRegistry,\n): Promise<Response> {\n  if (request.method !== \"POST\") {\n    return internalResponse({ error: \"Method not allowed\" }, 405, token);\n  }\n\n  type DispatchBody = {\n    channel?: string;\n    params?: Record<string, unknown>;\n    frame?: { type?: string; data?: unknown };\n    subject?: string;\n  };\n\n  let body: DispatchBody;\n  try {\n    body = (await request.json()) as DispatchBody;\n  } catch {\n    return internalResponse({ error: \"Invalid JSON\" }, 400, token);\n  }\n\n  if (\n    typeof body.channel !== \"string\" ||\n    !body.frame ||\n    typeof body.frame.type !== \"string\" ||\n    !(\"data\" in body.frame)\n  ) {\n    return internalResponse({ error: \"Invalid request\" }, 400, token);\n  }\n\n  const input = {\n    channel: body.channel,\n    params: body.params ?? {},\n    frame: { type: body.frame.type, data: body.frame.data },\n    ...(typeof body.subject === \"string\" && { subject: body.subject }),\n  };\n  const result = await dispatchWsMessage(channels, input);\n  return internalResponse(result, 200, token);\n}\n\n/**\n * GET /status on Host: <app>.tako — Full status information\n */\nfunction handleStatus(status: TakoStatus, token: string): Response {\n  return internalResponse(status, 200, token);\n}\n\nasync function handleLocalStorageRequest(request: Request, url: URL): Promise<Response> {\n  const route = parseLocalStorageRoute(url.pathname);\n  if (route === \"invalid\") {\n    return storageJson({ error: \"Invalid key\" }, 400);\n  }\n  if (!route) {\n    return storageJson({ error: \"Not found\" }, 404);\n  }\n  if (request.method !== (route.operation === \"download\" ? \"GET\" : \"PUT\")) {\n    return storageJson({ error: \"Method not allowed\" }, 405);\n  }\n\n  const binding = localStorageBinding(route.storagePath);\n  if (!binding) {\n    return storageJson({ error: \"Not found\" }, 404);\n  }\n\n  const expires = Number(url.searchParams.get(\"expires\"));\n  const token = url.searchParams.get(\"token\") ?? \"\";\n  if (!Number.isSafeInteger(expires) || expires < Math.floor(Date.now() / 1000)) {\n    return storageJson({ error: \"Forbidden\" }, 403);\n  }\n\n  const payload = `${route.operation}\\n${route.storagePath}\\n${route.encodedKey}\\n${expires}`;\n  const expectedToken = await hmacHex(utf8(binding.signingKey), payload);\n  if (!constantTimeEqual(token, expectedToken)) {\n    return storageJson({ error: \"Forbidden\" }, 403);\n  }\n\n  const dataDir = process.env[\"TAKO_DATA_DIR\"];\n  if (!dataDir) {\n    return storageJson({ error: \"Local storage is not available\" }, 500);\n  }\n\n  const path = await import(\"node:path\");\n  const fs = await import(\"node:fs/promises\");\n  const root = path.resolve(dataDir, route.storagePath);\n  const target = path.resolve(root, ...route.keySegments);\n  if (target !== root && !target.startsWith(root + path.sep)) {\n    return storageJson({ error: \"Invalid key\" }, 400);\n  }\n\n  if (route.operation === \"upload\") {\n    await fs.mkdir(path.dirname(target), { recursive: true });\n    await fs.writeFile(target, Buffer.from(await request.arrayBuffer()));\n    return new Response(null, { status: 204 });\n  }\n\n  try {\n    const body = request.method === \"GET\" ? await fs.readFile(target) : null;\n    return new Response(body, {\n      status: 200,\n      headers: { \"Content-Type\": \"application/octet-stream\" },\n    });\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n      return storageJson({ error: \"Not found\" }, 404);\n    }\n    throw error;\n  }\n}\n\nfunction parseLocalStorageRoute(pathname: string):\n  | {\n      operation: \"download\" | \"upload\";\n      storagePath: string;\n      encodedKey: string;\n      keySegments: string[];\n    }\n  | \"invalid\"\n  | null {\n  const rest = pathname.slice(TAKO_LOCAL_STORAGE_PREFIX.length);\n  const [operation, encodedStoragePath, ...encodedKeySegments] = rest.split(\"/\");\n  if (operation !== \"download\" && operation !== \"upload\") {\n    return null;\n  }\n  if (!encodedStoragePath || encodedKeySegments.length === 0) {\n    return null;\n  }\n  const storagePath = safeDecodeURIComponent(encodedStoragePath);\n  const keySegments = encodedKeySegments.map(safeDecodeURIComponent);\n  if (storagePath === null || !keySegments.every(isString)) {\n    return \"invalid\";\n  }\n  return {\n    operation,\n    storagePath,\n    encodedKey: encodedKeySegments.join(\"/\"),\n    keySegments,\n  };\n}\n\nfunction isString(value: string | null): value is string {\n  return value !== null;\n}\n\nfunction safeDecodeURIComponent(value: string): string | null {\n  try {\n    return decodeURIComponent(value);\n  } catch {\n    return null;\n  }\n}\n\nfunction localStorageBinding(storagePath: string): { signingKey: string } | null {\n  for (const raw of Object.values(getStorageBindings())) {\n    if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n      continue;\n    }\n    const binding = raw as { provider?: unknown; path?: unknown; signing_key?: unknown };\n    if (\n      binding.provider === \"local\" &&\n      binding.path === storagePath &&\n      typeof binding.signing_key === \"string\" &&\n      binding.signing_key.length > 0\n    ) {\n      return { signingKey: binding.signing_key };\n    }\n  }\n  return null;\n}\n\nfunction storageJson(body: unknown, status: number): Response {\n  return new Response(JSON.stringify(body), {\n    status,\n    headers: { \"Content-Type\": \"application/json\" },\n  });\n}\n\nasync function hmacHex(key: ArrayBuffer, value: string): Promise<string> {\n  const cryptoKey = await crypto.subtle.importKey(\n    \"raw\",\n    key,\n    { name: \"HMAC\", hash: \"SHA-256\" },\n    false,\n    [\"sign\"],\n  );\n  const signature = await crypto.subtle.sign(\"HMAC\", cryptoKey, utf8(value));\n  return Array.from(new Uint8Array(signature))\n    .map((byte) => byte.toString(16).padStart(2, \"0\"))\n    .join(\"\");\n}\n\nfunction utf8(value: string): ArrayBuffer {\n  return new TextEncoder().encode(value).slice().buffer as ArrayBuffer;\n}\n\nfunction constantTimeEqual(a: string, b: string): boolean {\n  if (a.length !== b.length) {\n    return false;\n  }\n  let diff = 0;\n  for (let i = 0; i < a.length; i += 1) {\n    diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n  }\n  return diff === 0;\n}\n\nasync function handleChannelAuthorize(\n  request: Request,\n  token: string,\n  channels: ChannelRegistry,\n): Promise<Response> {\n  if (request.method !== \"POST\") {\n    return internalResponse({ error: \"Method not allowed\" }, 405, token);\n  }\n\n  let input: ChannelAuthorizeInput;\n  try {\n    input = (await request.json()) as ChannelAuthorizeInput;\n  } catch {\n    return internalResponse({ error: \"Invalid JSON\", ok: false }, 400, token);\n  }\n\n  if (!input.channel || !input.operation || input.params === undefined) {\n    return internalResponse({ error: \"Invalid request\", ok: false }, 400, token);\n  }\n\n  const result = await channels.authorize(input);\n  if (!result.ok) {\n    const hasDefinition = channels.resolve(input.channel) !== null;\n    if (!hasDefinition) {\n      return internalResponse({ error: \"Channel not defined\", ok: false }, 404, token);\n    }\n    if (result.reason === \"sse_publish_not_allowed\") {\n      return internalResponse(\n        { error: \"Method not allowed\", ok: false, reason: result.reason },\n        405,\n        token,\n      );\n    }\n    return internalResponse({ error: \"Forbidden\", ok: false }, 403, token);\n  }\n\n  return internalResponse(result, 200, token);\n}\n","/**\n * Shared server-runtime initialization.\n *\n * Every context that hosts a Tako server-side user module — production\n * server entry (`createEntrypoint.run`), Vite dev plugin, future edge\n * adapters — installs the same publisher + runtime registrations so that\n * `Channel.publish()`, `signal()`, and `defineWorkflow(...).enqueue()`\n * all work when invoked from app code.\n *\n * Worker entrypoints call `setWorkflowRuntime` separately because they\n * first need to configure `workflowsEngine` with an explicit\n * `WorkflowsClient` identity.\n */\n\nimport { setWorkflowRuntime } from \"../workflows/define\";\nimport { workflowsEngine } from \"../workflows/engine\";\nimport { assertInternalSocketEnvConsistency, installChannelSocketPublisherFromEnv } from \"./socket\";\n\nexport function initServerRuntime(): void {\n  assertInternalSocketEnvConsistency();\n  installChannelSocketPublisherFromEnv();\n  setWorkflowRuntime({\n    enqueue: (name, payload, opts) => workflowsEngine.enqueue(name, payload, opts),\n    signal: (event, payload) => workflowsEngine.signal(event, payload),\n  });\n}\n"],"mappings":"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"}