{"_id":"@affino/datagrid-server-client","_rev":"5-01ec4cc7d59a9665f01b5c30586ccb60","name":"@affino/datagrid-server-client","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"@affino/datagrid-server-client","version":"0.1.0","keywords":["datagrid","server","datasource","client"],"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","_id":"@affino/datagrid-server-client@0.1.0","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://github.com/affinio/affinio/tree/main/packages/datagrid-server-client#readme","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"5efb681539c270b1e5b09cd8307fd60910023fc4","tarball":"https://registry.npmjs.org/@affino/datagrid-server-client/-/datagrid-server-client-0.1.0.tgz","fileCount":28,"integrity":"sha512-AMrixjRQYFuvY5RiK9kzP58PXSh2Sq8178u6P6Dy5wBDkduP/zRYl6ao3ux/+hj+B/t6WpSWehqlkSetr2CJMg==","signatures":[{"sig":"MEUCIFod+QM9CD4zAzE13gJ5TNB5f3iW2RaPND9d/9VmDmRMAiEAyzEp6b+mcNPsa5vluHOYvLZgNQu2FMWtwq29Pb/Sibc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80344},"main":"dist/src/index.js","type":"module","_from":"file:affino-datagrid-server-client-0.1.0.tgz","types":"dist/src/index.d.ts","module":"dist/src/index.js","exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.js"}},"scripts":{"build":"rm -rf dist && tsc -p tsconfig.public.json","type-check":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/a1bdf802deaf2668994b3c2299b17a2d/affino-datagrid-server-client-0.1.0.tgz","_integrity":"sha512-AMrixjRQYFuvY5RiK9kzP58PXSh2Sq8178u6P6Dy5wBDkduP/zRYl6ao3ux/+hj+B/t6WpSWehqlkSetr2CJMg==","repository":{"url":"git+https://github.com/affinio/affinio.git","type":"git","directory":"packages/datagrid-server-client"},"_npmVersion":"10.8.2","description":"Reusable server datasource client helpers for Affino DataGrid","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@affino/datagrid-core":"0.3.23"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/datagrid-server-client_0.1.0_1778140988064_0.6265725660080821","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@affino/datagrid-server-client","version":"0.1.1","keywords":["datagrid","server","datasource","client"],"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","_id":"@affino/datagrid-server-client@0.1.1","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://github.com/affinio/affinio/tree/main/packages/datagrid-server-client#readme","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"93f88082ee56f2c4809bc18a71ea489f21d416ef","tarball":"https://registry.npmjs.org/@affino/datagrid-server-client/-/datagrid-server-client-0.1.1.tgz","fileCount":28,"integrity":"sha512-0oTJIsYT6i+kEI+kgAaMhIwgkXL+7IJQGY2EW8ZAbhtR8ggXpFTPh2ckGO0J0fRTMUxqZUeBZ8F+VLf1/oStYw==","signatures":[{"sig":"MEUCIQCZnjn188ZLwNy54Kep0WpDfqDl4K2YL4Gy5h9ImyzL/AIgQiUa64DmwK4bMjCrWYrlYP+LpBaPNxZMdcFLLroOVMk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80344},"main":"dist/src/index.js","type":"module","_from":"file:affino-datagrid-server-client-0.1.1.tgz","types":"dist/src/index.d.ts","module":"dist/src/index.js","exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.js"}},"scripts":{"build":"rm -rf dist && tsc -p tsconfig.public.json","type-check":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/383c8a0ec0c683f0de6425ab32577531/affino-datagrid-server-client-0.1.1.tgz","_integrity":"sha512-0oTJIsYT6i+kEI+kgAaMhIwgkXL+7IJQGY2EW8ZAbhtR8ggXpFTPh2ckGO0J0fRTMUxqZUeBZ8F+VLf1/oStYw==","repository":{"url":"git+https://github.com/affinio/affinio.git","type":"git","directory":"packages/datagrid-server-client"},"_npmVersion":"10.8.2","description":"Reusable server datasource client helpers for Affino DataGrid","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@affino/datagrid-core":"0.3.25"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/datagrid-server-client_0.1.1_1778343436147_0.1795880025811638","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@affino/datagrid-server-client","version":"0.1.2","keywords":["datagrid","server","datasource","client"],"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","_id":"@affino/datagrid-server-client@0.1.2","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://github.com/affinio/affinio/tree/main/packages/datagrid-server-client#readme","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"77a83f93dc2dc0fe538aad9de3a6935088eabdd1","tarball":"https://registry.npmjs.org/@affino/datagrid-server-client/-/datagrid-server-client-0.1.2.tgz","fileCount":28,"integrity":"sha512-Bck+dnyWd2r2ty3oMdWAmqkJM54YLMmwVwdQafHnT+RKOYsF4HLiqlM7YgZMYElO0gKrg1V4aBTPNeK89gvl6A==","signatures":[{"sig":"MEQCIAUcjDHQ1CLcG5hqXjMFR5bvZAMUkJuAS6FDcwVPi/4oAiBB1QS8N/Y6bgHgJOsBTLs4KSSDdWdxJFm81pZZdtbdNQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81758},"main":"dist/src/index.js","type":"module","_from":"file:affino-datagrid-server-client-0.1.2.tgz","types":"dist/src/index.d.ts","module":"dist/src/index.js","exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.js"}},"scripts":{"build":"rm -rf dist && tsc -p tsconfig.public.json","type-check":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/750749f71db888dbdee73676eba70cf9/affino-datagrid-server-client-0.1.2.tgz","_integrity":"sha512-Bck+dnyWd2r2ty3oMdWAmqkJM54YLMmwVwdQafHnT+RKOYsF4HLiqlM7YgZMYElO0gKrg1V4aBTPNeK89gvl6A==","repository":{"url":"git+https://github.com/affinio/affinio.git","type":"git","directory":"packages/datagrid-server-client"},"_npmVersion":"10.8.2","description":"Reusable server datasource client helpers for Affino DataGrid","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@affino/datagrid-core":"0.3.30"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/datagrid-server-client_0.1.2_1778769487969_0.7458731248714361","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@affino/datagrid-server-client","version":"0.1.3","keywords":["datagrid","server","datasource","client"],"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","_id":"@affino/datagrid-server-client@0.1.3","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://github.com/affinio/affinio/tree/main/packages/datagrid-server-client#readme","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"5829d2063285d71f62c1f6eef50ca4bad452ca57","tarball":"https://registry.npmjs.org/@affino/datagrid-server-client/-/datagrid-server-client-0.1.3.tgz","fileCount":31,"integrity":"sha512-HRWHBPDs8V49/EscJWoChgW9xyJQUbBJa086tUA0Qjp/34yUAqZIQ4QBXWy0ZiG8Hxi5aQZZgWiTxANizA926A==","signatures":[{"sig":"MEQCICZ1jZ9BGFEzaQQyVt9nZt7E1zutNSxnN4SlcAVkNb6DAiA94J7DtvmMscwsVf2stWVJjSe8uu01ehoXQzXFDK7Ifg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95310},"main":"dist/src/index.js","type":"module","_from":"file:affino-datagrid-server-client-0.1.3.tgz","types":"dist/src/index.d.ts","module":"dist/src/index.js","exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.js"}},"scripts":{"build":"rm -rf dist && tsc -p tsconfig.public.json","type-check":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/2cd2729eeaf7af5409a421d7d499edf3/affino-datagrid-server-client-0.1.3.tgz","_integrity":"sha512-HRWHBPDs8V49/EscJWoChgW9xyJQUbBJa086tUA0Qjp/34yUAqZIQ4QBXWy0ZiG8Hxi5aQZZgWiTxANizA926A==","repository":{"url":"git+https://github.com/affinio/affinio.git","type":"git","directory":"packages/datagrid-server-client"},"_npmVersion":"10.8.2","description":"Reusable server datasource client helpers for Affino DataGrid","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@affino/datagrid-core":"0.3.33"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/datagrid-server-client_0.1.3_1779187195647_0.20501998264343002","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@affino/datagrid-server-client","version":"0.1.4","author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"type":"module","description":"Reusable server datasource client helpers for Affino DataGrid","exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.js"}},"main":"dist/src/index.js","types":"dist/src/index.d.ts","module":"dist/src/index.js","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/affinio/datagrid.git","directory":"packages/datagrid-server-client"},"homepage":"https://github.com/affinio/datagrid/tree/main/packages/datagrid-server-client#readme","license":"MIT","keywords":["datagrid","server","datasource","client"],"bugs":{"url":"https://github.com/affinio/datagrid/issues"},"dependencies":{"@affino/datagrid-core":"0.4.0"},"scripts":{"build":"rm -rf dist && tsc -p tsconfig.public.json","type-check":"tsc -p tsconfig.json --noEmit"},"_id":"@affino/datagrid-server-client@0.1.4","_integrity":"sha512-yryK6aLZ8/YbkISXfINwiObl91LFRwAmEfFexGaj0vOkHJlAlfteLTN2ucE9Px/pLOfksovnN+65h1eJZa1qkw==","_resolved":"/tmp/09cf700d9a8c2bc2f89e8970d0ae8487/affino-datagrid-server-client-0.1.4.tgz","_from":"file:affino-datagrid-server-client-0.1.4.tgz","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-yryK6aLZ8/YbkISXfINwiObl91LFRwAmEfFexGaj0vOkHJlAlfteLTN2ucE9Px/pLOfksovnN+65h1eJZa1qkw==","shasum":"ee649a0d67ae069fed21acc21e6b1d239a1e9c12","tarball":"https://registry.npmjs.org/@affino/datagrid-server-client/-/datagrid-server-client-0.1.4.tgz","fileCount":31,"unpackedSize":95350,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCax4sg9uHeTo1tZ+bk4Fwxi2ZVV0Gybza5UgApFVKwYwIhAKvVKoAl8YdUJqJ6szKABau0Z1U5Sl3/sp4gIIrzGz9f"}]},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"directories":{},"maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/datagrid-server-client_0.1.4_1779375698859_0.8074239628945201"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-07T08:03:07.983Z","modified":"2026-05-21T15:01:39.190Z","0.1.0":"2026-05-07T08:03:08.235Z","0.1.1":"2026-05-09T16:17:16.290Z","0.1.2":"2026-05-14T14:38:08.128Z","0.1.3":"2026-05-19T10:39:55.798Z","0.1.4":"2026-05-21T15:01:39.029Z"},"bugs":{"url":"https://github.com/affinio/datagrid/issues"},"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","homepage":"https://github.com/affinio/datagrid/tree/main/packages/datagrid-server-client#readme","keywords":["datagrid","server","datasource","client"],"repository":{"type":"git","url":"git+https://github.com/affinio/datagrid.git","directory":"packages/datagrid-server-client"},"description":"Reusable server datasource client helpers for Affino DataGrid","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"readme":"# Affino DataGrid Server Client\n\nFramework-agnostic transport utilities for server-backed DataGrid:\n\n- HTTP datasource client factory\n- live update transport with polling fallback\n- change feed polling primitive\n- invalidation normalization\n- row snapshot mapping\n- dataset version handling\n\n## What It Is\n\nThis package contains reusable client-side helpers for talking to a server-backed DataGrid datasource. It sits below a framework adapter and above the raw HTTP contract without depending on Vue, a demo implementation, or a backend runtime.\n\n## What It Is Not\n\n- not a backend package\n- not tied to Vue\n- not the opinionated datasource adapter\n\n## Installation\n\n```bash\npnpm add @affino/datagrid-server-client\n```\n\n## Core Concepts\n\n### Dataset Version\n\nUse `normalizeDatasetVersion()` when the server may return a revision or version in either string or number form. The helper normalizes the value to a non-negative integer or returns `null` when the input is unusable.\n\n### Change Feed Poller\n\nUse `createChangeFeedPoller()` to manage polling lifecycle concerns:\n\n- start and stop polling\n- prevent overlapping requests\n- abort in-flight requests on stop\n- bounded retry/backoff for retryable read failures when configured\n- emit lightweight diagnostics\n- reset on invalid since-version responses\n\n### Live Update Transport\n\nUse `createPollingLiveUpdateTransport()` for the default polling-backed live-update transport. Custom websocket or server-sent-event transports can be supplied through `liveUpdateTransportFactory` as long as they feed the same response, invalid-since-version, diagnostics, and applied-change callbacks.\n\n### Row Snapshots\n\nUse `normalizeRowSnapshots()` to normalize raw row payloads or row-entry payloads into `DataGridDataSourceRowEntry` values.\n\n### Invalidation\n\nUse `normalizeDatasourceInvalidation()` to convert server invalidation payloads into `DataGridDataSourceInvalidation` values.\n\n### HTTP Client Factory\n\nUse `createServerDatasourceHttpClient()` when you want a reusable low-level client for read and change-feed transport:\n\n- viewport `pull`\n- column histogram reads\n- change-feed polling\n- transport-neutral live-update lifecycle\n- row snapshot application\n- diagnostics\n- bounded retry/backoff for idempotent reads\n\nWrite, fill, and history operations are backend and adapter-level concerns. If you want the full opinionated integration path, start with `@affino/datagrid-server-adapters`.\n\n### Retry Policy\n\n`createServerDatasourceHttpClient()` retries idempotent reads by default with a bounded policy. This covers `pull`, histogram reads, manual change-feed reads, and polling. Retryable failures are transport failures plus `408`, `425`, `429`, and `5xx` responses.\n\nValidation, auth, stale revision, projection mismatch, boundary mismatch, and abort failures are not retried. Mutations are not retried by this package.\n\nSet `retry: false` to disable read retries, or pass `retry` options to tune `maxRetries`, `initialDelayMs`, `maxDelayMs`, and `backoffFactor`.\n\n## Public API\n\n```ts\nimport {\n  createChangeFeedPoller,\n  createPollingLiveUpdateTransport,\n  createServerDatasourceHttpClient,\n  mapServerChangeEvent,\n  normalizeDatasetVersion,\n  normalizeDatasourceInvalidation,\n  normalizeRowSnapshots,\n} from \"@affino/datagrid-server-client\"\n```\n\nTypes:\n\n- `ServerDatasourceChangeFeedDiagnostics`\n- `ServerDatasourceChangeFeedPoller`\n- `ServerDatasourceChangeFeedPollerOptions`\n- `ServerDatasourceLiveUpdateTransport`\n- `ServerDatasourceLiveUpdateTransportFactory`\n- `ServerDatasourceLiveUpdateTransportKind`\n- `ServerDatasourceRetryOptions`\n- `ServerRowSnapshotLike`\n- `ServerChangeEventLike`\n- `ServerChangeMappingResult`\n- `ServerDatasourceHttpClientOptions`\n\n## Usage\n\n### 1. Polling change feed\n\n```ts\nconst poller = createChangeFeedPoller({\n  getSinceVersion: () => lastSeenVersion,\n  loadSinceVersion: fetchChanges,\n  onResponse: handleChanges,\n})\n\npoller.start()\n```\n\n### 2. Mapping change events\n\n```ts\nconst result = mapServerChangeEvent(change, normalizeDatasourceInvalidation)\n\nif (result.kind === \"upsert\") {\n  // apply rows\n} else {\n  // apply invalidation\n}\n```\n\n### 3. Row snapshot normalization\n\n```ts\nconst rows = normalizeRowSnapshots(serverRows)\n```\n\n### 4. Creating a server datasource client\n\n```ts\nconst client = createServerDatasourceHttpClient({\n  endpoints: {\n    pull: \"/api/pull\",\n    histogram: \"/api/histogram\",\n    changesSinceVersion: sinceVersion => `/api/changes?sinceVersion=${sinceVersion}`,\n  },\n  mapPullResponse: response => ({\n    rows: response.rows,\n    total: response.total,\n    revision: response.revision ?? null,\n    datasetVersion: response.datasetVersion ?? null,\n  }),\n})\n\nclient.startChangeFeedPolling()\n```\n\n`startLiveUpdates()` and `stopLiveUpdates()` are transport-neutral aliases. `startChangeFeedPolling()` and `stopChangeFeedPolling()` remain available for existing polling integrations.\n\nIf you need edits, fill, or history, build those in an adapter or host-specific wrapper that composes this client with backend write endpoints.\n\n## Design Principles\n\n- transport-agnostic\n- deterministic updates\n- no silent partial mutations\n- fail-closed behavior\n\n## Status\n\nExperimental, pre-1.0.\n\n## Boundary Notes\n\n- Keep demo-specific filter, fill, edit, and history request shaping in the sandbox adapter.\n- Keep HTTP transport helpers internal to the package.\n- Use `@affino/datagrid-server-adapters` for the opinionated application entrypoint.\n- Use `@affino/datagrid-core` for shared datasource contracts and row-model types.\n","readmeFilename":"README.md"}