@lunora/client 1.0.0-alpha.25 → 1.0.0-alpha.250

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +16 -3
  2. package/dist/auth/index.d.mts +35 -4
  3. package/dist/auth/index.d.ts +35 -4
  4. package/dist/auth/index.mjs +1 -60
  5. package/dist/index.d.mts +721 -187
  6. package/dist/index.d.ts +721 -187
  7. package/dist/index.mjs +1 -21
  8. package/dist/packem_shared/CONFLICT_ERROR_CODE-B7qNZMMk.mjs +1 -0
  9. package/dist/packem_shared/DEFAULT_MAX_BUFFER-Bd-_iyiV.mjs +1 -0
  10. package/dist/packem_shared/LunoraClient-C-auNTDs.mjs +1 -0
  11. package/dist/packem_shared/OfflineQueue-Ba2qgZK1.mjs +1 -0
  12. package/dist/packem_shared/RETIRE_AFTER_DURABLE_SEQ_ADVANCE-DoEHtuR8.mjs +1 -0
  13. package/dist/packem_shared/SKIP-d7LeP-sY.mjs +1 -0
  14. package/dist/packem_shared/SubscriptionRegistry-BKgQtuh9.mjs +1 -0
  15. package/dist/packem_shared/TabCoordinator-DBuR7Dwv.mjs +1 -0
  16. package/dist/packem_shared/applyDelta-CWpwS3Bb.mjs +1 -0
  17. package/dist/packem_shared/client-tuning-C10B2KCO.mjs +1 -0
  18. package/dist/packem_shared/client-urls-BHLUjjcG.mjs +1 -0
  19. package/dist/packem_shared/connectLiveStream-BdjsWP1-.mjs +1 -0
  20. package/dist/packem_shared/createAsyncStoragePersistence-6FCvqc6C.mjs +1 -0
  21. package/dist/packem_shared/createAsyncStorageQueryCache-COqH5_SV.mjs +1 -0
  22. package/dist/packem_shared/createCallRunner-Bwcrfh76.mjs +1 -0
  23. package/dist/packem_shared/createClientQuery-B8Nfj-7o.mjs +1 -0
  24. package/dist/packem_shared/createInMemoryBookmarkStorage-BooZhW0n.mjs +1 -0
  25. package/dist/packem_shared/createInMemoryPersistence-BfgXApi_.mjs +1 -0
  26. package/dist/packem_shared/createInMemoryQueryCache-B5wX-gTy.mjs +1 -0
  27. package/dist/packem_shared/createLocalStore-CsKA0HPB.mjs +1 -0
  28. package/dist/packem_shared/createMutatorRunner-CuMRJpUx.mjs +1 -0
  29. package/dist/packem_shared/createReconnect-CjTmjJDH.mjs +1 -0
  30. package/dist/packem_shared/createServerClient-kd9cUs8g.mjs +1 -0
  31. package/dist/packem_shared/createSnapshotPrecondition-BXP1NPBW.mjs +1 -0
  32. package/dist/packem_shared/delta-merge-Ls3DED4g.mjs +1 -0
  33. package/dist/packem_shared/deserializePreloaded-CyFK_cv6.mjs +1 -0
  34. package/dist/packem_shared/function-reference.d-Br_hsKje.d.mts +45 -0
  35. package/dist/packem_shared/function-reference.d-Br_hsKje.d.ts +45 -0
  36. package/dist/packem_shared/getServerSession-BaOoo1p6.mjs +1 -0
  37. package/dist/packem_shared/httpStream-B9iENFKq.mjs +7 -0
  38. package/dist/packem_shared/idb-utility-BS7xvou1.mjs +1 -0
  39. package/dist/packem_shared/live-stream-DBKgZlnb.mjs +10 -0
  40. package/dist/packem_shared/liveTopicSubscription-DQtKMFKw.mjs +1 -0
  41. package/dist/packem_shared/local-store-C3bw2MPY.mjs +1 -0
  42. package/dist/packem_shared/lunora-client.d-7WaMRZUK.d.ts +5305 -0
  43. package/dist/packem_shared/lunora-client.d-DtTKDhtw.d.mts +5305 -0
  44. package/dist/packem_shared/offline-queue-BEqCPDmw.mjs +1 -0
  45. package/dist/packem_shared/{preload.d-B6-lqUf2.d.ts → preload.d-B26QlpOB.d.ts} +2 -1
  46. package/dist/packem_shared/{preload.d-Dvk8zg6m.d.mts → preload.d-CT_9YaL9.d.mts} +2 -1
  47. package/dist/packem_shared/preloadQuery-uFy24PCR.mjs +1 -0
  48. package/dist/packem_shared/single-blob-store-DpqSxsgi.mjs +1 -0
  49. package/dist/packem_shared/snapshot-precondition-BEtcSbWr.mjs +1 -0
  50. package/dist/packem_shared/stream-idle-C7CsIT_m.mjs +1 -0
  51. package/dist/packem_shared/wire-errors-BgFi7ONA.mjs +1 -0
  52. package/dist/pagination/index.mjs +1 -61
  53. package/dist/query/index.d.mts +71 -3
  54. package/dist/query/index.d.ts +71 -3
  55. package/dist/query/index.mjs +1 -1
  56. package/dist/service.d.mts +49 -0
  57. package/dist/service.d.ts +49 -0
  58. package/dist/service.mjs +1 -0
  59. package/dist/ssr/index.d.mts +45 -15
  60. package/dist/ssr/index.d.ts +45 -15
  61. package/dist/ssr/index.mjs +1 -4
  62. package/dist/upload.d.mts +35 -0
  63. package/dist/upload.d.ts +35 -0
  64. package/dist/upload.mjs +1 -0
  65. package/package.json +15 -2
  66. package/dist/packem_shared/CONFLICT_ERROR_CODE-B8gQ8tyU.mjs +0 -33
  67. package/dist/packem_shared/ClientServiceWorker-C3PAFwy0.mjs +0 -100
  68. package/dist/packem_shared/DEFAULT_MAX_BUFFER-7hFnzNk9.mjs +0 -110
  69. package/dist/packem_shared/LunoraClient-D3h4P7hg.mjs +0 -3613
  70. package/dist/packem_shared/OfflineQueue-BgarnAub.mjs +0 -1
  71. package/dist/packem_shared/SKIP-vItZChkw.mjs +0 -50
  72. package/dist/packem_shared/SubscriptionRegistry-CxS_Inha.mjs +0 -31
  73. package/dist/packem_shared/TabCoordinator-D_5oNTTt.mjs +0 -258
  74. package/dist/packem_shared/applyDelta-CRKZ1PBt.mjs +0 -81
  75. package/dist/packem_shared/createAsyncStoragePersistence-1Z5BZ8RC.mjs +0 -45
  76. package/dist/packem_shared/createClientQuery-dJZg1ohm.mjs +0 -80
  77. package/dist/packem_shared/createInMemoryBookmarkStorage-BoN7a7TH.mjs +0 -11
  78. package/dist/packem_shared/createInMemoryPersistence-DZ2VHWgm.mjs +0 -79
  79. package/dist/packem_shared/createInMemoryQueryCache-DiaGZkA2.mjs +0 -112
  80. package/dist/packem_shared/createLocalStore-BtqUmOQA.mjs +0 -2
  81. package/dist/packem_shared/createMutationRunner-BqsavzvG.mjs +0 -21
  82. package/dist/packem_shared/createMutatorRunner-BETvCd0p.mjs +0 -31
  83. package/dist/packem_shared/createReconnect-Di_-oHH7.mjs +0 -22
  84. package/dist/packem_shared/createReply-lI4tVS2w.mjs +0 -36
  85. package/dist/packem_shared/createServerClient-DzeC2J3A.mjs +0 -11
  86. package/dist/packem_shared/createSnapshotPrecondition-CxQ1T4ZP.mjs +0 -18
  87. package/dist/packem_shared/deserializePreloaded-C0eJTY_W.mjs +0 -4
  88. package/dist/packem_shared/getServerSession-8jXewqxd.mjs +0 -13
  89. package/dist/packem_shared/httpStream-DIdL8NEw.mjs +0 -168
  90. package/dist/packem_shared/idb-utility-DrSVX43Q.mjs +0 -48
  91. package/dist/packem_shared/local-store-DIq-UWfD.mjs +0 -106
  92. package/dist/packem_shared/lunora-client.d-C4ud8bej.d.mts +0 -2834
  93. package/dist/packem_shared/lunora-client.d-C4ud8bej.d.ts +0 -2834
  94. package/dist/packem_shared/offline-queue-N-1JvYb4.mjs +0 -211
  95. package/dist/packem_shared/preloadQuery-lobFkD2Z.mjs +0 -13
  96. package/dist/packem_shared/wire-key-Djie6aaR.mjs +0 -266
