bunderstack 0.17.1 → 0.19.0
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.
- package/CHANGELOG.md +57 -0
- package/dist/api/crud-router.d.ts +121 -0
- package/dist/api/crud-router.d.ts.map +1 -1
- package/dist/api/crud-router.js +104 -3
- package/dist/api/crud-router.js.map +1 -1
- package/dist/api/list-input-schema.d.ts +15 -0
- package/dist/api/list-input-schema.d.ts.map +1 -1
- package/dist/api/list-input-schema.js +16 -0
- package/dist/api/list-input-schema.js.map +1 -1
- package/dist/api/live-view.d.ts +14 -0
- package/dist/api/live-view.d.ts.map +1 -0
- package/dist/api/live-view.js +42 -0
- package/dist/api/live-view.js.map +1 -0
- package/dist/api/live-window.d.ts +40 -0
- package/dist/api/live-window.d.ts.map +1 -0
- package/dist/api/live-window.js +83 -0
- package/dist/api/live-window.js.map +1 -0
- package/dist/api/openapi.js +1 -1
- package/dist/api/openapi.js.map +1 -1
- package/dist/api/realtime-router.d.ts +2 -0
- package/dist/api/realtime-router.d.ts.map +1 -1
- package/dist/api/realtime-router.js +3 -0
- package/dist/api/realtime-router.js.map +1 -1
- package/dist/api/registry.d.ts.map +1 -1
- package/dist/api/registry.js +2 -6
- package/dist/api/registry.js.map +1 -1
- package/dist/api/storage-router.d.ts.map +1 -1
- package/dist/api/storage-router.js.map +1 -1
- package/dist/api/types.d.ts.map +1 -1
- package/dist/cli-skills.d.ts.map +1 -1
- package/dist/cli-skills.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/crud-operations.d.ts.map +1 -1
- package/dist/crud-operations.js +3 -12
- package/dist/crud-operations.js.map +1 -1
- package/dist/email.d.ts.map +1 -1
- package/dist/email.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +8 -3
- package/dist/errors.js.map +1 -1
- package/dist/handler.d.ts.map +1 -1
- package/dist/handler.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -16
- package/dist/index.js.map +1 -1
- package/dist/live/apply.d.ts +13 -0
- package/dist/live/apply.d.ts.map +1 -0
- package/dist/live/apply.js +32 -0
- package/dist/live/apply.js.map +1 -0
- package/dist/live/index.d.ts +48 -0
- package/dist/live/index.d.ts.map +1 -0
- package/dist/live/index.js +108 -0
- package/dist/live/index.js.map +1 -0
- package/dist/live/protocol.d.ts +44 -0
- package/dist/live/protocol.d.ts.map +1 -0
- package/dist/live/protocol.js +12 -0
- package/dist/live/protocol.js.map +1 -0
- package/dist/live/sse.d.ts +22 -0
- package/dist/live/sse.d.ts.map +1 -0
- package/dist/live/sse.js +41 -0
- package/dist/live/sse.js.map +1 -0
- package/dist/realtime/facade.d.ts.map +1 -1
- package/dist/realtime/facade.js.map +1 -1
- package/dist/realtime/filter.d.ts +34 -5
- package/dist/realtime/filter.d.ts.map +1 -1
- package/dist/realtime/filter.js +63 -26
- package/dist/realtime/filter.js.map +1 -1
- package/dist/realtime/heartbeat.d.ts +6 -0
- package/dist/realtime/heartbeat.d.ts.map +1 -1
- package/dist/realtime/heartbeat.js +1 -1
- package/dist/realtime/heartbeat.js.map +1 -1
- package/dist/storage/operations.d.ts.map +1 -1
- package/dist/storage/operations.js.map +1 -1
- package/llms.txt +3 -3
- package/package.json +6 -2
- package/skills/creating-bunderstack-apps/agents/openai.yaml +3 -3
- package/skills/creating-bunderstack-apps/references/application-structure.md +17 -8
- package/skills/migrating-to-bunderstack/SKILL.md +6 -6
- package/skills/migrating-to-bunderstack/agents/openai.yaml +3 -3
- package/skills/migrating-to-bunderstack/references/audit-checklist.md +22 -22
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,63 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `bunderstack` will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [Unreleased]
|
|
6
|
+
|
|
7
|
+
## [0.19.0] - 2026-08-23
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **Live views.** `GET /api/live/{table}` streams one list query: a snapshot of
|
|
12
|
+
the result, then only the changes that belong to it. The server evaluates the
|
|
13
|
+
view's filters per record and places each row (`afterId`), so a client keeps
|
|
14
|
+
the view current without a cache, without invalidation, and without repeating
|
|
15
|
+
the sort. Every connection opens with a snapshot, which makes a reconnect its
|
|
16
|
+
own resynchronisation. The new `bunderstack/live` subpath holds a
|
|
17
|
+
dependency-free browser client (`createLiveView`) built on `subscribe` plus
|
|
18
|
+
`getRows`. Reading a live view needs the table's `list` right, which also
|
|
19
|
+
gates every delivered change.
|
|
20
|
+
|
|
21
|
+
## [0.18.0] - 2026-08-20
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
|
|
25
|
+
- **A realtime stream that dies without closing is now detected.** A connection
|
|
26
|
+
killed by a proxy idle-timeout, a sleeping laptop, a NAT rebind, or a phone
|
|
27
|
+
moving between networks left the client's `for await` suspended forever: it
|
|
28
|
+
neither resolved nor threw, so the retry loop below it never ran and the
|
|
29
|
+
client stayed silently stale until a reload. The server already sent a
|
|
30
|
+
heartbeat every five seconds and the client discarded it. The heartbeat now
|
|
31
|
+
advertises its interval, and the client tears the connection down after 2.5
|
|
32
|
+
intervals of silence and reconnects.
|
|
33
|
+
- `RPCHandler` no longer receives `customErrorResponseBodyEncoder`, which is not
|
|
34
|
+
part of `RPCHandlerOptions`. The option was ignored at runtime and failed the
|
|
35
|
+
build. Unhandled procedure errors are still logged by `mapBunderstackErrors`
|
|
36
|
+
for every transport, now covered by a test.
|
|
37
|
+
|
|
38
|
+
### Added
|
|
39
|
+
|
|
40
|
+
- **`notifyScheduler` on `syncRealtime`** — `'frame'` (default), `'sync'`, or a
|
|
41
|
+
millisecond debounce. Changes are buffered and reach the cache in one flush,
|
|
42
|
+
with invalidations deduplicated by query-key hash: a burst of fifty changes to
|
|
43
|
+
one table used to issue fifty `invalidateQueries` calls and now issues one.
|
|
44
|
+
- **`apply: 'patch'` on `syncRealtime`** — writes changes into cached list
|
|
45
|
+
results instead of invalidating them, so a write costs one request instead of
|
|
46
|
+
two. A list is patched only when its membership and ordering can be settled
|
|
47
|
+
locally, and invalidated otherwise.
|
|
48
|
+
- `RealtimeHeartbeat` carries `intervalMs`, so a client sizes its own
|
|
49
|
+
dead-stream timeout from the server's real setting.
|
|
50
|
+
|
|
51
|
+
### Changed
|
|
52
|
+
|
|
53
|
+
- **Realtime cache writes are batched by default.** `notifyScheduler` defaults
|
|
54
|
+
to `'frame'`, so an event no longer reaches the cache in the same tick it
|
|
55
|
+
arrives. Applications that depended on the synchronous write can pass
|
|
56
|
+
`'sync'`.
|
|
57
|
+
- Connection lifecycle and flush pacing moved into their own modules inside
|
|
58
|
+
`bunderstack-query`. The public API is unchanged.
|
|
59
|
+
- Documented the provider-neutral production container contract and
|
|
60
|
+
Bunderhost's custom Dockerfile convention.
|
|
61
|
+
|
|
5
62
|
## [0.17.1] - 2026-08-13
|
|
6
63
|
|
|
7
64
|
### Added
|
|
@@ -4,6 +4,7 @@ import * as v from 'valibot';
|
|
|
4
4
|
import type { AnyDb } from '../dialect.js';
|
|
5
5
|
import type { IdempotencyConfig } from '../idempotency.js';
|
|
6
6
|
import type { RealtimeFacade } from '../realtime/facade.js';
|
|
7
|
+
import type { RealtimePublisher } from '../realtime/publisher.js';
|
|
7
8
|
import type { CrudApiRouterFor } from './types.js';
|
|
8
9
|
import { type ResolvedAccess, type ResolvedTableAccess, type TableAccessInput } from '../access.js';
|
|
9
10
|
import { type CrudOperations } from '../crud-operations.js';
|
|
@@ -12,6 +13,12 @@ export type CrudApiRouterOptions<TSchema extends Record<string, unknown> = Recor
|
|
|
12
13
|
access: ResolvedAccess;
|
|
13
14
|
idempotency?: boolean | IdempotencyConfig;
|
|
14
15
|
realtime?: RealtimeFacade<TSchema>;
|
|
16
|
+
/**
|
|
17
|
+
* The raw realtime publisher, present when realtime is enabled. The CRUD
|
|
18
|
+
* router subscribes on behalf of live views (`GET /{table}:live`);
|
|
19
|
+
* publishing stays behind the facade.
|
|
20
|
+
*/
|
|
21
|
+
livePublisher?: RealtimePublisher;
|
|
15
22
|
};
|
|
16
23
|
type CrudUpdate<TTable extends Table> = Partial<Omit<TTable['$inferInsert'], 'id'>>;
|
|
17
24
|
/** A filter accepts one value (`=`), a list (`IN`), or null (`IS NULL`). */
|
|
@@ -34,11 +41,25 @@ export type ListInputFor<TTable extends Table, TFilterable extends string, TSort
|
|
|
34
41
|
count?: boolean;
|
|
35
42
|
filters?: ListFilters<TTable, TFilterable>;
|
|
36
43
|
} | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* The live-view input as callers see it: the list contract narrowed to what a
|
|
46
|
+
* stream can honor — no text search, no pagination.
|
|
47
|
+
*/
|
|
48
|
+
export type LiveInputFor<TTable extends Table, TFilterable extends string, TSortable extends string> = {
|
|
49
|
+
limit?: number;
|
|
50
|
+
sort?: TSortable;
|
|
51
|
+
order?: 'asc' | 'desc';
|
|
52
|
+
filters?: ListFilters<TTable, TFilterable>;
|
|
53
|
+
} | undefined;
|
|
37
54
|
export type BuildTableCrudProceduresArgs<TSchema extends Record<string, unknown>, TTable extends Table> = {
|
|
38
55
|
table: TTable;
|
|
39
56
|
operations: CrudOperations;
|
|
40
57
|
builder: ReturnType<typeof createApiBuilder<TSchema>>;
|
|
41
58
|
access: ResolvedTableAccess;
|
|
59
|
+
/** The schema key events are published under. */
|
|
60
|
+
schemaKey: string;
|
|
61
|
+
/** Present when realtime is enabled; without it no live procedure is built. */
|
|
62
|
+
livePublisher?: RealtimePublisher;
|
|
42
63
|
};
|
|
43
64
|
export declare function buildTableCrudProcedures<TSchema extends Record<string, unknown>, TTable extends Table, TFilterable extends string = string, TSortable extends string = string>(args: BuildTableCrudProceduresArgs<TSchema, TTable>): {
|
|
44
65
|
list: import("@orpc/server").DecoratedProcedure<import("./context.js").ApiContext<TSchema, Record<string, unknown>> & object, object, v.GenericSchema<ListInputFor<TTable, TFilterable, TSortable>, ListInputFor<TTable, TFilterable, TSortable>>, v.StrictObjectSchema<{
|
|
@@ -353,6 +374,106 @@ export declare function buildTableCrudProcedures<TSchema extends Record<string,
|
|
|
353
374
|
}>;
|
|
354
375
|
};
|
|
355
376
|
}, never>;
|
|
377
|
+
live?: NonNullable<import("@orpc/server").DecoratedProcedure<import("./context.js").ApiContext<TSchema, Record<string, unknown>> & object, object, v.GenericSchema<LiveInputFor<TTable, TFilterable, TSortable>, LiveInputFor<TTable, TFilterable, TSortable>>, import("@orpc/contract").Schema<AsyncIteratorObject<{
|
|
378
|
+
type: "snapshot";
|
|
379
|
+
items: {
|
|
380
|
+
[x: string]: unknown;
|
|
381
|
+
}[];
|
|
382
|
+
sort: string;
|
|
383
|
+
order: "asc" | "desc";
|
|
384
|
+
limit: number;
|
|
385
|
+
hasMore: boolean;
|
|
386
|
+
} | {
|
|
387
|
+
type: "upsert";
|
|
388
|
+
record: {
|
|
389
|
+
[x: string]: unknown;
|
|
390
|
+
};
|
|
391
|
+
afterId: string | null;
|
|
392
|
+
} | {
|
|
393
|
+
type: "remove";
|
|
394
|
+
id: string;
|
|
395
|
+
} | {
|
|
396
|
+
type: "heartbeat";
|
|
397
|
+
intervalMs: number;
|
|
398
|
+
}, unknown, void>, import("@orpc/server").AsyncIteratorClass<{
|
|
399
|
+
type: "snapshot";
|
|
400
|
+
items: {
|
|
401
|
+
[x: string]: unknown;
|
|
402
|
+
}[];
|
|
403
|
+
sort: string;
|
|
404
|
+
order: "asc" | "desc";
|
|
405
|
+
limit: number;
|
|
406
|
+
hasMore: boolean;
|
|
407
|
+
} | {
|
|
408
|
+
type: "upsert";
|
|
409
|
+
record: {
|
|
410
|
+
[x: string]: unknown;
|
|
411
|
+
};
|
|
412
|
+
afterId: string | null;
|
|
413
|
+
} | {
|
|
414
|
+
type: "remove";
|
|
415
|
+
id: string;
|
|
416
|
+
} | {
|
|
417
|
+
type: "heartbeat";
|
|
418
|
+
intervalMs: number;
|
|
419
|
+
}, unknown, void>>, {
|
|
420
|
+
readonly BAD_REQUEST: {
|
|
421
|
+
readonly data: v.OptionalSchema<v.StrictObjectSchema<{
|
|
422
|
+
readonly code: v.OptionalSchema<v.LiteralSchema<"BAD_REQUEST", undefined>, "BAD_REQUEST">;
|
|
423
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
424
|
+
}, undefined>, {
|
|
425
|
+
readonly code: "BAD_REQUEST";
|
|
426
|
+
}>;
|
|
427
|
+
};
|
|
428
|
+
readonly UNAUTHORIZED: {
|
|
429
|
+
readonly data: v.OptionalSchema<v.StrictObjectSchema<{
|
|
430
|
+
readonly code: v.OptionalSchema<v.LiteralSchema<"UNAUTHORIZED", undefined>, "UNAUTHORIZED">;
|
|
431
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
432
|
+
}, undefined>, {
|
|
433
|
+
readonly code: "UNAUTHORIZED";
|
|
434
|
+
}>;
|
|
435
|
+
};
|
|
436
|
+
readonly FORBIDDEN: {
|
|
437
|
+
readonly data: v.OptionalSchema<v.StrictObjectSchema<{
|
|
438
|
+
readonly code: v.OptionalSchema<v.LiteralSchema<"FORBIDDEN", undefined>, "FORBIDDEN">;
|
|
439
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
440
|
+
}, undefined>, {
|
|
441
|
+
readonly code: "FORBIDDEN";
|
|
442
|
+
}>;
|
|
443
|
+
};
|
|
444
|
+
readonly NOT_FOUND: {
|
|
445
|
+
readonly data: v.OptionalSchema<v.StrictObjectSchema<{
|
|
446
|
+
readonly code: v.OptionalSchema<v.LiteralSchema<"NOT_FOUND", undefined>, "NOT_FOUND">;
|
|
447
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
448
|
+
}, undefined>, {
|
|
449
|
+
readonly code: "NOT_FOUND";
|
|
450
|
+
}>;
|
|
451
|
+
};
|
|
452
|
+
readonly CONFLICT: {
|
|
453
|
+
readonly data: v.OptionalSchema<v.StrictObjectSchema<{
|
|
454
|
+
readonly code: v.OptionalSchema<v.LiteralSchema<"CONFLICT", undefined>, "CONFLICT">;
|
|
455
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
456
|
+
}, undefined>, {
|
|
457
|
+
readonly code: "CONFLICT";
|
|
458
|
+
}>;
|
|
459
|
+
};
|
|
460
|
+
readonly PAYLOAD_TOO_LARGE: {
|
|
461
|
+
readonly data: v.OptionalSchema<v.StrictObjectSchema<{
|
|
462
|
+
readonly code: v.OptionalSchema<v.LiteralSchema<"PAYLOAD_TOO_LARGE", undefined>, "PAYLOAD_TOO_LARGE">;
|
|
463
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
464
|
+
}, undefined>, {
|
|
465
|
+
readonly code: "PAYLOAD_TOO_LARGE";
|
|
466
|
+
}>;
|
|
467
|
+
};
|
|
468
|
+
readonly TOO_MANY_REQUESTS: {
|
|
469
|
+
readonly data: v.OptionalSchema<v.StrictObjectSchema<{
|
|
470
|
+
readonly code: v.OptionalSchema<v.LiteralSchema<"TOO_MANY_REQUESTS", undefined>, "TOO_MANY_REQUESTS">;
|
|
471
|
+
readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
472
|
+
}, undefined>, {
|
|
473
|
+
readonly code: "TOO_MANY_REQUESTS";
|
|
474
|
+
}>;
|
|
475
|
+
};
|
|
476
|
+
}, never> | undefined>;
|
|
356
477
|
};
|
|
357
478
|
export type TableCrudProcedures<TTable extends Table, TFilterable extends string = string, TSortable extends string = string> = ReturnType<typeof buildTableCrudProcedures<Record<string, unknown>, TTable, TFilterable, TSortable>>;
|
|
358
479
|
export declare function buildCrudApiRouter<TSchema extends Record<string, unknown>, TAccess extends Record<string, TableAccessInput> | undefined = undefined>(schema: TSchema, db: AnyDb, options: CrudApiRouterOptions<TSchema>): CrudApiRouterFor<TSchema, TAccess>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud-router.d.ts","sourceRoot":"","sources":["../../src/api/crud-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,KAAK,KAAK,EAAE,MAAM,aAAa,CAAA;AAMhF,OAAO,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"crud-router.d.ts","sourceRoot":"","sources":["../../src/api/crud-router.ts"],"names":[],"mappings":"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"}
|
package/dist/api/crud-router.js
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import { getTableColumns, getTableName, isTable } from 'drizzle-orm';
|
|
2
2
|
import { createInsertSchema, createSelectSchema, createUpdateSchema, } from 'drizzle-valibot';
|
|
3
3
|
import '@orpc/openapi/extensions/route';
|
|
4
|
+
import { eventIterator } from '@orpc/server';
|
|
4
5
|
import * as v from 'valibot';
|
|
5
6
|
import { tableEntryForName, } from '../access.js';
|
|
6
7
|
import { createCrudOperations } from '../crud-operations.js';
|
|
8
|
+
import { filterTableChanges } from '../realtime/filter.js';
|
|
9
|
+
import { REALTIME_HEARTBEAT_INTERVAL_MS, withRealtimeHeartbeat, } from '../realtime/heartbeat.js';
|
|
7
10
|
import { createApiBuilder } from './builder.js';
|
|
8
|
-
import {
|
|
11
|
+
import { createLiveWindow } from './live-window.js';
|
|
12
|
+
import { buildListInputSchema, buildLiveInputSchema } from './list-input-schema.js';
|
|
9
13
|
function strictObject(schema) {
|
|
10
14
|
return v.strictObject(schema.entries);
|
|
11
15
|
}
|
|
12
16
|
export function buildTableCrudProcedures(args) {
|
|
13
|
-
const { table, operations, builder, access } = args;
|
|
17
|
+
const { table, operations, builder, access, schemaKey, livePublisher } = args;
|
|
14
18
|
const name = getTableName(table);
|
|
15
19
|
// drizzle-valibot infers its schemas through internal generics. Left as-is,
|
|
16
20
|
// declaration emit inlines those generics by name into the published `.d.ts`,
|
|
@@ -185,16 +189,111 @@ export function buildTableCrudProcedures(args) {
|
|
|
185
189
|
await operations.delete(name, input.id, execCtx);
|
|
186
190
|
return undefined;
|
|
187
191
|
});
|
|
192
|
+
// 6. LIVE procedure — one list query as a stream. A snapshot first, then the
|
|
193
|
+
// changes this view cares about, placed by the server. Every connection
|
|
194
|
+
// opens with a snapshot, so a reconnect is its own recovery: no client-side
|
|
195
|
+
// event buffer, no Last-Event-ID bookkeeping, and no refetch path.
|
|
196
|
+
const liveQuerySchema = buildLiveInputSchema(table, {
|
|
197
|
+
filterableColumns: access.filterableColumns,
|
|
198
|
+
sortableColumns: access.sortableColumns,
|
|
199
|
+
});
|
|
200
|
+
const recordSchema = v.record(v.string(), v.unknown());
|
|
201
|
+
const liveFrameSchema = v.union([
|
|
202
|
+
v.strictObject({
|
|
203
|
+
type: v.literal('snapshot'),
|
|
204
|
+
items: v.array(recordSchema),
|
|
205
|
+
sort: v.string(),
|
|
206
|
+
order: v.picklist(['asc', 'desc']),
|
|
207
|
+
limit: v.number(),
|
|
208
|
+
hasMore: v.boolean(),
|
|
209
|
+
}),
|
|
210
|
+
v.strictObject({
|
|
211
|
+
type: v.literal('upsert'),
|
|
212
|
+
record: recordSchema,
|
|
213
|
+
afterId: v.union([v.string(), v.null()]),
|
|
214
|
+
}),
|
|
215
|
+
v.strictObject({ type: v.literal('remove'), id: v.string() }),
|
|
216
|
+
v.strictObject({ type: v.literal('heartbeat'), intervalMs: v.number() }),
|
|
217
|
+
]);
|
|
218
|
+
const live = !livePublisher
|
|
219
|
+
? undefined
|
|
220
|
+
: builder.public
|
|
221
|
+
.route({
|
|
222
|
+
method: 'GET',
|
|
223
|
+
// A path of its own, not a child of the table: `/{table}/live`
|
|
224
|
+
// would make the id "live" unreachable on the get route, and a
|
|
225
|
+
// colon suffix is a wildcard parameter in the oRPC matcher.
|
|
226
|
+
path: `/api/live/${name}`,
|
|
227
|
+
summary: `Live view of ${name}`,
|
|
228
|
+
tags: [name],
|
|
229
|
+
// Filters arrive as one URL-encoded JSON value, so no per-key query
|
|
230
|
+
// parsing rule is needed.
|
|
231
|
+
queryStyles: { filters: 'json' },
|
|
232
|
+
})
|
|
233
|
+
.input(liveQuerySchema)
|
|
234
|
+
.output(eventIterator(liveFrameSchema))
|
|
235
|
+
.handler(({ input, context, signal }) => {
|
|
236
|
+
// Subscribe before anything awaits, so no change slips between the
|
|
237
|
+
// snapshot read and the start of the stream; events that arrive
|
|
238
|
+
// during the query buffer in the publisher and replay on first pull.
|
|
239
|
+
const changes = filterTableChanges(livePublisher.subscribe('change', { signal }), {
|
|
240
|
+
tableName: schemaKey,
|
|
241
|
+
entry: access,
|
|
242
|
+
rule: access.list,
|
|
243
|
+
request: context.request,
|
|
244
|
+
getSession: context.getSession,
|
|
245
|
+
});
|
|
246
|
+
return withRealtimeHeartbeat((async function* () {
|
|
247
|
+
const session = await context.getSession();
|
|
248
|
+
const execCtx = {
|
|
249
|
+
request: context.request,
|
|
250
|
+
user: session.user,
|
|
251
|
+
session: { activeOrganizationId: session.activeOrganizationId },
|
|
252
|
+
};
|
|
253
|
+
let view;
|
|
254
|
+
const readSnapshot = async () => {
|
|
255
|
+
const result = await operations.list(name, input ?? {}, execCtx);
|
|
256
|
+
view = createLiveWindow({
|
|
257
|
+
sort: result.sort,
|
|
258
|
+
order: result.order,
|
|
259
|
+
limit: result.limit,
|
|
260
|
+
filters: input?.filters,
|
|
261
|
+
});
|
|
262
|
+
view.reset(result.items, result.hasMore);
|
|
263
|
+
return {
|
|
264
|
+
type: 'snapshot',
|
|
265
|
+
items: result.items,
|
|
266
|
+
sort: result.sort,
|
|
267
|
+
order: result.order,
|
|
268
|
+
limit: result.limit,
|
|
269
|
+
hasMore: result.hasMore,
|
|
270
|
+
};
|
|
271
|
+
};
|
|
272
|
+
yield await readSnapshot();
|
|
273
|
+
for await (const change of changes) {
|
|
274
|
+
const outcome = view.apply(change);
|
|
275
|
+
if (outcome.type === 'none')
|
|
276
|
+
continue;
|
|
277
|
+
if (outcome.type === 'resnapshot') {
|
|
278
|
+
yield await readSnapshot();
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
for (const frame of outcome.frames)
|
|
282
|
+
yield frame;
|
|
283
|
+
}
|
|
284
|
+
})(), { intervalMs: REALTIME_HEARTBEAT_INTERVAL_MS, signal });
|
|
285
|
+
});
|
|
188
286
|
return {
|
|
189
287
|
list,
|
|
190
288
|
get,
|
|
191
289
|
create,
|
|
192
290
|
update,
|
|
193
291
|
delete: deleteProc,
|
|
292
|
+
...(live ? { live } : {}),
|
|
194
293
|
};
|
|
195
294
|
}
|
|
196
295
|
export function buildCrudApiRouter(schema, db, options) {
|
|
197
|
-
const { access, realtime, idempotency } = options;
|
|
296
|
+
const { access, realtime, idempotency, livePublisher } = options;
|
|
198
297
|
const builder = createApiBuilder();
|
|
199
298
|
const operations = createCrudOperations({
|
|
200
299
|
schema,
|
|
@@ -219,6 +318,8 @@ export function buildCrudApiRouter(schema, db, options) {
|
|
|
219
318
|
operations,
|
|
220
319
|
builder,
|
|
221
320
|
access: tableAccess,
|
|
321
|
+
schemaKey: tableKey,
|
|
322
|
+
livePublisher,
|
|
222
323
|
});
|
|
223
324
|
routerObj[tableKey] = procedures;
|
|
224
325
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud-router.js","sourceRoot":"","sources":["../../src/api/crud-router.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"crud-router.js","sourceRoot":"","sources":["../../src/api/crud-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,4 +19,19 @@ export declare function buildListInputSchema(table: Table, options: {
|
|
|
19
19
|
readonly count: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
20
20
|
readonly filters: v.OptionalSchema<v.StrictObjectSchema<v.ObjectEntries, undefined>, undefined>;
|
|
21
21
|
}, undefined>, undefined>;
|
|
22
|
+
/**
|
|
23
|
+
* The input contract of a live view (`GET /api/{table}:live`): the list
|
|
24
|
+
* contract narrowed to what a stream can honor. No text search, no pagination
|
|
25
|
+
* — membership is decided per streamed record on the server, which only
|
|
26
|
+
* equality-style filters allow.
|
|
27
|
+
*/
|
|
28
|
+
export declare function buildLiveInputSchema(table: Table, options: {
|
|
29
|
+
filterableColumns: readonly string[];
|
|
30
|
+
sortableColumns: readonly string[];
|
|
31
|
+
}): v.OptionalSchema<v.StrictObjectSchema<{
|
|
32
|
+
readonly limit: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
|
|
33
|
+
readonly sort: v.OptionalSchema<v.PicklistSchema<string[], undefined>, undefined>;
|
|
34
|
+
readonly order: v.OptionalSchema<v.PicklistSchema<["asc", "desc"], undefined>, undefined>;
|
|
35
|
+
readonly filters: v.OptionalSchema<v.StrictObjectSchema<v.ObjectEntries, undefined>, undefined>;
|
|
36
|
+
}, undefined>, undefined>;
|
|
22
37
|
//# sourceMappingURL=list-input-schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-input-schema.d.ts","sourceRoot":"","sources":["../../src/api/list-input-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAGxC,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAsC5B;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE;IACP,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;CACnC;;;;;;;;;0BAiBF"}
|
|
1
|
+
{"version":3,"file":"list-input-schema.d.ts","sourceRoot":"","sources":["../../src/api/list-input-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAGxC,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAsC5B;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE;IACP,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;CACnC;;;;;;;;;0BAiBF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE;IACP,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;CACnC;;;;;0BAaF"}
|
|
@@ -44,4 +44,20 @@ export function buildListInputSchema(table, options) {
|
|
|
44
44
|
filters: v.optional(v.strictObject(filterEntries)),
|
|
45
45
|
}));
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* The input contract of a live view (`GET /api/{table}:live`): the list
|
|
49
|
+
* contract narrowed to what a stream can honor. No text search, no pagination
|
|
50
|
+
* — membership is decided per streamed record on the server, which only
|
|
51
|
+
* equality-style filters allow.
|
|
52
|
+
*/
|
|
53
|
+
export function buildLiveInputSchema(table, options) {
|
|
54
|
+
const filterEntries = buildFilterEntries(table, options.filterableColumns);
|
|
55
|
+
return v.optional(v.strictObject({
|
|
56
|
+
limit: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1))),
|
|
57
|
+
sort: v.optional(v.picklist(options.sortableColumns)),
|
|
58
|
+
order: v.optional(v.picklist(['asc', 'desc'])),
|
|
59
|
+
// Always present, even with no filterable columns: clients send `{}`.
|
|
60
|
+
filters: v.optional(v.strictObject(filterEntries)),
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
47
63
|
//# sourceMappingURL=list-input-schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-input-schema.js","sourceRoot":"","sources":["../../src/api/list-input-schema.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C;;;;;GAKG;AACH,SAAS,kBAAkB,CACzB,KAAY,EACZ,iBAAoC;IAEpC,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,OAG/C,CAAA;IACD,MAAM,aAAa,GAAoB,EAAE,CAAA;IACzC,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;QAClC,IAAI,CAAC,IAAI;YAAE,SAAQ;QACnB,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAChC,CAAC,CAAC,KAAK,CAAC;YACN,kEAAkE;YAClE,CAAC,CAAC,IAAI,CACJ,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EACjB,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CACxB;YACD,IAAI;YACJ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAClD,CAAC,CAAC,IAAI,EAAE;SACT,CAAC,CACH,CAAA;IACH,CAAC;IACD,OAAO,aAAa,CAAA;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAY,EACZ,OAGC;IAED,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAE1E,OAAO,CAAC,CAAC,QAAQ,CACf,CAAC,CAAC,YAAY,CAAC;QACb,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,eAA2B,CAAC,CAAC;QACjE,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9C,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9B,sEAAsE;QACtE,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;KACnD,CAAC,CACH,CAAA;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"list-input-schema.js","sourceRoot":"","sources":["../../src/api/list-input-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side membership for a live view: does one record belong to a view,
|
|
3
|
+
* given that view's filters?
|
|
4
|
+
*
|
|
5
|
+
* The rule is evaluated per streamed record, so a change is routed to the
|
|
6
|
+
* views that want it without asking the database.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Bunderstack's filter contract — a scalar is `=`, an array is `IN`, `null` is
|
|
10
|
+
* `IS NULL` — evaluated against one record. The string `'null'` means the same
|
|
11
|
+
* as `null`, because a query string cannot carry a real null.
|
|
12
|
+
*/
|
|
13
|
+
export declare function matchesLiveFilters(record: Record<string, unknown>, filters: Record<string, unknown> | undefined): boolean;
|
|
14
|
+
//# sourceMappingURL=live-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-view.d.ts","sourceRoot":"","sources":["../../src/api/live-view.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC3C,OAAO,CAeT"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side membership for a live view: does one record belong to a view,
|
|
3
|
+
* given that view's filters?
|
|
4
|
+
*
|
|
5
|
+
* The rule is evaluated per streamed record, so a change is routed to the
|
|
6
|
+
* views that want it without asking the database.
|
|
7
|
+
*/
|
|
8
|
+
/** Same value semantics as list filters: dates by time, the rest by identity. */
|
|
9
|
+
function sameValue(a, b) {
|
|
10
|
+
if (a instanceof Date && b instanceof Date)
|
|
11
|
+
return a.getTime() === b.getTime();
|
|
12
|
+
return a === b;
|
|
13
|
+
}
|
|
14
|
+
function isNullish(value) {
|
|
15
|
+
return value === null || value === undefined;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Bunderstack's filter contract — a scalar is `=`, an array is `IN`, `null` is
|
|
19
|
+
* `IS NULL` — evaluated against one record. The string `'null'` means the same
|
|
20
|
+
* as `null`, because a query string cannot carry a real null.
|
|
21
|
+
*/
|
|
22
|
+
export function matchesLiveFilters(record, filters) {
|
|
23
|
+
for (const [column, expected] of Object.entries(filters ?? {})) {
|
|
24
|
+
if (expected === undefined)
|
|
25
|
+
continue;
|
|
26
|
+
const actual = record[column];
|
|
27
|
+
if (expected === null || expected === 'null') {
|
|
28
|
+
if (!isNullish(actual))
|
|
29
|
+
return false;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (Array.isArray(expected)) {
|
|
33
|
+
if (!expected.some((value) => sameValue(value, actual)))
|
|
34
|
+
return false;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (!sameValue(expected, actual))
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=live-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-view.js","sourceRoot":"","sources":["../../src/api/live-view.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,iFAAiF;AACjF,SAAS,SAAS,CAAC,CAAU,EAAE,CAAU;IACvC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,IAAI;QAAE,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;IAC9E,OAAO,CAAC,KAAK,CAAC,CAAA;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAA;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAA+B,EAC/B,OAA4C;IAE5C,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,IAAI,QAAQ,KAAK,SAAS;YAAE,SAAQ;QACpC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;QAC7B,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC7C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAAE,OAAO,KAAK,CAAA;YACpC,SAAQ;QACV,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAA;YACrE,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;YAAE,OAAO,KAAK,CAAA;IAChD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { LiveDeltaFrame } from '../live/protocol.js';
|
|
2
|
+
import type { RealtimeChange } from '../realtime/publisher.js';
|
|
3
|
+
/**
|
|
4
|
+
* The server-side state of one live-view connection: which rows the client
|
|
5
|
+
* holds, in view order, and whether rows exist below the window.
|
|
6
|
+
*
|
|
7
|
+
* The window is what lets the server place a row for the client (`afterId`)
|
|
8
|
+
* instead of making the browser repeat `ORDER BY`. It is also what makes a
|
|
9
|
+
* removal from a truncated view ask for a fresh snapshot instead of silently
|
|
10
|
+
* shrinking the view.
|
|
11
|
+
*
|
|
12
|
+
* Ordering follows `buildOrderBy` in `../list-query`: the sort column first,
|
|
13
|
+
* then `id`, both in the query's direction. Values are compared in the process
|
|
14
|
+
* on raw column values. That is exact for numbers, dates, and booleans, and
|
|
15
|
+
* matches the database for ordinary text. A collation that differs from
|
|
16
|
+
* code-unit order, or a NULLS rule other than "nulls first", can place a row
|
|
17
|
+
* inside the window differently from the database.
|
|
18
|
+
*/
|
|
19
|
+
export type LiveWindowOptions = {
|
|
20
|
+
sort: string;
|
|
21
|
+
order: 'asc' | 'desc';
|
|
22
|
+
limit: number;
|
|
23
|
+
filters?: Record<string, unknown>;
|
|
24
|
+
};
|
|
25
|
+
export type LiveWindowResult = {
|
|
26
|
+
type: 'none';
|
|
27
|
+
} | {
|
|
28
|
+
type: 'frames';
|
|
29
|
+
frames: LiveDeltaFrame[];
|
|
30
|
+
} | {
|
|
31
|
+
type: 'resnapshot';
|
|
32
|
+
};
|
|
33
|
+
export type LiveWindow = {
|
|
34
|
+
/** Adopt a query result as the current view. */
|
|
35
|
+
reset: (items: Record<string, unknown>[], hasMore: boolean) => void;
|
|
36
|
+
/** What this change means for this view. */
|
|
37
|
+
apply: (change: RealtimeChange) => LiveWindowResult;
|
|
38
|
+
};
|
|
39
|
+
export declare function createLiveWindow(options: LiveWindowOptions): LiveWindow;
|
|
40
|
+
//# sourceMappingURL=live-window.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-window.d.ts","sourceRoot":"","sources":["../../src/api/live-window.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAI3D;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,KAAK,GAAG,MAAM,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,cAAc,EAAE,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAA;AAE1B,MAAM,MAAM,UAAU,GAAG;IACvB,gDAAgD;IAChD,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACnE,4CAA4C;IAC5C,KAAK,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,gBAAgB,CAAA;CACpD,CAAA;AAmBD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAsEvE"}
|