@autolabz/data-sdk
v0.1.5
Published
AutoLab Data SDK - HTTP client with auth bridge and retries
Downloads
31
Readme
@autolabz/data-sdk
HTTP client for AutoLab data service with auth bridge, 401 refresh, and retries.
Install
npm install @autolabz/data-sdk @autolabz/auth-sdk axiosUsage (React)(使用环境变量配置绝对地址)
import { useAuth, createAuthBridgeFromContext } from '@autolabz/auth-sdk';
import { createDataClient } from '@autolabz/data-sdk';
const authCtx = useAuth();
const data = createDataClient({
baseURL: import.meta.env.VITE_DATA_BASE_URL,
auth: createAuthBridgeFromContext(authCtx),
});
const me = await data.get('/v1/users/me');Usage (Node / no React)
import { AuthAPIClient, createAuthBridgeFromClient } from '@autolabz/auth-sdk';
import { createDataClient } from '@autolabz/data-sdk';
const authApi = new AuthAPIClient({ baseURL: 'http://auth:8080' });
const auth = createAuthBridgeFromClient(authApi, {
getAccessToken: () => process.env.ACCESS_TOKEN ?? null,
getClientId: () => process.env.CLIENT_ID ?? null,
});
const data = createDataClient({ baseURL: process.env.DATA_BASE_URL!, auth });Features
- Injects
AuthorizationandX-Client-Idfromauth-sdk/oauth-sdkbridge - Retries 429/503/504 with exponential backoff and jitter
- Auto-refresh on 401 using
auth.refreshAccessToken() - Adds
x-request-idper request
API
createDataClient(config: DataClientConfig): DataAPIClientDataAPIClientmethods:health(),get/post/put/patch/delete- Types:
DataClientConfig,RetryPolicy,HealthStatus
Versioned KV (ETag/If-Match)
createVersionedKV(client: DataAPIClient)→{ load(key, prevRevision?), save(key, value, revision?) }LoadResulttype:{ value: any; revision: string; updatedAt: string } | { notModified: true }- Server endpoints:
/v1/data-rev/:key- GET supports
If-None-Matchand returns 304 when unchanged; ETag holds therevision. - PUT uses
If-Matchfor optimistic concurrency; 412 on mismatch. Create allowed when no existing row and noIf-Match.
- GET supports
import { createDataClient, createVersionedKV } from '@autolabz/data-sdk';
import { useAuth, createAuthBridgeFromContext } from '@autolabz/auth-sdk';
const auth = useAuth();
const client = createDataClient({
baseURL: import.meta.env.VITE_DATA_BASE_URL,
auth: createAuthBridgeFromContext(auth),
});
const kv = createVersionedKV(client);
// Load latest (returns data + revision)
const r1 = await kv.load('user.snapshot');
if ('notModified' in r1) {
// no-op
} else {
const { value, revision } = r1;
}
// Conditional load (304 → { notModified: true })
const r2 = await kv.load('user.snapshot', 'prev-revision');
if ('notModified' in r2) {
// unchanged
}
// Save with optimistic concurrency (412 → ConflictError)
try {
const { newRevision } = await kv.save('user.snapshot', { theme: 'dark' }, 'current-revision');
} catch (e: any) {
if (e?.name === 'ConflictError') {
// fetch latest, merge, retry
} else {
throw e;
}
}