@@ -0,0 +1,35 @@
1
+ import { UploadControl, HeadersResolver, UploadRestrictions, ChunkedRestAdapter, MultipartAdapter, TusAdapter } from '@visulima/storage-client';
2
+ export { type ChunkedRestAdapter, type ChunkedRestAdapterOptions, type FingerprintFunction, type HeadersResolver, LocalStorageUrlStorage, MemoryUrlStorage, type MultipartAdapter, type MultipartAdapterOptions, type OnBeforeRequest, type RequestOptions, RestrictionError, type TusAdapter, type TusAdapterOptions, type UploadControl, UploadError, type UploadMethod, type UploadRestrictions, type UploadResult, type Uploader, type UrlStorage, createChunkedRestAdapter, createMultipartAdapter, createTusAdapter, putFile, validateFile, validateFiles } from '@visulima/storage-client';
3
+ /** Resumable upload wire protocols {@link createUpload} can drive. */
4
+ type UploadProtocol = "chunked-rest" | "multipart" | "tus";
5
+ /** The adapter shape {@link createUpload} returns — a `.upload(file)` driver plus lifecycle callbacks. */
6
+ type UploadAdapter = ChunkedRestAdapter | MultipartAdapter | TusAdapter;
7
+ /** Options for {@link createUpload}. */
8
+ interface CreateUploadOptions {
9
+ /** Chunk size in bytes (TUS / chunked-REST only). */
10
+ chunkSize?: number;
11
+ /** A shared {@link UploadControl} for pause/resume/cancel (TUS / chunked-REST). */
12
+ control?: UploadControl;
13
+ /** The upload endpoint — a route backed by `@lunora/storage/upload`'s handler. */
14
+ endpoint: string;
15
+ /** Static or dynamically-resolved request headers (e.g. an `Authorization` token). */
16
+ headers?: HeadersResolver;
17
+ /** Maximum retry attempts (TUS / chunked-REST, when `retry` is on). */
18
+ maxRetries?: number;
19
+ /** Extra metadata sent with the upload. */
20
+ metadata?: Record<string, string>;
21
+ /** Which protocol to speak. Default `"tus"` (resumable, pause/resume-capable). */
22
+ protocol?: UploadProtocol;
23
+ /** Client-side size/type restrictions, validated before any network request. */
24
+ restrictions?: UploadRestrictions;
25
+ /** Enable automatic retry on failure (TUS / chunked-REST). */
26
+ retry?: boolean;
27
+ }
28
+ /**
29
+ * Create a protocol-appropriate upload adapter against an RLS-gated endpoint.
30
+ * Defaults to TUS — the resumable path that survives pause/resume and a dropped
31
+ * connection. Call `.upload(file)` to start; use the shared {@link UploadControl}
32
+ * (or the adapter's `pause`/`resume`/`abort`) to steer it.
33
+ */
34
+ declare const createUpload: (options: CreateUploadOptions) => UploadAdapter;
35
+ export { CreateUploadOptions, UploadAdapter, UploadProtocol, createUpload };
@@ -0,0 +1 @@
1
+ import{createMultipartAdapter as d,createChunkedRestAdapter as u,createTusAdapter as m}from"@visulima/storage-client";import{LocalStorageUrlStorage as S,MemoryUrlStorage as f,RestrictionError as g,UploadControl as x,UploadError as C,createChunkedRestAdapter as F,createMultipartAdapter as M,createTusAdapter as O,putFile as v,validateFile as y,validateFiles as E}from"@visulima/storage-client";const U=t=>{const r=t.protocol??"tus",{chunkSize:s,control:n,endpoint:e,headers:a,maxRetries:o,metadata:p,restrictions:i,retry:l}=t;if(r==="multipart")return d({endpoint:e,headers:a,maxRetries:o,metadata:p,restrictions:i,retry:l});const c={chunkSize:s,control:n,endpoint:e,headers:a,maxRetries:o,metadata:p,restrictions:i,retry:l};return r==="chunked-rest"?u(c):m(c)};export{S as LocalStorageUrlStorage,f as MemoryUrlStorage,g as RestrictionError,x as UploadControl,C as UploadError,F as createChunkedRestAdapter,M as createMultipartAdapter,O as createTusAdapter,U as createUpload,v as putFile,y as validateFile,E as validateFiles};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lunora/client",
3
- "version": "1.0.0-alpha.25",
3
+ "version": "1.0.0-alpha.250",
4
4
  "description": "Lunora browser SDK: WebSocket transport, optimistic updates, and an offline mutation queue",
