@miurajs/miura-data-flow 0.0.3 → 0.1.4

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 (64) hide show
  1. package/README.md +187 -16
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +2 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/src/global-state.d.ts +79 -0
  7. package/dist/src/global-state.d.ts.map +1 -0
  8. package/dist/src/global-state.js +111 -0
  9. package/dist/src/global-state.js.map +1 -0
  10. package/dist/src/middleware.d.ts +38 -0
  11. package/dist/src/middleware.d.ts.map +1 -0
  12. package/dist/src/middleware.js +143 -0
  13. package/dist/src/middleware.js.map +1 -0
  14. package/{src/miura-data-flow.ts → dist/src/miura-data-flow.d.ts} +38 -67
  15. package/dist/src/miura-data-flow.d.ts.map +1 -0
  16. package/dist/src/miura-data-flow.js +96 -0
  17. package/dist/src/miura-data-flow.js.map +1 -0
  18. package/{src/providers/index.ts → dist/src/providers/index.d.ts} +1 -5
  19. package/dist/src/providers/index.d.ts.map +1 -0
  20. package/dist/src/providers/index.js +11 -0
  21. package/dist/src/providers/index.js.map +1 -0
  22. package/dist/src/providers/indexed-db-provider.d.ts +9 -0
  23. package/dist/src/providers/indexed-db-provider.d.ts.map +1 -0
  24. package/dist/src/providers/indexed-db-provider.js +35 -0
  25. package/dist/src/providers/indexed-db-provider.js.map +1 -0
  26. package/dist/src/providers/local-storage-provider.d.ts +7 -0
  27. package/dist/src/providers/local-storage-provider.d.ts.map +1 -0
  28. package/dist/src/providers/local-storage-provider.js +29 -0
  29. package/dist/src/providers/local-storage-provider.js.map +1 -0
  30. package/dist/src/providers/provider-manager.d.ts +4 -0
  31. package/dist/src/providers/provider-manager.d.ts.map +1 -0
  32. package/dist/src/providers/provider-manager.js +15 -0
  33. package/dist/src/providers/provider-manager.js.map +1 -0
  34. package/dist/src/providers/provider.d.ts +12 -0
  35. package/dist/src/providers/provider.d.ts.map +1 -0
  36. package/dist/src/providers/provider.js +2 -0
  37. package/dist/src/providers/provider.js.map +1 -0
  38. package/dist/src/providers/rest-provider.d.ts +86 -0
  39. package/dist/src/providers/rest-provider.d.ts.map +1 -0
  40. package/dist/src/providers/rest-provider.js +210 -0
  41. package/dist/src/providers/rest-provider.js.map +1 -0
  42. package/dist/src/providers/websockets-provider.d.ts +9 -0
  43. package/dist/src/providers/websockets-provider.d.ts.map +1 -0
  44. package/dist/src/providers/websockets-provider.js +43 -0
  45. package/dist/src/providers/websockets-provider.js.map +1 -0
  46. package/dist/src/store.d.ts +94 -0
  47. package/dist/src/store.d.ts.map +1 -0
  48. package/dist/src/store.js +169 -0
  49. package/dist/src/store.js.map +1 -0
  50. package/dist/tsconfig.tsbuildinfo +1 -0
  51. package/package.json +34 -7
  52. package/src/providers/graphql-provider.ts +13 -7
  53. package/index.ts +0 -1
  54. package/src/global-state.ts +0 -158
  55. package/src/middleware.ts +0 -162
  56. package/src/providers/indexed-db-provider.ts +0 -48
  57. package/src/providers/local-storage-provider.ts +0 -36
  58. package/src/providers/provider-manager.ts +0 -21
  59. package/src/providers/provider.ts +0 -23
  60. package/src/providers/rest-provider.ts +0 -351
  61. package/src/providers/websockets-provider.ts +0 -54
  62. package/src/store.ts +0 -237
  63. package/stories/data-flow-demo.stories.ts +0 -640
  64. package/tsconfig.json +0 -17
