{"_id":"@allservices/sdk-sveltekit","_rev":"10-831bffa41949cbdf326eb6ea85e11240","name":"@allservices/sdk-sveltekit","dist-tags":{"latest":"4.0.0"},"versions":{"1.0.0":{"name":"@allservices/sdk-sveltekit","version":"1.0.0","keywords":["allservices","sdk","sveltekit","svelte","ssr","tanstack","svelte-query"],"author":{"name":"linkst"},"license":"UNLICENSED","_id":"@allservices/sdk-sveltekit@1.0.0","maintainers":[{"name":"linkstcc","email":"linkst@allservices.cc"}],"homepage":"https://github.com/linkstcc/AllService-SDK#readme","bugs":{"url":"https://github.com/linkstcc/AllService-SDK/issues"},"dist":{"shasum":"00d7f7381564849a3875d3198d8cc3d74b72342d","tarball":"https://registry.npmjs.org/@allservices/sdk-sveltekit/-/sdk-sveltekit-1.0.0.tgz","fileCount":14,"integrity":"sha512-HgRnuWHhMjG3e4fH5ZmrWeKMdriwV+KFXH4u6QPoWN+lL0+Bjl9kbIzpSBZS3gdx6SumbNqWzFSAhrrY4Cu/WA==","signatures":[{"sig":"MEYCIQDMzHtouNpCFsjSBcxyDwdkVohsjGDhqaYDCw6HvJHCrQIhAOwSGvnSpXA9nX0w+ERPK5bk1buMqdbVztzxe/m4zzjy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68988},"main":"./dist/index.cjs","type":"module","_from":"file:allservices-sdk-sveltekit-1.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./server":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"browser":null,"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./package.json":"./package.json"},"private":false,"scripts":{"lint":"eslint \"src/**/*.ts\"","test":"vitest run","build":"tsup","clean":"rimraf dist .turbo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"linkstcc","email":"linkst@allservices.cc"},"_resolved":"/tmp/d9e6c5fdd143e8b1514f11a7b7832c8f/allservices-sdk-sveltekit-1.0.0.tgz","_integrity":"sha512-HgRnuWHhMjG3e4fH5ZmrWeKMdriwV+KFXH4u6QPoWN+lL0+Bjl9kbIzpSBZS3gdx6SumbNqWzFSAhrrY4Cu/WA==","repository":{"url":"git+https://github.com/linkstcc/AllService-SDK.git","type":"git","directory":"packages/sdk-sveltekit"},"_npmVersion":"10.9.7","description":"SvelteKit 2 SSR companion for @allservices/sdk-svelte: load() prefetch, hydration boundary, form-action helper, hooks.server middleware, and __Host-session cookie helpers.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"msw":"^2.6.0","tsup":"^8.3.0","rimraf":"^6.0.1","svelte":"^5.25.0","vitest":"^2.1.0","typescript":"^5.6.3","@sveltejs/kit":"^2.8.0","@allservices/sdk-core":"1.3.0","@allservices/tsconfig":"0.0.0","@allservices/contracts":"0.2.0","@tanstack/svelte-query":"^6.1.24","@allservices/sdk-server":"4.0.0","@allservices/sdk-svelte":"0.1.0"},"peerDependencies":{"svelte":"^5.25.0","@sveltejs/kit":"^2.0.0","@allservices/sdk-core":"1.3.0","@allservices/contracts":"0.2.0","@tanstack/svelte-query":"^6.0.0","@allservices/sdk-server":"4.0.0","@allservices/sdk-svelte":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-sveltekit_1.0.0_1777426764233_0.8431074292458529","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@allservices/sdk-sveltekit","version":"2.0.0","keywords":["allservices","sdk","sveltekit","svelte","ssr","tanstack","svelte-query"],"author":{"name":"linkst"},"license":"UNLICENSED","_id":"@allservices/sdk-sveltekit@2.0.0","maintainers":[{"name":"linkstcc","email":"linkst@allservices.cc"}],"homepage":"https://github.com/linkstcc/AllService-SDK#readme","bugs":{"url":"https://github.com/linkstcc/AllService-SDK/issues"},"dist":{"shasum":"c44c39e3c6534f537064d7343439300f8e838d4e","tarball":"https://registry.npmjs.org/@allservices/sdk-sveltekit/-/sdk-sveltekit-2.0.0.tgz","fileCount":14,"integrity":"sha512-3ceIma8wUvE+8qcGm6RRQtHgbx4h8CCfd6v1vrDz4iAIt/QVdxYzQXTRRbNa/Yk2fj/PzPm7l1+nbWmHZ719Rw==","signatures":[{"sig":"MEUCIDQCeSfUvHVkdxYar1WqPHsxmUTHtLYaXmxdKP2mi1r6AiEAmZaiJEnchtH8RQx3OY2V+wN8FEJdqgpCJujrlxu2tQc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68988},"main":"./dist/index.cjs","type":"module","_from":"file:allservices-sdk-sveltekit-2.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./server":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"browser":null,"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./package.json":"./package.json"},"private":false,"scripts":{"lint":"eslint \"src/**/*.ts\"","test":"vitest run","build":"tsup","clean":"rimraf dist .turbo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"linkstcc","email":"linkst@allservices.cc"},"_resolved":"/tmp/de9c01f459d6230f96974263248eb2aa/allservices-sdk-sveltekit-2.0.0.tgz","_integrity":"sha512-3ceIma8wUvE+8qcGm6RRQtHgbx4h8CCfd6v1vrDz4iAIt/QVdxYzQXTRRbNa/Yk2fj/PzPm7l1+nbWmHZ719Rw==","repository":{"url":"git+https://github.com/linkstcc/AllService-SDK.git","type":"git","directory":"packages/sdk-sveltekit"},"_npmVersion":"10.9.7","description":"SvelteKit 2 SSR companion for @allservices/sdk-svelte: load() prefetch, hydration boundary, form-action helper, hooks.server middleware, and __Host-session cookie helpers.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"msw":"^2.6.0","tsup":"^8.3.0","rimraf":"^6.0.1","svelte":"^5.25.0","vitest":"^2.1.0","typescript":"^5.6.3","@sveltejs/kit":"^2.8.0","@allservices/sdk-core":"2.0.0","@allservices/tsconfig":"0.0.0","@allservices/contracts":"1.0.0","@tanstack/svelte-query":"^6.1.24","@allservices/sdk-server":"5.0.0","@allservices/sdk-svelte":"1.0.0"},"peerDependencies":{"svelte":"^5.25.0","@sveltejs/kit":"^2.0.0","@allservices/sdk-core":"2.0.0","@allservices/contracts":"1.0.0","@tanstack/svelte-query":"^6.0.0","@allservices/sdk-server":"5.0.0","@allservices/sdk-svelte":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-sveltekit_2.0.0_1778029891184_0.04079549450235609","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@allservices/sdk-sveltekit","version":"3.0.0","keywords":["allservices","sdk","sveltekit","svelte","ssr","tanstack","svelte-query"],"author":{"name":"linkst"},"license":"UNLICENSED","_id":"@allservices/sdk-sveltekit@3.0.0","maintainers":[{"name":"linkstcc","email":"linkst@allservices.cc"}],"homepage":"https://github.com/linkstcc/AllService-SDK#readme","bugs":{"url":"https://github.com/linkstcc/AllService-SDK/issues"},"dist":{"shasum":"e1fa2f26a174f189b976bd766679a970af8bfbf3","tarball":"https://registry.npmjs.org/@allservices/sdk-sveltekit/-/sdk-sveltekit-3.0.0.tgz","fileCount":14,"integrity":"sha512-dE/lTZg2NDHHFAi7mzX4rB9+ICIje2OJOhae4x2B3Yt9AbhngcIag3J3owjbpK0shHdkjKoxVeAzLzWRJ5aKng==","signatures":[{"sig":"MEUCIQC5YkcCrzDFa40OkvklA+yRigK2tK/3Y4PBbf49XWB0dQIgEUyRtIeDulfVhG+nwuw9m+7DTDtIdW5mkmkqHc0BrsU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68988},"main":"./dist/index.cjs","type":"module","_from":"file:allservices-sdk-sveltekit-3.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./server":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"browser":null,"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./package.json":"./package.json"},"private":false,"scripts":{"lint":"eslint \"src/**/*.ts\"","test":"vitest run","build":"tsup","clean":"rimraf dist .turbo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"linkstcc","email":"linkst@allservices.cc"},"_resolved":"/tmp/829c3bd813a73b04b6bce064db95d500/allservices-sdk-sveltekit-3.0.0.tgz","_integrity":"sha512-dE/lTZg2NDHHFAi7mzX4rB9+ICIje2OJOhae4x2B3Yt9AbhngcIag3J3owjbpK0shHdkjKoxVeAzLzWRJ5aKng==","repository":{"url":"git+https://github.com/linkstcc/AllService-SDK.git","type":"git","directory":"packages/sdk-sveltekit"},"_npmVersion":"10.9.7","description":"SvelteKit 2 SSR companion for @allservices/sdk-svelte: load() prefetch, hydration boundary, form-action helper, hooks.server middleware, and __Host-session cookie helpers.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"msw":"^2.6.0","tsup":"^8.3.0","rimraf":"^6.0.1","svelte":"^5.25.0","vitest":"^2.1.0","typescript":"^5.6.3","@sveltejs/kit":"^2.8.0","@allservices/sdk-core":"3.0.0","@allservices/tsconfig":"0.0.0","@allservices/contracts":"1.1.0","@tanstack/svelte-query":"^6.1.24","@allservices/sdk-server":"6.0.0","@allservices/sdk-svelte":"2.0.0"},"peerDependencies":{"svelte":"^5.25.0","@sveltejs/kit":"^2.0.0","@allservices/sdk-core":"3.0.0","@allservices/contracts":"1.1.0","@tanstack/svelte-query":"^6.0.0","@allservices/sdk-server":"6.0.0","@allservices/sdk-svelte":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk-sveltekit_3.0.0_1778273396803_0.08435293814545752","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@allservices/sdk-sveltekit","version":"4.0.0","description":"SvelteKit 2 SSR companion for @allservices/sdk-svelte: load() prefetch, hydration boundary, form-action helper, hooks.server middleware, and __Host-session cookie helpers.","author":{"name":"linkst"},"license":"UNLICENSED","homepage":"https://github.com/linkstcc/AllService-SDK#readme","repository":{"type":"git","url":"git+https://github.com/linkstcc/AllService-SDK.git","directory":"packages/sdk-sveltekit"},"bugs":{"url":"https://github.com/linkstcc/AllService-SDK/issues"},"keywords":["allservices","sdk","sveltekit","svelte","ssr","tanstack","svelte-query"],"private":false,"type":"module","sideEffects":false,"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./server":{"browser":null,"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./package.json":"./package.json"},"peerDependencies":{"@sveltejs/kit":"^2.0.0","@tanstack/svelte-query":"^6.0.0","svelte":"^5.25.0","@allservices/sdk-core":"3.0.0","@allservices/sdk-server":"6.1.0","@allservices/contracts":"1.1.0","@allservices/sdk-svelte":"2.0.0"},"devDependencies":{"@sveltejs/kit":"^2.8.0","@tanstack/svelte-query":"^6.1.24","msw":"^2.6.0","rimraf":"^6.0.1","svelte":"^5.25.0","tsup":"^8.3.0","typescript":"^5.6.3","vitest":"^2.1.0","@allservices/contracts":"1.1.0","@allservices/sdk-core":"3.0.0","@allservices/sdk-server":"6.1.0","@allservices/sdk-svelte":"2.0.0","@allservices/tsconfig":"0.0.0"},"scripts":{"build":"tsup","typecheck":"tsc --noEmit","test":"vitest run","test:watch":"vitest","lint":"eslint \"src/**/*.ts\"","clean":"rimraf dist .turbo"},"_id":"@allservices/sdk-sveltekit@4.0.0","_integrity":"sha512-KkXT3sI6alSy/EeCm68gyq7D4NmrWlxHYlUCH2ldvC28tMK+DSqRFj3/RgT22XI0nUxNEXQhpoJtHM6rDNAtMA==","_resolved":"/tmp/eca0646acdae0445c71a580072127be0/allservices-sdk-sveltekit-4.0.0.tgz","_from":"file:allservices-sdk-sveltekit-4.0.0.tgz","_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-KkXT3sI6alSy/EeCm68gyq7D4NmrWlxHYlUCH2ldvC28tMK+DSqRFj3/RgT22XI0nUxNEXQhpoJtHM6rDNAtMA==","shasum":"a15b20559ac76d6763a923bc6d84a432427533f5","tarball":"https://registry.npmjs.org/@allservices/sdk-sveltekit/-/sdk-sveltekit-4.0.0.tgz","fileCount":14,"unpackedSize":70989,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIE1e1nmtpZBZhH/w8DQD4/a40EObsGcoVQXjKnWRI5jwAiAuAkElSNas5fB7njmi4lu1NaiGs6vwu/QbINxoBZOI6w=="}]},"_npmUser":{"name":"linkstcc","email":"linkst@allservices.cc"},"directories":{},"maintainers":[{"name":"linkstcc","email":"linkst@allservices.cc"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk-sveltekit_4.0.0_1779054408611_0.07192512934676265"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-29T01:39:23.837Z","modified":"2026-05-17T21:46:48.892Z","1.0.0":"2026-04-29T01:39:24.371Z","2.0.0":"2026-05-06T01:11:31.336Z","3.0.0":"2026-05-08T20:49:56.938Z","4.0.0":"2026-05-17T21:46:48.750Z"},"bugs":{"url":"https://github.com/linkstcc/AllService-SDK/issues"},"author":{"name":"linkst"},"license":"UNLICENSED","homepage":"https://github.com/linkstcc/AllService-SDK#readme","keywords":["allservices","sdk","sveltekit","svelte","ssr","tanstack","svelte-query"],"repository":{"type":"git","url":"git+https://github.com/linkstcc/AllService-SDK.git","directory":"packages/sdk-sveltekit"},"description":"SvelteKit 2 SSR companion for @allservices/sdk-svelte: load() prefetch, hydration boundary, form-action helper, hooks.server middleware, and __Host-session cookie helpers.","maintainers":[{"name":"linkstcc","email":"linkst@allservices.cc"}],"readme":"# @allservices/sdk-sveltekit\n\nSvelteKit 2 SSR companion for `@allservices/sdk-svelte`: `hooks.server.ts` middleware, `+page.server.ts` prefetch + dehydration helpers, form-action error mapping, and cookie helpers for the AllServices session cookie.\n\n> Status: stable. `2.0.0`. Verified against backend manual `2026-05-11`. Requires SvelteKit 2, Svelte 5, and `@tanstack/svelte-query@5`.\n\n## Minimal usage\n\nBrowser entry (`+layout.svelte`):\n\n```svelte\n<script lang=\"ts\">\n  import { HydrationBoundary } from '@allservices/sdk-sveltekit';\n  const { data, children } = $props();\n</script>\n\n<HydrationBoundary state={data.dehydratedState}>\n  {@render children()}\n</HydrationBoundary>\n```\n\nServer entry (`+page.server.ts`):\n\n```ts\nimport { QueryClient } from '@tanstack/svelte-query';\nimport { prefetchAllServices, dehydrate } from '@allservices/sdk-sveltekit';\nimport { createKitServerClient } from '@allservices/sdk-sveltekit/server';\nimport { queryKeys } from '@allservices/sdk-svelte';\n\nexport async function load(event) {\n  const client = createKitServerClient(event, { config: { baseUrl: env.ALLSERVICES_API_URL } });\n  const qc = new QueryClient();\n  await prefetchAllServices(qc, queryKeys.licensing.list({}), () => client.licensing.list());\n  return { dehydratedState: dehydrate(qc) };\n}\n```\n\n## Bundle size\n\nThe browser entry pulls only prefetch / hydrate helpers (a thin wrapper over TanStack Svelte Query). The `/server` subpath has `\"browser\": null` so it cannot leak into a browser bundle.\n\n## Links\n\n- [`docs/sdk/COOKIE_MODE.md`](../../docs/sdk/COOKIE_MODE.md) — session cookie scoping.\n- [`RECIPES.md`](../../RECIPES.md) — `12. Svelte: server-loaded list with hydration`.\n- [`MIGRATION.md`](../../MIGRATION.md) — upgrading from 1.x.\n- [`@allservices/sdk-svelte`](../sdk-svelte/README.md) — runtime hooks + provider.\n\n---\n\n## Install\n\n```bash\npnpm add @allservices/sdk-sveltekit @allservices/sdk-svelte @allservices/sdk-server \\\n         @sveltejs/kit svelte @tanstack/svelte-query\n```\n\n## Subpath exports\n\nThis package ships two entries:\n\n| Import                              | Runs in                       | Purpose                                                                          |\n| ----------------------------------- | ----------------------------- | -------------------------------------------------------------------------------- |\n| `@allservices/sdk-sveltekit`        | browser + server              | `prefetchAllServices`, `dehydrate`, `HydrationBoundary`, `queryKeys`             |\n| `@allservices/sdk-sveltekit/server` | Node only (`\"browser\": null`) | `createAllServicesHandle`, `createKitServerClient`, `formAction`, cookie helpers |\n\nNever import from the `/server` subpath in a `.svelte` file or any module that may end up in a browser bundle. The build-time `\"browser\": null` guard will fail the bundle if you do.\n\n## Server middleware (`hooks.server.ts`)\n\n`createAllServicesHandle` creates a per-request `AllServicesClient`, seeds it with the `__Host-session` cookie token, optionally fetches the current user, and attaches everything to `event.locals.allservices`.\n\n```ts\n// src/hooks.server.ts\nimport { createAllServicesHandle } from '@allservices/sdk-sveltekit/server';\nimport { env } from '$env/dynamic/private';\n\nexport const handle = createAllServicesHandle({\n  config: {\n    region: 'eu',\n    baseUrl: env.ALLSERVICES_API_URL,\n  },\n  loadUser: async (client) => {\n    try {\n      return await client.users.getMe();\n    } catch {\n      return null;\n    }\n  },\n});\n```\n\nCookie rotation is automatic: if the SDK's `TokenManager` refreshes the access token during the request, the middleware writes the new token back to the cookie before the response is sent.\n\n## `app.d.ts` augmentation\n\nSvelteKit requires you to declare the shape of `event.locals`. Add this once to `src/app.d.ts`:\n\n```ts\nimport type { AllServicesLocals } from '@allservices/sdk-sveltekit/server';\n\ndeclare global {\n  namespace App {\n    interface Locals {\n      allservices: AllServicesLocals;\n    }\n  }\n}\n\nexport {};\n```\n\n`AllServicesLocals` exposes `client` (the per-request `AllServicesClient`), `user` (`AuthResponseUser | null`), and `accessToken` (`string | null`).\n\n## Server-side prefetch with hydration (`+page.server.ts`)\n\nUse `createKitServerClient` + `prefetchAllServices` + `dehydrate` to pre-populate the TanStack cache on the server and hand the dehydrated state to the client.\n\n```ts\n// src/routes/dashboard/+page.server.ts\nimport { QueryClient } from '@tanstack/svelte-query';\nimport { prefetchAllServices, dehydrate } from '@allservices/sdk-sveltekit';\nimport { createKitServerClient } from '@allservices/sdk-sveltekit/server';\nimport { queryKeys } from '@allservices/sdk-svelte';\nimport { env } from '$env/dynamic/private';\nimport type { PageServerLoad } from './$types';\n\nexport const load: PageServerLoad = async (event) => {\n  const client = createKitServerClient(event, {\n    config: { region: 'eu', baseUrl: env.ALLSERVICES_API_URL },\n  });\n  const qc = new QueryClient();\n\n  await prefetchAllServices(qc, queryKeys.users.me(), () => client.users.getMe());\n\n  return { dehydratedState: dehydrate(qc) };\n};\n```\n\nThen on the page, wrap your hooks in `<HydrationBoundary>` using the dehydrated state from `data`:\n\n```svelte\n<!-- src/routes/dashboard/+page.svelte -->\n<script lang=\"ts\">\n  import { HydrationBoundary } from '@allservices/sdk-sveltekit';\n  import { createCurrentUser } from '@allservices/sdk-svelte';\n  import type { PageData } from './$types';\n\n  let { data }: { data: PageData } = $props();\n\n  const user = createCurrentUser();\n</script>\n\n<HydrationBoundary state={data.dehydratedState}>\n  {#if user.data}\n    <h1>Welcome, {user.data.firstName}</h1>\n  {/if}\n</HydrationBoundary>\n```\n\nThe hook is a warm cache hit on mount — no loading spinner, no second network request.\n\n## Form actions (`+page.server.ts`)\n\n`formAction` wraps a SvelteKit action handler and maps AllServices error classes to `fail()` / `redirect()` responses without boilerplate. Error mapping:\n\n| Error class                 | `fail()` status    | Payload                           |\n| --------------------------- | ------------------ | --------------------------------- |\n| `ValidationError`           | 422                | `{ fieldErrors: error.details }`  |\n| `AuthenticationError`       | 401                | `{ message }`                     |\n| `SudoRequiredError`         | 403                | `{ sudoRequired: true, message }` |\n| `RateLimitedError`          | 429                | `{ retryAfter, message }`         |\n| Other `AllServicesApiError` | `error.statusCode` | `{ message }`                     |\n\nSvelteKit `redirect()` and other `Response` objects are re-thrown transparently.\n\n```ts\n// src/routes/login/+page.server.ts\nimport { redirect } from '@sveltejs/kit';\nimport { formAction, writeSessionToCookies } from '@allservices/sdk-sveltekit/server';\nimport type { Actions } from './$types';\n\nexport const actions: Actions = {\n  default: formAction(async (event) => {\n    const data = Object.fromEntries(await event.request.formData());\n    const result = await event.locals.allservices.client.auth.login({\n      email: String(data.email),\n      password: String(data.password),\n    });\n    writeSessionToCookies(event.cookies, result.accessToken);\n    throw redirect(303, '/dashboard');\n  }),\n};\n```\n\nConsume the fail result in the `.svelte` file:\n\n```svelte\n<!-- src/routes/login/+page.svelte -->\n<script lang=\"ts\">\n  import { enhance } from '$app/forms';\n  import type { ActionData } from './$types';\n\n  let { form }: { form: ActionData } = $props();\n</script>\n\n<form method=\"POST\" use:enhance>\n  <input name=\"email\" type=\"email\" />\n  <input name=\"password\" type=\"password\" />\n  {#if form?.fieldErrors?.email}\n    <span role=\"alert\">{form.fieldErrors.email[0].message}</span>\n  {/if}\n  {#if form?.message}\n    <p role=\"alert\">{form.message}</p>\n  {/if}\n  <button type=\"submit\">Sign in</button>\n</form>\n```\n\n## Cookie helpers\n\nThree helpers manage the `__Host-session` access-token cookie. They use strict flags (`Secure; HttpOnly; SameSite=Lax; Path=/`) suitable for production.\n\n```ts\nimport {\n  readSessionFromCookies,\n  writeSessionToCookies,\n  clearSessionCookies,\n} from '@allservices/sdk-sveltekit/server';\n\n// Read access token from the cookie jar (returns null if absent)\nconst token = readSessionFromCookies(event.cookies);\n\n// Write after login or token refresh (maxAge defaults to 30 minutes)\nwriteSessionToCookies(event.cookies, accessToken);\n\n// Clear on logout\nclearSessionCookies(event.cookies);\n```\n\n## Webhook receiver\n\nWebhook signature verification is provided by `@allservices/sdk-server`, not this package. See [`@allservices/sdk-server`](../sdk-server/README.md) for `verifyWebhookSignature` and `createWebhookHandler`. The reference app wires this up in [`src/routes/api/webhooks/`](../../examples/sveltekit-app/README.md).\n\n## Reference app\n\nThe SvelteKit reference application at [`examples/sveltekit-app/`](../../examples/sveltekit-app/README.md) demonstrates every pattern above end-to-end, including the `hooks.server.ts` middleware, the `formAction` login flow, `<HydrationBoundary>`, and webhook verification.\n\n## Documentation\n\nSee the [main README](https://github.com/linkstcc/AllService-SDK#readme).\n\n## License\n\nUNLICENSED — internal AllServices use only.\n","readmeFilename":"README.md"}