5
5
  "keywords": [
6
6
  "cloudflare",
@@ -56,13 +56,26 @@
56
56
  "types": "./dist/ssr/index.d.ts",
57
57
  "import": "./dist/ssr/index.mjs"
58
58
  },
59
+ "./upload": {
60
+ "types": "./dist/upload.d.ts",
61
+ "import": "./dist/upload.mjs"
62
+ },
63
+ "./service": {
64
+ "types": "./dist/service.d.ts",
65
+ "import": "./dist/service.mjs"
66
+ },
59
67
  "./package.json": "./package.json"
60
68
  },
61
69
  "publishConfig": {
62
70
  "access": "public"
63
71
  },
64
72
  "dependencies": {
65
- "@lunora/errors": "1.0.0-alpha.6"
73
+ "@lunora/errors": ">=1.0.0-alpha.51 <2.0.0-0",
74
+ "@lunora/wire": "1.0.0-alpha.2",
75
+ "@visulima/storage-client": "1.0.9"
76
+ },
77
+ "peerDependencies": {
78
+ "@lunora/runtime": ">=1.0.0-alpha.76 <2.0.0-0"
66
79
  },
67
80
  "engines": {
68
81
  "node": "^22.15.0 || >=24.11.0"
@@ -1,33 +0,0 @@
1
- const LUNORA_ERROR_CODES = [
2
- "BAD_REQUEST",
3
- "CONFLICT",
4
- "COUNT_RLS_UNSUPPORTED",
5
- "FORBIDDEN",
6
- "INTERNAL_SERVER_ERROR",
7
- "MASK_UNSUPPORTED",
8
- "NOT_FOUND",
9
- "NOT_IMPLEMENTED",
10
- "RELATION_PREDICATE_UNSUPPORTED",
11
- "TOO_MANY_REQUESTS",
12
- "UNAUTHORIZED",
13
- "UNPROCESSABLE"
14
- ];
15
- const KNOWN_ERROR_CODES = new Set(LUNORA_ERROR_CODES);
16
- const CONFLICT_ERROR_CODE = "CONFLICT";
17
- const isConflictError = (error) => error instanceof Error && error.code === CONFLICT_ERROR_CODE;
18
- const isForbiddenError = (error) => error instanceof Error && error.code === "FORBIDDEN";
19
- const isUnauthorizedError = (error) => error instanceof Error && error.code === "UNAUTHORIZED";
20
- const isRateLimitedError = (error) => error instanceof Error && error.code === "TOO_MANY_REQUESTS";
21
- const getErrorCode = (error) => {
22
- if (!(error instanceof Error)) {
23
- return void 0;
24
- }
25
- const { code } = error;
26
- return typeof code === "string" && KNOWN_ERROR_CODES.has(code) ? code : void 0;
27
- };
28
- const getRetryAfterMs = (error) => {
29
- const value = error?.data?.retryAfterMs;
30
- return typeof value === "number" && Number.isFinite(value) ? value : void 0;
31
- };
32
-
33
- export { CONFLICT_ERROR_CODE, getErrorCode, getRetryAfterMs, isConflictError, isForbiddenError, isRateLimitedError, isUnauthorizedError };
@@ -1,100 +0,0 @@
1
- class ClientServiceWorker {
2
- swUrl;
3
- scope;
4
- #registration = void 0;
5
- #status = "unregistered";
6
- #onStatusChange;
7
- #messageHandlers = /* @__PURE__ */ new Set();
8
- constructor(options) {
9
- this.swUrl = options.swUrl;
10
- this.scope = options.scope ?? "/";
11
- this.#onStatusChange = options.onStatusChange;
12
- }
13
- // ── Status ──────────────────────────────────────────────────────────
14
- /** Current registration status. */
15
- get status() {
16
- return this.#status;
17
- }
18
- /** The underlying `ServiceWorkerRegistration`, if registered. */
19
- get registration() {
20
- return this.#registration;
21
- }
22
- /** Whether the SW is currently controlling this page. */
23
- get active() {
24
- return this.#registration?.active !== null && this.#registration?.active !== void 0;
25
- }
26
- // ── Registration ────────────────────────────────────────────────────
27
- /**
28
- * Register the service worker.
29
- *
30
- * Returns `false` when the browser does not support service workers.
31
- */
32
- async register() {
33
- if (!("serviceWorker" in navigator)) {
34
- this.#setStatus("unsupported");
35
- return false;
36
- }
37
- this.#setStatus("registering");
38
- try {
39
- this.#registration = await navigator.serviceWorker.register(this.swUrl, {
40
- scope: this.scope
41
- });
42
- this.#setStatus("active");
43
- navigator.serviceWorker.addEventListener("message", this.#onMessage);
44
- } catch {
45
- this.#setStatus("error");
46
- return false;
47
- }
48
- return true;
49
- }
50
- /**
51
- * Remove the active service worker registration and clear listeners.
52
- *
53
- * Returns `false` when no registration is currently held.
54
- */
55
- async unregister() {
56
- if (!this.#registration) {
57
- return false;
58
- }
59
- navigator.serviceWorker.removeEventListener("message", this.#onMessage);
60
- const ok = await this.#registration.unregister();
61
- this.#registration = void 0;
62
- this.#setStatus("unregistered");
63
- return ok;
64
- }
65
- // ── Messaging ───────────────────────────────────────────────────────
66
- /**
67
- * Send a message to the active service worker.
68
- */
69
- postMessage(message) {
70
- const active = this.#registration?.active;
71
- if (active) {
72
- active.postMessage(message);
73
- }
74
- }
75
- /**
76
- * Register a handler for messages **from** the service worker.
77
- * @returns Unsubscribe function.
78
- */
79
- onMessage(handler) {
80
- this.#messageHandlers.add(handler);
81
- return () => {
82
- this.#messageHandlers.delete(handler);
83
- };
84
- }
85
- // ── Internals ───────────────────────────────────────────────────────
86
- #setStatus(status) {
87
- this.#status = status;
88
- this.#onStatusChange?.(status);
89
- }
90
- #onMessage = (event) => {
91
- for (const handler of this.#messageHandlers) {
92
- try {
93
- handler(event);
94
- } catch {
95
- }
96
- }
97
- };
98
- }
99
-
100
- export { ClientServiceWorker };
@@ -1,110 +0,0 @@
1
- import { LunoraError } from '@lunora/errors';
2
-
3
- const DEFAULT_MAX_BUFFER = 1024;
4
- const createStream = (options) => {
5
- const maxBuffer = options.maxBuffer ?? DEFAULT_MAX_BUFFER;
6
- const buffer = [];
7
- const pending = [];
8
- let done = false;
9
- let failure;
10
- let cancelled = false;
11
- const flushOne = () => {
12
- const waiter = pending.shift();
13
- if (!waiter) {
14
- return false;
15
- }
16
- if (failure) {
17
- waiter.reject(failure);
18
- return true;
19
- }
20
- if (buffer.length > 0) {
21
- const value = buffer.shift();
22
- waiter.resolve({ done: false, value });
23
- return true;
24
- }
25
- if (done) {
26
- waiter.resolve({ done: true, value: void 0 });
27
- return true;
28
- }
29
- pending.unshift(waiter);
30
- return false;
31
- };
32
- const handle = {
33
- complete() {
34
- if (done || failure) {
35
- return;
36
- }
37
- done = true;
38
- while (flushOne()) {
39
- }
40
- },
41
- fail(error) {
42
- if (done || failure) {
43
- return;
44
- }
45
- failure = error;
46
- buffer.length = 0;
47
- while (flushOne()) {
48
- }
49
- },
50
- push(value) {
51
- if (done || failure || cancelled) {
52
- return;
53
- }
54
- if (buffer.length >= maxBuffer) {
55
- handle.fail(
56
- new LunoraError(
57
- "STREAM_BACKPRESSURE",
58
- `stream buffer overflow (max=${maxBuffer.toString()}); the consumer cannot keep up with the producer`
59
- )
60
- );
61
- return;
62
- }
63
- buffer.push(value);
64
- flushOne();
65
- }
66
- };
67
- const cancel = () => {
68
- if (cancelled) {
69
- return;
70
- }
71
- cancelled = true;
72
- done = true;
73
- buffer.length = 0;
74
- try {
75
- options.onCancel();
76
- } catch {
77
- }
78
- while (flushOne()) {
79
- }
80
- };
81
- const iterable = {
82
- cancel,
83
- [Symbol.asyncIterator]() {
84
- return {
85
- next() {
86
- if (failure) {
87
- return Promise.reject(failure);
88
- }
89
- if (buffer.length > 0) {
90
- const value = buffer.shift();
91
- return Promise.resolve({ done: false, value });
92
- }
93
- if (done) {
94
- return Promise.resolve({ done: true, value: void 0 });
95
- }
96
- return new Promise((resolve, reject) => {
97
- pending.push({ reject, resolve });
98
- });
99
- },
100
- return() {
101
- cancel();
102
- return Promise.resolve({ done: true, value: void 0 });
103
- }
104
- };
105
- }
106
- };
107
- return { handle, iterable };
108
- };
109
-
110
- export { DEFAULT_MAX_BUFFER, createStream };