@@ -0,0 +1,86 @@
1
+ import { DataProvider, ProviderFactory } from './provider';
2
+ export declare class RestError extends Error {
3
+ readonly status: number;
4
+ readonly statusText: string;
5
+ readonly body: unknown;
6
+ readonly url: string;
7
+ constructor(status: number, statusText: string, body: unknown, url: string);
8
+ }
9
+ export type RequestInterceptor = (url: string, init: RequestInit) => RequestInit | Promise<RequestInit>;
10
+ export type ResponseInterceptor = (response: Response, url: string) => Response | Promise<Response>;
11
+ export interface PaginationConfig {
12
+ /** Strategy for adding pagination params to the request */
13
+ strategy: 'query' | 'header' | 'cursor';
14
+ /** Query param name for page number (query strategy) */
15
+ pageParam?: string;
16
+ /** Query param name for page size (query strategy) */
17
+ pageSizeParam?: string;
18
+ /** Default page size */
19
+ pageSize?: number;
20
+ /** Extract total count from response (used to determine if more pages exist) */
21
+ totalExtractor?: (response: Response, body: unknown) => number;
22
+ /** Extract next cursor from response body (cursor strategy) */
23
+ cursorExtractor?: (body: unknown) => string | null;
24
+ }
25
+ export interface PageResult<T> {
26
+ data: T[];
27
+ total: number;
28
+ page: number;
29
+ pageSize: number;
30
+ hasMore: boolean;
31
+ nextCursor?: string | null;
32
+ }
33
+ export interface RetryConfig {
34
+ /** Maximum number of retry attempts (default: 3) */
35
+ maxAttempts: number;
36
+ /** Initial delay in ms before first retry (default: 300) */
37
+ initialDelay: number;
38
+ /** Multiplier applied to delay on each subsequent attempt (default: 2) */
39
+ backoffFactor: number;
40
+ /** HTTP status codes that should trigger a retry (default: [429, 500, 502, 503, 504]) */
41
+ retryOn: number[];
42
+ }
43
+ export interface RestProviderOptions {
44
+ /** Base URL — path segments are appended to this */
45
+ baseUrl: string;
46
+ /** Default headers merged into every request */
47
+ headers?: Record<string, string>;
48
+ /** Request timeout in ms (default: 30_000) */
49
+ timeout?: number;
50
+ /** Retry configuration */
51
+ retry?: Partial<RetryConfig>;
52
+ /** Response cache TTL in ms — set to 0 to disable (default: 0) */
53
+ cacheTtl?: number;
54
+ /** Pagination defaults */
55
+ pagination?: PaginationConfig;
56
+ /** Called before every request — use to inject auth headers, sign requests, etc. */
57
+ requestInterceptors?: RequestInterceptor[];
58
+ /** Called after every successful response — use to unwrap envelopes, normalise shapes, etc. */
59
+ responseInterceptors?: ResponseInterceptor[];
60
+ }
61
+ export interface QueryOptions {
62
+ endpoint: string;
63
+ params?: Record<string, string | number | boolean>;
64
+ headers?: Record<string, string>;
65
+ signal?: AbortSignal;
66
+ }
67
+ export interface GetOptions {
68
+ endpoint: string;
69
+ headers?: Record<string, string>;
70
+ signal?: AbortSignal;
71
+ }
72
+ export interface MutateOptions<T> {
73
+ endpoint: string;
74
+ data: T;
75
+ method?: 'POST' | 'PUT' | 'PATCH';
76
+ headers?: Record<string, string>;
77
+ signal?: AbortSignal;
78
+ }
79
+ export interface PaginatedQueryOptions extends QueryOptions {
80
+ page?: number;
81
+ cursor?: string;
82
+ }
83
+ export declare class RestProviderFactory implements ProviderFactory {
84
+ create<T>(options: RestProviderOptions): DataProvider<T>;
85
+ }
86
+ //# sourceMappingURL=rest-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-provider.d.ts","sourceRoot":"","sources":["../../../src/providers/rest-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAI3D,qBAAa,SAAU,SAAQ,KAAK;aAEhB,MAAM,EAAE,MAAM;aACd,UAAU,EAAE,MAAM;aAClB,IAAI,EAAE,OAAO;aACb,GAAG,EAAE,MAAM;gBAHX,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,MAAM;CAK9B;AAID,MAAM,MAAM,kBAAkB,GAAG,CAC/B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,KACd,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAExC,MAAM,MAAM,mBAAmB,GAAG,CAChC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,MAAM,KACR,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAIlC,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACxC,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC;IAC/D,+DAA+D;IAC/D,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAWD,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,aAAa,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,oFAAoF;IACpF,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC3C,+FAA+F;IAC/F,oBAAoB,CAAC,EAAE,mBAAmB,EAAE,CAAC;CAC9C;AAID,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,CAAC,CAAC;IACR,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,qBAAsB,SAAQ,YAAY;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAmOD,qBAAa,mBAAoB,YAAW,eAAe;IACzD,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAAC,CAAC,CAAC;CAGzD"}
@@ -0,0 +1,210 @@
1
+ // ── Error type ────────────────────────────────────────────────────────────────
2
+ export class RestError extends Error {
3
+ status;
4
+ statusText;
5
+ body;
6
+ url;
7
+ constructor(status, statusText, body, url) {
8
+ super(`[${status}] ${statusText} — ${url}`);
9
+ this.status = status;
10
+ this.statusText = statusText;
11
+ this.body = body;
12
+ this.url = url;
13
+ this.name = 'RestError';
14
+ }
15
+ }
16
+ // ── Implementation ────────────────────────────────────────────────────────────
17
+ class RestProvider {
18
+ options;
19
+ retryConfig;
20
+ cache = new Map();
21
+ constructor(options) {
22
+ this.options = options;
23
+ this.retryConfig = {
24
+ maxAttempts: 3,
25
+ initialDelay: 300,
26
+ backoffFactor: 2,
27
+ retryOn: [429, 500, 502, 503, 504],
28
+ ...options.retry,
29
+ };
30
+ }
31
+ // ── Public API ─────────────────────────────────────────────────
32
+ async query(options) {
33
+ const url = this.buildUrl(options.endpoint, options.params);
34
+ const cached = this.getCache(url);
35
+ if (cached)
36
+ return cached;
37
+ const response = await this.request(url, { method: 'GET', headers: this.mergeHeaders(options.headers) }, options.signal);
38
+ const data = await response.json();
39
+ this.setCache(url, data);
40
+ return data;
41
+ }
42
+ async get(id, options) {
43
+ const url = this.buildUrl(`${options.endpoint}/${id}`);
44
+ const cached = this.getCache(url);
45
+ if (cached)
46
+ return cached;
47
+ const response = await this.request(url, { method: 'GET', headers: this.mergeHeaders(options.headers) }, options.signal);
48
+ const data = await response.json();
49
+ this.setCache(url, data);
50
+ return data;
51
+ }
52
+ async mutate(options) {
53
+ const url = this.buildUrl(options.endpoint);
54
+ this.invalidateCachePrefix(options.endpoint);
55
+ const response = await this.request(url, {
56
+ method: options.method ?? 'POST',
57
+ headers: this.mergeHeaders(options.headers),
58
+ body: JSON.stringify(options.data),
59
+ }, options.signal);
60
+ return response.json();
61
+ }
62
+ async put(id, data, options) {
63
+ return this.mutate({ endpoint: `${options.endpoint}/${id}`, data, method: 'PUT', headers: options.headers, signal: options.signal });
64
+ }
65
+ async delete(id, options) {
66
+ const url = this.buildUrl(`${options.endpoint}/${id}`);
67
+ this.invalidateCachePrefix(options.endpoint);
68
+ await this.request(url, { method: 'DELETE', headers: this.mergeHeaders(options.headers) }, options.signal);
69
+ }
70
+ async queryPage(options) {
71
+ const pagination = this.options.pagination;
72
+ const params = { ...options.params };
73
+ if (pagination?.strategy === 'query') {
74
+ const pageParam = pagination.pageParam ?? 'page';
75
+ const sizeParam = pagination.pageSizeParam ?? 'pageSize';
76
+ params[pageParam] = options.page ?? 1;
77
+ params[sizeParam] = pagination.pageSize ?? 20;
78
+ }
79
+ else if (pagination?.strategy === 'cursor' && options.cursor) {
80
+ params['cursor'] = options.cursor;
81
+ }
82
+ const url = this.buildUrl(options.endpoint, params);
83
+ const response = await this.request(url, { method: 'GET', headers: this.mergeHeaders(options.headers) }, options.signal);
84
+ const body = await response.json();
85
+ const data = Array.isArray(body) ? body : body.data;
86
+ const total = pagination?.totalExtractor?.(response, body) ?? data.length;
87
+ const pageSize = (pagination?.pageSize ?? 20);
88
+ const page = options.page ?? 1;
89
+ const nextCursor = pagination?.cursorExtractor?.(body) ?? null;
90
+ return {
91
+ data,
92
+ total,
93
+ page,
94
+ pageSize,
95
+ hasMore: nextCursor != null || page * pageSize < total,
96
+ nextCursor,
97
+ };
98
+ }
99
+ // ── Core fetch with interceptors, retry, and timeout ───────────
100
+ async request(url, init, signal) {
101
+ let resolvedInit = await this.applyRequestInterceptors(url, init);
102
+ const timeoutMs = this.options.timeout ?? 30_000;
103
+ const attempt = async (attemptsLeft, delay) => {
104
+ const controller = new AbortController();
105
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
106
+ // Merge caller signal with our timeout signal
107
+ const combinedSignal = signal
108
+ ? this.mergeSignals(signal, controller.signal)
109
+ : controller.signal;
110
+ try {
111
+ const response = await fetch(url, { ...resolvedInit, signal: combinedSignal });
112
+ clearTimeout(timeoutId);
113
+ if (!response.ok && this.retryConfig.retryOn.includes(response.status) && attemptsLeft > 0) {
114
+ await this.sleep(delay);
115
+ return attempt(attemptsLeft - 1, delay * this.retryConfig.backoffFactor);
116
+ }
117
+ if (!response.ok) {
118
+ const body = await response.json().catch(() => null);
119
+ throw new RestError(response.status, response.statusText, body, url);
120
+ }
121
+ return this.applyResponseInterceptors(response, url);
122
+ }
123
+ catch (err) {
124
+ clearTimeout(timeoutId);
125
+ if (err instanceof RestError)
126
+ throw err;
127
+ // Network / abort error — retry if attempts remain
128
+ if (attemptsLeft > 0 && !(signal?.aborted)) {
129
+ await this.sleep(delay);
130
+ return attempt(attemptsLeft - 1, delay * this.retryConfig.backoffFactor);
131
+ }
132
+ throw err;
133
+ }
134
+ };
135
+ return attempt(this.retryConfig.maxAttempts - 1, this.retryConfig.initialDelay);
136
+ }
137
+ async applyRequestInterceptors(url, init) {
138
+ let result = init;
139
+ for (const interceptor of this.options.requestInterceptors ?? []) {
140
+ result = await interceptor(url, result);
141
+ }
142
+ return result;
143
+ }
144
+ async applyResponseInterceptors(response, url) {
145
+ let result = response;
146
+ for (const interceptor of this.options.responseInterceptors ?? []) {
147
+ result = await interceptor(result, url);
148
+ }
149
+ return result;
150
+ }
151
+ // ── Helpers ────────────────────────────────────────────────────
152
+ buildUrl(path, params) {
153
+ const base = this.options.baseUrl.replace(/\/$/, '');
154
+ const normalised = path.startsWith('/') ? path : `/${path}`;
155
+ const url = `${base}${normalised}`;
156
+ if (!params || Object.keys(params).length === 0)
157
+ return url;
158
+ const qs = new URLSearchParams(Object.entries(params).map(([k, v]) => [k, String(v)])).toString();
159
+ return `${url}?${qs}`;
160
+ }
161
+ mergeHeaders(extra) {
162
+ return {
163
+ 'Content-Type': 'application/json',
164
+ ...this.options.headers,
165
+ ...extra,
166
+ };
167
+ }
168
+ mergeSignals(a, b) {
169
+ const controller = new AbortController();
170
+ const abort = () => controller.abort();
171
+ a.addEventListener('abort', abort, { once: true });
172
+ b.addEventListener('abort', abort, { once: true });
173
+ return controller.signal;
174
+ }
175
+ sleep(ms) {
176
+ return new Promise(resolve => setTimeout(resolve, ms));
177
+ }
178
+ // ── Cache helpers ──────────────────────────────────────────────
179
+ getCache(key) {
180
+ if (!this.options.cacheTtl)
181
+ return null;
182
+ const entry = this.cache.get(key);
183
+ if (!entry)
184
+ return null;
185
+ if (Date.now() > entry.expiresAt) {
186
+ this.cache.delete(key);
187
+ return null;
188
+ }
189
+ return entry.data;
190
+ }
191
+ setCache(key, data) {
192
+ if (!this.options.cacheTtl)
193
+ return;
194
+ this.cache.set(key, { data, expiresAt: Date.now() + this.options.cacheTtl });
195
+ }
196
+ invalidateCachePrefix(prefix) {
197
+ const normalised = this.buildUrl(prefix);
198
+ for (const key of this.cache.keys()) {
199
+ if (key.startsWith(normalised))
200
+ this.cache.delete(key);
201
+ }
202
+ }
203
+ }
204
+ // ── Factory ───────────────────────────────────────────────────────────────────
205
+ export class RestProviderFactory {
206
+ create(options) {
207
+ return new RestProvider(options);
208
+ }
209
+ }
210
+ //# sourceMappingURL=rest-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-provider.js","sourceRoot":"","sources":["../../../src/providers/rest-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { DataProvider, ProviderFactory } from './provider';
2
+ export interface WebSocketProviderOptions {
3
+ url: string;
4
+ protocols?: string | string[];
5
+ }
6
+ export declare class WebSocketProviderFactory implements ProviderFactory {
7
+ create<T>(options: WebSocketProviderOptions): DataProvider<T>;
8
+ }
9
+ //# sourceMappingURL=websockets-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websockets-provider.d.ts","sourceRoot":"","sources":["../../../src/providers/websockets-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC/B;AA4CD,qBAAa,wBAAyB,YAAW,eAAe;IAC9D,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,wBAAwB,GAAG,YAAY,CAAC,CAAC,CAAC;CAG9D"}
@@ -0,0 +1,43 @@
1
+ class WebSocketProvider {
2
+ ws;
3
+ constructor(options) {
4
+ this.ws = new WebSocket(options.url, options.protocols);
5
+ }
6
+ subscribe(options, callback) {
7
+ const handler = (event) => {
8
+ try {
9
+ const message = JSON.parse(event.data);
10
+ // Assuming a message format of { event: 'name', payload: ... }
11
+ if (message.event === options.event) {
12
+ callback(message.payload);
13
+ }
14
+ }
15
+ catch (e) {
16
+ console.error('Error parsing WebSocket message', e);
17
+ }
18
+ };
19
+ this.ws.addEventListener('message', handler);
20
+ // Return an unsubscribe function
21
+ return () => {
22
+ this.ws.removeEventListener('message', handler);
23
+ };
24
+ }
25
+ // A method to send data back to the server
26
+ send(event, payload) {
27
+ if (this.ws.readyState === WebSocket.OPEN) {
28
+ this.ws.send(JSON.stringify({ event, payload }));
29
+ }
30
+ else {
31
+ console.warn('WebSocket is not open. Cannot send message.');
32
+ }
33
+ }
34
+ close() {
35
+ this.ws.close();
36
+ }
37
+ }
38
+ export class WebSocketProviderFactory {
39
+ create(options) {
40
+ return new WebSocketProvider(options);
41
+ }
42
+ }
43
+ //# sourceMappingURL=websockets-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websockets-provider.js","sourceRoot":"","sources":["../../../src/providers/websockets-provider.ts"],"names":[],"mappings":"AAOA,MAAM,iBAAiB;IACb,EAAE,CAAY;IAEtB,YAAY,OAAiC;QAC3C,IAAI,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED,SAAS,CAAC,OAA0B,EAAE,QAA2B;QAC/D,MAAM,OAAO,GAAG,CAAC,KAAmB,EAAE,EAAE;YACtC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACvC,+DAA+D;gBAC/D,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;oBACpC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAE7C,iCAAiC;QACjC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,IAAI,CAAC,KAAa,EAAE,OAAY;QAC9B,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC1C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF;AAED,MAAM,OAAO,wBAAwB;IACnC,MAAM,CAAI,OAAiC;QACzC,OAAO,IAAI,iBAAiB,CAAI,OAAO,CAAC,CAAC;IAC3C,CAAC;CACF"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Store state interface
3
+ */
4
+ export interface StoreState {
5
+ [key: string]: unknown;
6
+ }
7
+ /**
8
+ * Store actions interface
9
+ */
10
+ export type StoreAction<T extends StoreState> = (state: T, ...args: any[]) => Partial<T> | Promise<Partial<T>>;
11
+ export interface StoreActions<T extends StoreState> {
12
+ [key: string]: StoreAction<T>;
13
+ }
14
+ /**
15
+ * Store middleware interface
16
+ */
17
+ export interface StoreMiddleware {
18
+ name: string;
19
+ before?: (action: string, args: unknown[], state: StoreState) => void | Promise<void>;
20
+ after?: (action: string, args: unknown[], state: StoreState, result: unknown) => void | Promise<void>;
21
+ error?: (action: string, args: unknown[], error: Error) => void | Promise<void>;
22
+ }
23
+ /**
24
+ * Store subscriber
25
+ */
26
+ export interface StoreSubscriber {
27
+ id: string;
28
+ selector?: (state: StoreState) => unknown;
29
+ callback: (state: StoreState, prevState: StoreState) => void;
30
+ }
31
+ /**
32
+ * Modern Store Implementation
33
+ * Combines the best of Redux, Zustand, and modern patterns
34
+ */
35
+ export declare class Store<T extends StoreState = StoreState> {
36
+ private state;
37
+ private actions;
38
+ private subscribers;
39
+ private middlewares;
40
+ private isUpdating;
41
+ private updateQueue;
42
+ private subscriberIdCounter;
43
+ constructor(initialState: T);
44
+ /**
45
+ * Get current state
46
+ */
47
+ getState(): T;
48
+ /**
49
+ * Get a specific property from state
50
+ */
51
+ get<K extends keyof T>(key: K): T[K];
52
+ /**
53
+ * Set state (immutable update)
54
+ */
55
+ setState(updater: Partial<T> | ((state: T) => Partial<T>)): void;
56
+ /**
57
+ * Define actions (like Redux actions but simpler)
58
+ */
59
+ defineActions(actions: StoreActions<T>): void;
60
+ /**
61
+ * Execute an action
62
+ */
63
+ dispatch(action: string, ...args: unknown[]): Promise<void>;
64
+ /**
65
+ * Subscribe to state changes
66
+ */
67
+ subscribe(callback: (state: T, prevState: T) => void, selector?: (state: T) => unknown): () => void;
68
+ /**
69
+ * Subscribe to specific property changes
70
+ */
71
+ subscribeTo<K extends keyof T>(key: K, callback: (value: T[K], prevValue: T[K]) => void): () => void;
72
+ /**
73
+ * Add middleware
74
+ */
75
+ use(middleware: StoreMiddleware): void;
76
+ /**
77
+ * Update state and notify subscribers
78
+ */
79
+ private updateState;
80
+ /**
81
+ * Notify all subscribers
82
+ */
83
+ private notifySubscribers;
84
+ /**
85
+ * Get debug information
86
+ */
87
+ getDebugInfo(): {
88
+ state: T;
89
+ actions: string[];
90
+ subscribers: number;
91
+ middlewares: string[];
92
+ };
93
+ }
94
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ import { debugLog } from '@miurajs/miura-debugger';
2
+ /**
3
+ * Modern Store Implementation
4
+ * Combines the best of Redux, Zustand, and modern patterns
5
+ */
6
+ export class Store {
7
+ state;
8
+ actions = {};
9
+ subscribers = new Map();
10
+ middlewares = [];
11
+ isUpdating = false;
12
+ updateQueue = [];
13
+ subscriberIdCounter = 0;
14
+ constructor(initialState) {
15
+ this.state = { ...initialState };
16
+ }
17
+ /**
18
+ * Get current state
19
+ */
20
+ getState() {
21
+ return { ...this.state };
22
+ }
23
+ /**
24
+ * Get a specific property from state
25
+ */
26
+ get(key) {
27
+ return this.state[key];
28
+ }
29
+ /**
30
+ * Set state (immutable update)
31
+ */
32
+ setState(updater) {
33
+ const newState = typeof updater === 'function' ? updater(this.state) : updater;
34
+ this.updateState(newState);
35
+ }
36
+ /**
37
+ * Define actions (like Redux actions but simpler)
38
+ */
39
+ defineActions(actions) {
40
+ this.actions = { ...this.actions, ...actions };
41
+ }
42
+ /**
43
+ * Execute an action
44
+ */
45
+ async dispatch(action, ...args) {
46
+ if (!this.actions[action]) {
47
+ throw new Error(`Action '${action}' not found`);
48
+ }
49
+ try {
50
+ // Run before middlewares
51
+ for (const middleware of this.middlewares) {
52
+ if (middleware.before) {
53
+ await middleware.before(action, args, this.state);
54
+ }
55
+ }
56
+ // Execute action and update state
57
+ const result = await this.actions[action](this.state, ...args);
58
+ this.updateState(result);
59
+ // Run after middlewares
60
+ for (const middleware of this.middlewares) {
61
+ if (middleware.after) {
62
+ await middleware.after(action, args, this.state, result);
63
+ }
64
+ }
65
+ }
66
+ catch (error) {
67
+ // Run error middlewares
68
+ for (const middleware of this.middlewares) {
69
+ if (middleware.error) {
70
+ await middleware.error(action, args, error);
71
+ }
72
+ }
73
+ throw error;
74
+ }
75
+ }
76
+ /**
77
+ * Subscribe to state changes
78
+ */
79
+ subscribe(callback, selector) {
80
+ const id = `subscriber_${++this.subscriberIdCounter}`;
81
+ const subscriber = {
82
+ id,
83
+ selector: selector,
84
+ callback: callback
85
+ };
86
+ this.subscribers.set(id, subscriber);
87
+ debugLog('element', 'Subscribed to store', { id, hasSelector: !!selector });
88
+ // Return unsubscribe function
89
+ return () => {
90
+ this.subscribers.delete(id);
91
+ debugLog('element', 'Unsubscribed from store', { id });
92
+ };
93
+ }
94
+ /**
95
+ * Subscribe to specific property changes
96
+ */
97
+ subscribeTo(key, callback) {
98
+ return this.subscribe((state, prevState) => {
99
+ if (state[key] !== prevState[key]) {
100
+ callback(state[key], prevState[key]);
101
+ }
102
+ }, (state) => state[key]);
103
+ }
104
+ /**
105
+ * Add middleware
106
+ */
107
+ use(middleware) {
108
+ this.middlewares.push(middleware);
109
+ debugLog('element', 'Added middleware', { name: middleware.name });
110
+ }
111
+ /**
112
+ * Update state and notify subscribers
113
+ */
114
+ updateState(updater) {
115
+ if (this.isUpdating) {
116
+ // Queue update if already updating
117
+ this.updateQueue.push(() => this.updateState(updater));
118
+ return;
119
+ }
120
+ this.isUpdating = true;
121
+ const prevState = { ...this.state };
122
+ // Apply updates
123
+ this.state = { ...this.state, ...updater };
124
+ // Notify subscribers
125
+ this.notifySubscribers(prevState);
126
+ this.isUpdating = false;
127
+ // Process queued updates
128
+ while (this.updateQueue.length > 0) {
129
+ const queuedUpdate = this.updateQueue.shift();
130
+ if (queuedUpdate) {
131
+ queuedUpdate();
132
+ }
133
+ }
134
+ }
135
+ /**
136
+ * Notify all subscribers
137
+ */
138
+ notifySubscribers(prevState) {
139
+ for (const subscriber of this.subscribers.values()) {
140
+ try {
141
+ if (subscriber.selector) {
142
+ const currentValue = subscriber.selector(this.state);
143
+ const prevValue = subscriber.selector(prevState);
144
+ if (currentValue !== prevValue) {
145
+ subscriber.callback(this.state, prevState);
146
+ }
147
+ }
148
+ else {
149
+ subscriber.callback(this.state, prevState);
150
+ }
151
+ }
152
+ catch (error) {
153
+ console.error(`Error in store subscriber ${subscriber.id}:`, error);
154
+ }
155
+ }
156
+ }
157
+ /**
158
+ * Get debug information
159
+ */
160
+ getDebugInfo() {
161
+ return {
162
+ state: this.getState(),
163
+ actions: Object.keys(this.actions),
164
+ subscribers: this.subscribers.size,
165
+ middlewares: this.middlewares.map(m => m.name)
166
+ };
167
+ }
168
+ }
169
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/store.ts"],"names":[],"mappings":"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"}