{"_id":"@autolabz/data-sdk","_rev":"6-62f689d3b29e28e1dbc5642593b06576","name":"@autolabz/data-sdk","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.0":{"name":"@autolabz/data-sdk","version":"0.1.0","_id":"@autolabz/data-sdk@0.1.0","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"dist":{"shasum":"85f598aef9f2a81399372e8e76338b6241489291","tarball":"https://registry.npmjs.org/@autolabz/data-sdk/-/data-sdk-0.1.0.tgz","fileCount":12,"integrity":"sha512-Cc97Kz3vr3p5S8ZYJQdNKJxpbBGQgNsy84jLiT/qWEXgwIjwIg5h54EyB/joMtypWOloZxMh3EAim/Ec41SwEg==","signatures":[{"sig":"MEUCICKWmWLcpaY0tUWM2nkVfj7ERF6E/LTupILVZkFxOkl7AiEA94jqOUq13GN/3E4CZHt5vqZoSEdb/Xw5jzVqeowbnMw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10512},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"4293308e7e812a7b3fdd7b1e9c75c8ea30f85dde","private":false,"scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"_npmVersion":"10.8.2","description":"AutoLab Data SDK - HTTP client with auth bridge and retries","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.7.7"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.3","@autolabz/auth-sdk":"file:../auth-sdk"},"peerDependencies":{"@autolabz/auth-sdk":"*"},"_npmOperationalInternal":{"tmp":"tmp/data-sdk_0.1.0_1760693227836_0.041991530338459704","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@autolabz/data-sdk","version":"0.1.1","_id":"@autolabz/data-sdk@0.1.1","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"dist":{"shasum":"879cc5b02847c673dd6c0d6eacda6f03738060ee","tarball":"https://registry.npmjs.org/@autolabz/data-sdk/-/data-sdk-0.1.1.tgz","fileCount":12,"integrity":"sha512-eqhQoh8e0KccWUkohYWiPRQL5Zkr5+KIINSEyTwlOIvYeKRAZ37gYDuy97xIDWoWpCVdOju2fO1WryPOXREHFw==","signatures":[{"sig":"MEYCIQDBbDNeowt+qX3ZTNoM+Kuw3IcAd3tBAMj44m1zMfh0JAIhAOKpwPPN6JeYLkOH3RHATEB8junpexaahr/cmSO070FQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10712},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"4293308e7e812a7b3fdd7b1e9c75c8ea30f85dde","private":false,"scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"_npmVersion":"10.8.2","description":"AutoLab Data SDK - HTTP client with auth bridge and retries","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.7.7"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.3"},"_npmOperationalInternal":{"tmp":"tmp/data-sdk_0.1.1_1760698952974_0.43824792924981293","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@autolabz/data-sdk","version":"0.1.2","_id":"@autolabz/data-sdk@0.1.2","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"dist":{"shasum":"1150f6140bd080f52fc1d168397182825795b92e","tarball":"https://registry.npmjs.org/@autolabz/data-sdk/-/data-sdk-0.1.2.tgz","fileCount":12,"integrity":"sha512-QI/NWAcDaPkd9BqCX44FeRTatJu8ZuIzvXBueVZCdz0Z0WP+3Ftun8Ro3pBDQnqolwt11r5M8dvij3EaOCfHKA==","signatures":[{"sig":"MEUCIQDCb6h8LAimrJ5zRLeXUs6jKA/TozkoOcfOIb4zMptSUgIga1Zv1Xt+o6gvKjGukBRsnt1chNeMfKTYc5J5rLS6jMI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10720},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"4293308e7e812a7b3fdd7b1e9c75c8ea30f85dde","private":false,"scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"_npmVersion":"10.8.2","description":"AutoLab Data SDK - HTTP client with auth bridge and retries","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.7.7"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.3"},"_npmOperationalInternal":{"tmp":"tmp/data-sdk_0.1.2_1760700732077_0.40904592680854157","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@autolabz/data-sdk","version":"0.1.3","_id":"@autolabz/data-sdk@0.1.3","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"dist":{"shasum":"7f6071a3a327cd2585a030b82b13de44e4b66f5d","tarball":"https://registry.npmjs.org/@autolabz/data-sdk/-/data-sdk-0.1.3.tgz","fileCount":12,"integrity":"sha512-KE9nmEHvzQv+izwClYj9vHFhRMREdq++afAqlX7/uKYl2qQIAih5dybXAHu1Shh7nCg1ljA+3QiWZclam7BVxA==","signatures":[{"sig":"MEUCIQDOcygpu7fnyBT7Oz0/hd2RYu8h1qlduF/puV58o3m2+wIgYKNONO7h2UdfhIS+kSDy0/UxSazuK4IQcXu9kQFBiIQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10800},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"5bce87ba3e45534289b0bdf8c2165f9c84f58b25","private":false,"scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"_npmVersion":"10.8.2","description":"AutoLab Data SDK - HTTP client with auth bridge and retries","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.7.7"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.3"},"_npmOperationalInternal":{"tmp":"tmp/data-sdk_0.1.3_1761188444686_0.8883532720088052","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@autolabz/data-sdk","version":"0.1.4","_id":"@autolabz/data-sdk@0.1.4","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"dist":{"shasum":"9d5a001e9ee1a78e96a12c371602522d57629f89","tarball":"https://registry.npmjs.org/@autolabz/data-sdk/-/data-sdk-0.1.4.tgz","fileCount":12,"integrity":"sha512-CUuoLdC5BNvKoZyjOec3G6N5f5AEqtBTlG3VFtGR4XNlfxo+jRKOGgYmyfzGf10RkT8/raCc6HEvgpw1VXq7kA==","signatures":[{"sig":"MEYCIQDTYKuUkXwVaL+aVi7NNqvXaHxvfkeJrbflNcQ99WagEAIhAJu0tPCiGapEdFo3lvqdPXA8TbA+DTF8i2z68qUvrSsu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10800},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"93935a6d544bf8cc249d07c95a7f15c6c9c8ed88","private":false,"scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"_npmVersion":"10.8.2","description":"AutoLab Data SDK - HTTP client with auth bridge and retries","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.7.7"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.3"},"_npmOperationalInternal":{"tmp":"tmp/data-sdk_0.1.4_1761299883025_0.9002053479322998","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@autolabz/data-sdk","version":"0.1.5","private":false,"description":"AutoLab Data SDK - HTTP client with auth bridge and retries","type":"module","main":"dist/index.js","module":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"sideEffects":false,"exports":{".":{"import":"./dist/index.js","require":"./dist/index.js","types":"./dist/index.d.ts"}},"scripts":{"build":"tsc -p tsconfig.json"},"dependencies":{"axios":"^1.7.7"},"devDependencies":{"typescript":"^5.6.3"},"_id":"@autolabz/data-sdk@0.1.5","gitHead":"93935a6d544bf8cc249d07c95a7f15c6c9c8ed88","_nodeVersion":"20.19.5","_npmVersion":"10.8.2","dist":{"integrity":"sha512-n/OukwfhAZfTFwG1shyuoU3BFpHmaYug3+0+Uhyopf3LTWhoUXr6/sQZkn0gnm/ki8fo7ZLy1iMqUDocG/Vruw==","shasum":"8d71dd8b7354e45cbf23090bd65a219fd99eb8ea","tarball":"https://registry.npmjs.org/@autolabz/data-sdk/-/data-sdk-0.1.5.tgz","fileCount":12,"unpackedSize":12260,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDYl1xKKHtXEtpbvxffqpBoAQV7OfiznyRJ408bxDfkmAIgZFtFygUyKwHZg2P0x2+sHV93gnWF3Il9OkoyGiFhDbM="}]},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"directories":{},"maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/data-sdk_0.1.5_1761300310918_0.8325587614450458"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-17T09:27:07.735Z","modified":"2025-10-24T10:05:11.301Z","0.1.0":"2025-10-17T09:27:08.034Z","0.1.1":"2025-10-17T11:02:33.167Z","0.1.2":"2025-10-17T11:32:12.287Z","0.1.3":"2025-10-23T03:00:44.867Z","0.1.4":"2025-10-24T09:58:03.217Z","0.1.5":"2025-10-24T10:05:11.100Z"},"description":"AutoLab Data SDK - HTTP client with auth bridge and retries","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"readme":"## @autolabz/data-sdk\n\nHTTP client for AutoLab data service with auth bridge, 401 refresh, and retries.\n\n### Install\n\n```bash\nnpm install @autolabz/data-sdk @autolabz/auth-sdk axios\n```\n\n### Usage (React)（使用环境变量配置绝对地址）\n\n```ts\nimport { useAuth, createAuthBridgeFromContext } from '@autolabz/auth-sdk';\nimport { createDataClient } from '@autolabz/data-sdk';\n\nconst authCtx = useAuth();\nconst data = createDataClient({\n  baseURL: import.meta.env.VITE_DATA_BASE_URL, \n  auth: createAuthBridgeFromContext(authCtx),\n});\nconst me = await data.get('/v1/users/me');\n```\n\n### Usage (Node / no React)\n\n```ts\nimport { AuthAPIClient, createAuthBridgeFromClient } from '@autolabz/auth-sdk';\nimport { createDataClient } from '@autolabz/data-sdk';\n\nconst authApi = new AuthAPIClient({ baseURL: 'http://auth:8080' });\nconst auth = createAuthBridgeFromClient(authApi, {\n  getAccessToken: () => process.env.ACCESS_TOKEN ?? null,\n  getClientId: () => process.env.CLIENT_ID ?? null,\n});\nconst data = createDataClient({ baseURL: process.env.DATA_BASE_URL!, auth });\n```\n\n### Features\n\n- Injects `Authorization` and `X-Client-Id` from `auth-sdk`/`oauth-sdk` bridge\n- Retries 429/503/504 with exponential backoff and jitter\n- Auto-refresh on 401 using `auth.refreshAccessToken()`\n- Adds `x-request-id` per request\n\n### API\n\n- `createDataClient(config: DataClientConfig): DataAPIClient`\n- `DataAPIClient` methods: `health()`, `get/post/put/patch/delete`\n- Types: `DataClientConfig`, `RetryPolicy`, `HealthStatus`\n\n#### Versioned KV (ETag/If-Match)\n\n- `createVersionedKV(client: DataAPIClient)` → `{ load(key, prevRevision?), save(key, value, revision?) }`\n- `LoadResult` type: `{ value: any; revision: string; updatedAt: string } | { notModified: true }`\n- Server endpoints: `/v1/data-rev/:key`\n  - GET supports `If-None-Match` and returns 304 when unchanged; ETag holds the `revision`.\n  - PUT uses `If-Match` for optimistic concurrency; 412 on mismatch. Create allowed when no existing row and no `If-Match`.\n\n```ts\nimport { createDataClient, createVersionedKV } from '@autolabz/data-sdk';\nimport { useAuth, createAuthBridgeFromContext } from '@autolabz/auth-sdk';\n\nconst auth = useAuth();\nconst client = createDataClient({\n  baseURL: import.meta.env.VITE_DATA_BASE_URL,\n  auth: createAuthBridgeFromContext(auth),\n});\nconst kv = createVersionedKV(client);\n\n// Load latest (returns data + revision)\nconst r1 = await kv.load('user.snapshot');\nif ('notModified' in r1) {\n  // no-op\n} else {\n  const { value, revision } = r1;\n}\n\n// Conditional load (304 → { notModified: true })\nconst r2 = await kv.load('user.snapshot', 'prev-revision');\nif ('notModified' in r2) {\n  // unchanged\n}\n\n// Save with optimistic concurrency (412 → ConflictError)\ntry {\n  const { newRevision } = await kv.save('user.snapshot', { theme: 'dark' }, 'current-revision');\n} catch (e: any) {\n  if (e?.name === 'ConflictError') {\n    // fetch latest, merge, retry\n  } else {\n    throw e;\n  }\n}\n```\n\n\n\n","readmeFilename":"README.md"}