@photon-grove/evt 0.1.0 → 0.1.1
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/README.md +50 -9
- package/dist/dynamodb/client.d.ts +83 -0
- package/dist/dynamodb/client.d.ts.map +1 -0
- package/dist/dynamodb/client.js +6 -0
- package/dist/dynamodb/client.js.map +1 -0
- package/dist/dynamodb/index.d.ts +5 -1
- package/dist/dynamodb/index.d.ts.map +1 -1
- package/dist/dynamodb/index.js +7 -3
- package/dist/dynamodb/index.js.map +1 -1
- package/dist/dynamodb/item.d.ts +2 -0
- package/dist/dynamodb/item.d.ts.map +1 -1
- package/dist/dynamodb/item.js +5 -4
- package/dist/dynamodb/item.js.map +1 -1
- package/dist/dynamodb/marker.d.ts +11 -0
- package/dist/dynamodb/marker.d.ts.map +1 -0
- package/dist/dynamodb/marker.js +56 -0
- package/dist/dynamodb/marker.js.map +1 -0
- package/dist/dynamodb/repository.d.ts +61 -0
- package/dist/dynamodb/repository.d.ts.map +1 -0
- package/dist/dynamodb/repository.js +731 -0
- package/dist/dynamodb/repository.js.map +1 -0
- package/dist/dynamodb/requests.d.ts +65 -0
- package/dist/dynamodb/requests.d.ts.map +1 -0
- package/dist/dynamodb/requests.js +179 -0
- package/dist/dynamodb/requests.js.map +1 -0
- package/dist/errors.d.ts +96 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +103 -2
- package/dist/errors.js.map +1 -1
- package/dist/features.d.ts +55 -0
- package/dist/features.d.ts.map +1 -0
- package/dist/features.js +126 -0
- package/dist/features.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/memory/index.d.ts +1 -1
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +1 -1
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/repository.d.ts +38 -2
- package/dist/memory/repository.d.ts.map +1 -1
- package/dist/memory/repository.js +95 -6
- package/dist/memory/repository.js.map +1 -1
- package/dist/repository.d.ts +30 -1
- package/dist/repository.d.ts.map +1 -1
- package/dist/repository.js +3 -4
- package/dist/repository.js.map +1 -1
- package/dist/store.d.ts +3 -3
- package/dist/store.js +3 -3
- package/package.json +12 -3
- package/src/dynamodb/client.ts +102 -0
- package/src/dynamodb/index.ts +26 -2
- package/src/dynamodb/item.ts +6 -4
- package/src/dynamodb/marker.ts +64 -0
- package/src/dynamodb/repository.ts +1030 -0
- package/src/dynamodb/requests.ts +256 -0
- package/src/errors.ts +153 -2
- package/src/features.ts +175 -0
- package/src/index.ts +24 -1
- package/src/memory/index.ts +9 -1
- package/src/memory/repository.ts +156 -6
- package/src/repository.ts +34 -6
- package/src/store.ts +3 -3
package/README.md
CHANGED
|
@@ -11,8 +11,9 @@ held to the fixtures Go and Rust generate, byte for byte.
|
|
|
11
11
|
npm install @photon-grove/evt
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
So far it has the core, the in-memory
|
|
15
|
-
PostgreSQL
|
|
14
|
+
So far it has the core, the in-memory and DynamoDB backends, and the testing helpers. Views on
|
|
15
|
+
DynamoDB, the PostgreSQL backend, command outcomes and multi-stream transactions come in later
|
|
16
|
+
releases, and the
|
|
16
17
|
[feature matrix](https://github.com/photon-grove/evt/blob/main/docs/reference/feature-matrix.md)
|
|
17
18
|
tracks each one. The
|
|
18
19
|
[getting started guide](https://github.com/photon-grove/evt/blob/main/docs/guide/getting-started.md#the-same-model-in-typescript)
|
|
@@ -20,16 +21,47 @@ builds a bank account aggregate with it, end to end.
|
|
|
20
21
|
|
|
21
22
|
## Entry points
|
|
22
23
|
|
|
23
|
-
| Import | Contents
|
|
24
|
-
| ---------------------------- |
|
|
25
|
-
| `@photon-grove/evt` | Aggregates, codecs, upcasters, the `Store`, retry, and the wire codecs
|
|
26
|
-
| `@photon-grove/evt/memory` | `MemRepository`, the in-memory backend for tests and local development
|
|
27
|
-
| `@photon-grove/evt/testing` | `scenario` and `Fixture`, the given/when/then helpers over `MemRepository`
|
|
28
|
-
| `@photon-grove/evt/dynamodb` |
|
|
24
|
+
| Import | Contents |
|
|
25
|
+
| ---------------------------- | -------------------------------------------------------------------------- |
|
|
26
|
+
| `@photon-grove/evt` | Aggregates, codecs, upcasters, the `Store`, retry, and the wire codecs |
|
|
27
|
+
| `@photon-grove/evt/memory` | `MemRepository`, the in-memory backend for tests and local development |
|
|
28
|
+
| `@photon-grove/evt/testing` | `scenario` and `Fixture`, the given/when/then helpers over `MemRepository` |
|
|
29
|
+
| `@photon-grove/evt/dynamodb` | `DynamoRepository`, and the DynamoDB item and request codecs |
|
|
30
|
+
|
|
31
|
+
## DynamoDB
|
|
32
|
+
|
|
33
|
+
`DynamoRepository` takes the AWS SDK's low-level client, `DynamoDB` from `@aws-sdk/client-dynamodb`
|
|
34
|
+
(an optional peer dependency), and the event-log table, laid out as the
|
|
35
|
+
[DynamoDB guide](https://github.com/photon-grove/evt/blob/main/docs/guide/dynamodb.md) describes:
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
import {DynamoDB} from '@aws-sdk/client-dynamodb'
|
|
39
|
+
import {Store} from '@photon-grove/evt'
|
|
40
|
+
import {DynamoRepository} from '@photon-grove/evt/dynamodb'
|
|
41
|
+
|
|
42
|
+
const repository = new DynamoRepository(new DynamoDB({}), 'event-log')
|
|
43
|
+
await repository.initialize() // once, at deploy time
|
|
44
|
+
const store = new Store(repository)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The package imports nothing from the SDK, so any client with the same methods works. A store must
|
|
48
|
+
be initialized before writers start: until then every write fails with a
|
|
49
|
+
`StoreNotInitializedError`, so writers never need `dynamodb:Scan`. `initialize()` scans the table
|
|
50
|
+
to make sure it's fresh, and `{lazyInitialization: true}` makes the first write do it instead, for
|
|
51
|
+
tests and local use. Reads are strongly consistent unless `{consistentRead: false}`. When another
|
|
52
|
+
writer declares a feature, the next write fails once with a retryable
|
|
53
|
+
`FeatureManifestChangedError`, which `executeWithRetry` runs again.
|
|
54
|
+
|
|
55
|
+
`{retention: {scratch_job: 86_400_000}}` stamps a DynamoDB `ttl` on every event, snapshot and head
|
|
56
|
+
item of the entity types it names, their write time plus the retention in milliseconds, as Go's
|
|
57
|
+
`WithRetention` does. A head's `ttl` is never lowered: a writer with a shorter retention that
|
|
58
|
+
hasn't loaded the stream gets a conflict, and its retry passes. TTL deletes items in no order, so
|
|
59
|
+
use retention only for short-lived streams that nothing replays, and declare the retained types in
|
|
60
|
+
the feature manifest from Go or Rust, so that their writers refuse read fences on them.
|
|
29
61
|
|
|
30
62
|
## Runtimes
|
|
31
63
|
|
|
32
|
-
The package is ESM only and has no runtime dependencies. CI runs it on Node
|
|
64
|
+
The package is ESM only and has no runtime dependencies. CI runs it on Node 26, Node 22.12, Bun and
|
|
33
65
|
Deno. Its code uses only web-standard globals (`TextEncoder`, `TextDecoder`, Web Crypto,
|
|
34
66
|
`AbortSignal`, timers), never Node's built-ins, so it should run on edge runtimes and in browsers
|
|
35
67
|
too, though CI doesn't run them yet. It never uses top-level await, so CommonJS code on Node 22.12
|
|
@@ -65,6 +97,15 @@ of `AbortSignal`, which the DOM library, `@types/node`, and Bun's and Deno's typ
|
|
|
65
97
|
current one as it's read, in the order they're declared. `jsonUpcaster(from, to, migrate)` does
|
|
66
98
|
it on the parsed JSON, losslessly. A stored version the upcasters don't bring to the declared one
|
|
67
99
|
fails the load with a `ReplayError` rather than decoding into the wrong shape.
|
|
100
|
+
- **The feature marker.** A store keeps one manifest of the features it uses. Every write path
|
|
101
|
+
refuses a store that declares a feature this package doesn't model (the journal, journal
|
|
102
|
+
compaction, the PostgreSQL views table) with an `UnsupportedFeatureError`, and compaction
|
|
103
|
+
refuses an entity type the manifest declares history-dependent. `MemRepository` declares the
|
|
104
|
+
required `stream-heads` feature on a fresh store's first write, and `initialize()` declares it
|
|
105
|
+
up front.
|
|
106
|
+
- **Rebuilds.** While a projection rebuild holds the store, every commit fails with a
|
|
107
|
+
`RebuildInProgressError`. It's retryable, so `executeWithRetry` runs the command again after its
|
|
108
|
+
backoff, though a rebuild usually outlasts the default policy's attempts.
|
|
68
109
|
- **Sequences** are `bigint`s, because Go and Rust store them as 64-bit integers.
|
|
69
110
|
|
|
70
111
|
Errors are `EvtError`s with a `code`. `isConflict` and `isRetryable` tell them apart.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { Item } from './item.js';
|
|
2
|
+
/** The options the repository passes with every call. */
|
|
3
|
+
export interface RequestOptions {
|
|
4
|
+
abortSignal?: AbortSignal;
|
|
5
|
+
}
|
|
6
|
+
/** One action of a `TransactWriteItems` call. */
|
|
7
|
+
export interface TransactItem {
|
|
8
|
+
ConditionCheck?: ConditionCheckAction;
|
|
9
|
+
Put?: PutAction;
|
|
10
|
+
Update?: UpdateAction;
|
|
11
|
+
Delete?: DeleteAction;
|
|
12
|
+
}
|
|
13
|
+
/** The expression parts an action or a query may carry. */
|
|
14
|
+
export interface Expressions {
|
|
15
|
+
ConditionExpression?: string;
|
|
16
|
+
ExpressionAttributeNames?: Record<string, string>;
|
|
17
|
+
ExpressionAttributeValues?: Item;
|
|
18
|
+
}
|
|
19
|
+
export interface ConditionCheckAction extends Expressions {
|
|
20
|
+
TableName: string;
|
|
21
|
+
Key: Item;
|
|
22
|
+
ConditionExpression: string;
|
|
23
|
+
}
|
|
24
|
+
export interface PutAction extends Expressions {
|
|
25
|
+
TableName: string;
|
|
26
|
+
Item: Item;
|
|
27
|
+
}
|
|
28
|
+
export interface UpdateAction extends Expressions {
|
|
29
|
+
TableName: string;
|
|
30
|
+
Key: Item;
|
|
31
|
+
UpdateExpression: string;
|
|
32
|
+
}
|
|
33
|
+
export interface DeleteAction extends Expressions {
|
|
34
|
+
TableName: string;
|
|
35
|
+
Key: Item;
|
|
36
|
+
}
|
|
37
|
+
export interface GetItemInput {
|
|
38
|
+
TableName: string;
|
|
39
|
+
Key: Item;
|
|
40
|
+
ConsistentRead?: boolean;
|
|
41
|
+
ProjectionExpression?: string;
|
|
42
|
+
ExpressionAttributeNames?: Record<string, string>;
|
|
43
|
+
}
|
|
44
|
+
export interface PutItemInput extends Expressions {
|
|
45
|
+
TableName: string;
|
|
46
|
+
Item: Item;
|
|
47
|
+
}
|
|
48
|
+
export interface QueryInput {
|
|
49
|
+
TableName: string;
|
|
50
|
+
KeyConditionExpression: string;
|
|
51
|
+
ExpressionAttributeNames?: Record<string, string>;
|
|
52
|
+
ExpressionAttributeValues: Item;
|
|
53
|
+
ConsistentRead?: boolean;
|
|
54
|
+
ProjectionExpression?: string;
|
|
55
|
+
ScanIndexForward?: boolean;
|
|
56
|
+
Limit?: number;
|
|
57
|
+
ExclusiveStartKey?: Item;
|
|
58
|
+
}
|
|
59
|
+
export interface ScanInput {
|
|
60
|
+
TableName: string;
|
|
61
|
+
ConsistentRead?: boolean;
|
|
62
|
+
ProjectionExpression?: string;
|
|
63
|
+
Limit?: number;
|
|
64
|
+
ExclusiveStartKey?: Item;
|
|
65
|
+
}
|
|
66
|
+
/** A page of a query or a scan. Items come back as the SDK decodes them. */
|
|
67
|
+
export interface Page {
|
|
68
|
+
Items?: Record<string, unknown>[] | undefined;
|
|
69
|
+
LastEvaluatedKey?: Record<string, unknown> | undefined;
|
|
70
|
+
}
|
|
71
|
+
/** The calls {@link DynamoRepository} makes: the SDK's `DynamoDB` client has them all. */
|
|
72
|
+
export interface DynamoClient {
|
|
73
|
+
getItem(input: GetItemInput, options?: RequestOptions): Promise<{
|
|
74
|
+
Item?: Record<string, unknown> | undefined;
|
|
75
|
+
}>;
|
|
76
|
+
putItem(input: PutItemInput, options?: RequestOptions): Promise<unknown>;
|
|
77
|
+
query(input: QueryInput, options?: RequestOptions): Promise<Page>;
|
|
78
|
+
scan(input: ScanInput, options?: RequestOptions): Promise<Page>;
|
|
79
|
+
transactWriteItems(input: {
|
|
80
|
+
TransactItems: TransactItem[];
|
|
81
|
+
}, options?: RequestOptions): Promise<unknown>;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/dynamodb/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// The DynamoDB calls the repository makes, as a structural interface. The AWS SDK's aggregated
|
|
2
|
+
// `DynamoDB` client (`@aws-sdk/client-dynamodb`) satisfies it, so this package imports nothing
|
|
3
|
+
// from the SDK. Requests and responses use the low-level `AttributeValue` maps, never the document
|
|
4
|
+
// client's marshalling, because the storage format pins every attribute's type.
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/dynamodb/client.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,+FAA+F;AAC/F,mGAAmG;AACnG,gFAAgF"}
|
package/dist/dynamodb/index.d.ts
CHANGED
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
export { type AttributeValue, type Item, DEFAULT_VIEW_SORT_KEY, HEAD_SORT_KEY, SNAPSHOT_SORT_KEY, eventFromItem, eventItem, expiry, headFromItem, headItem, isSnapshotItem, itemSize, snapshotFromItem, snapshotItem, sortKey, viewItem, } from './item.js';
|
|
1
|
+
export { type AttributeValue, type Item, DEFAULT_VIEW_SORT_KEY, HEAD_SORT_KEY, SNAPSHOT_SORT_KEY, eventFromItem, eventItem, expiry, headFromItem, headItem, isSnapshotItem, itemSize, snapshotFromItem, snapshotItem, sortKey, ttlFromItem, viewItem, } from './item.js';
|
|
2
|
+
export { type ConditionCheckAction, type DeleteAction, type DynamoClient, type Expressions, type GetItemInput, type Page, type PutAction, type PutItemInput, type QueryInput, type RequestOptions, type ScanInput, type TransactItem, type UpdateAction, } from './client.js';
|
|
3
|
+
export { FEATURES_PK, REBUILD_LOCK_PK, manifestFromItem, markerItem } from './marker.js';
|
|
4
|
+
export { DynamoRepository, type DynamoRepositoryOptions } from './repository.js';
|
|
5
|
+
export { type CommitTtl, type SnapshotTtl, commitTransaction, snapshotTransaction, } from './requests.js';
|
|
2
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dynamodb/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,IAAI,EACT,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,OAAO,EACP,QAAQ,GACT,MAAM,WAAW,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dynamodb/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,IAAI,EACT,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,OAAO,EACP,WAAW,EACX,QAAQ,GACT,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,IAAI,EACT,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAC,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAC,MAAM,aAAa,CAAA;AACtF,OAAO,EAAC,gBAAgB,EAAE,KAAK,uBAAuB,EAAC,MAAM,iBAAiB,CAAA;AAC9E,OAAO,EACL,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,eAAe,CAAA"}
|
package/dist/dynamodb/index.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
// @photon-grove/evt/dynamodb: the DynamoDB backend.
|
|
2
|
-
//
|
|
3
|
-
export { DEFAULT_VIEW_SORT_KEY, HEAD_SORT_KEY, SNAPSHOT_SORT_KEY, eventFromItem, eventItem, expiry, headFromItem, headItem, isSnapshotItem, itemSize, snapshotFromItem, snapshotItem, sortKey, viewItem, } from './item.js';
|
|
1
|
+
// @photon-grove/evt/dynamodb: the DynamoDB backend. It imports nothing from the AWS SDK: the
|
|
2
|
+
// repository takes the SDK's `DynamoDB` client, or anything shaped like it, as a DynamoClient.
|
|
3
|
+
export { DEFAULT_VIEW_SORT_KEY, HEAD_SORT_KEY, SNAPSHOT_SORT_KEY, eventFromItem, eventItem, expiry, headFromItem, headItem, isSnapshotItem, itemSize, snapshotFromItem, snapshotItem, sortKey, ttlFromItem, viewItem, } from './item.js';
|
|
4
|
+
export {} from './client.js';
|
|
5
|
+
export { FEATURES_PK, REBUILD_LOCK_PK, manifestFromItem, markerItem } from './marker.js';
|
|
6
|
+
export { DynamoRepository } from './repository.js';
|
|
7
|
+
export { commitTransaction, snapshotTransaction, } from './requests.js';
|
|
4
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dynamodb/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dynamodb/index.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,+FAA+F;AAE/F,OAAO,EAGL,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,OAAO,EACP,WAAW,EACX,QAAQ,GACT,MAAM,WAAW,CAAA;AAClB,OAAO,EAcN,MAAM,aAAa,CAAA;AACpB,OAAO,EAAC,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAC,MAAM,aAAa,CAAA;AACtF,OAAO,EAAC,gBAAgB,EAA+B,MAAM,iBAAiB,CAAA;AAC9E,OAAO,EAGL,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,eAAe,CAAA"}
|
package/dist/dynamodb/item.d.ts
CHANGED
|
@@ -49,6 +49,8 @@ export declare function headFromItem(item: Item): {
|
|
|
49
49
|
head: bigint;
|
|
50
50
|
ttl: number | undefined;
|
|
51
51
|
};
|
|
52
|
+
/** An item's `ttl` in Unix seconds, or undefined when it has none. */
|
|
53
|
+
export declare function ttlFromItem(item: Item): number | undefined;
|
|
52
54
|
/** Whether an item is a stream's inline snapshot (`sk = 0`). */
|
|
53
55
|
export declare function isSnapshotItem(item: Item): boolean;
|
|
54
56
|
/** An item's numeric sort key, if it has one. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item.d.ts","sourceRoot":"","sources":["../../src/dynamodb/item.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAC,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAU,MAAM,aAAa,CAAA;AAalF,0EAA0E;AAC1E,MAAM,MAAM,cAAc,GACtB;IAAC,CAAC,EAAE,MAAM,CAAA;CAAC,GACX;IAAC,CAAC,EAAE,MAAM,CAAA;CAAC,GACX;IAAC,CAAC,EAAE,UAAU,CAAA;CAAC,GACf;IAAC,IAAI,EAAE,OAAO,CAAA;CAAC,GACf;IAAC,IAAI,EAAE,OAAO,CAAA;CAAC,GACf;IAAC,CAAC,EAAE,IAAI,CAAA;CAAC,GACT;IAAC,CAAC,EAAE,cAAc,EAAE,CAAA;CAAC,GACrB;IAAC,EAAE,EAAE,MAAM,EAAE,CAAA;CAAC,GACd;IAAC,EAAE,EAAE,MAAM,EAAE,CAAA;CAAC,GACd;IAAC,EAAE,EAAE,UAAU,EAAE,CAAA;CAAC,CAAA;AAEtB,uBAAuB;AACvB,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;AAEjD,kDAAkD;AAClD,eAAO,MAAM,iBAAiB,KAAK,CAAA;AAEnC,4CAA4C;AAC5C,eAAO,MAAM,aAAa,MAAM,CAAA;AAEhC,8CAA8C;AAC9C,eAAO,MAAM,qBAAqB,SAAS,CAAA;AAE3C,iGAAiG;AACjG,wBAAgB,SAAS,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAapE;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAY7E;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAQ3E;AAED,qFAAqF;AACrF,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI,CAQxF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,eAAe,CA0BzD;AAED,+CAA+C;AAC/C,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,kBAAkB,CAQ/D;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAC,
|
|
1
|
+
{"version":3,"file":"item.d.ts","sourceRoot":"","sources":["../../src/dynamodb/item.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAC,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAU,MAAM,aAAa,CAAA;AAalF,0EAA0E;AAC1E,MAAM,MAAM,cAAc,GACtB;IAAC,CAAC,EAAE,MAAM,CAAA;CAAC,GACX;IAAC,CAAC,EAAE,MAAM,CAAA;CAAC,GACX;IAAC,CAAC,EAAE,UAAU,CAAA;CAAC,GACf;IAAC,IAAI,EAAE,OAAO,CAAA;CAAC,GACf;IAAC,IAAI,EAAE,OAAO,CAAA;CAAC,GACf;IAAC,CAAC,EAAE,IAAI,CAAA;CAAC,GACT;IAAC,CAAC,EAAE,cAAc,EAAE,CAAA;CAAC,GACrB;IAAC,EAAE,EAAE,MAAM,EAAE,CAAA;CAAC,GACd;IAAC,EAAE,EAAE,MAAM,EAAE,CAAA;CAAC,GACd;IAAC,EAAE,EAAE,UAAU,EAAE,CAAA;CAAC,CAAA;AAEtB,uBAAuB;AACvB,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;AAEjD,kDAAkD;AAClD,eAAO,MAAM,iBAAiB,KAAK,CAAA;AAEnC,4CAA4C;AAC5C,eAAO,MAAM,aAAa,MAAM,CAAA;AAEhC,8CAA8C;AAC9C,eAAO,MAAM,qBAAqB,SAAS,CAAA;AAE3C,iGAAiG;AACjG,wBAAgB,SAAS,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAapE;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAY7E;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAQ3E;AAED,qFAAqF;AACrF,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI,CAQxF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,eAAe,CA0BzD;AAED,+CAA+C;AAC/C,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,kBAAkB,CAQ/D;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAC,CAEhF;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAI1D;AAED,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAElD;AAED,iDAAiD;AACjD,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAOtD;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAa7E;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAO3C"}
|
package/dist/dynamodb/item.js
CHANGED
|
@@ -110,11 +110,12 @@ export function snapshotFromItem(item) {
|
|
|
110
110
|
}
|
|
111
111
|
/** Decodes a head item into its head and its `ttl`, if it has one. */
|
|
112
112
|
export function headFromItem(item) {
|
|
113
|
+
return { head: requiredNumber(item, 'head'), ttl: ttlFromItem(item) };
|
|
114
|
+
}
|
|
115
|
+
/** An item's `ttl` in Unix seconds, or undefined when it has none. */
|
|
116
|
+
export function ttlFromItem(item) {
|
|
113
117
|
const ttl = optionalNumber(item, 'ttl');
|
|
114
|
-
return
|
|
115
|
-
head: requiredNumber(item, 'head'),
|
|
116
|
-
ttl: ttl === undefined ? undefined : safeInteger(ttl, 'ttl'),
|
|
117
|
-
};
|
|
118
|
+
return ttl === undefined ? undefined : safeInteger(ttl, 'ttl');
|
|
118
119
|
}
|
|
119
120
|
/** Whether an item is a stream's inline snapshot (`sk = 0`). */
|
|
120
121
|
export function isSnapshotItem(item) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item.js","sourceRoot":"","sources":["../../src/dynamodb/item.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"item.js","sourceRoot":"","sources":["../../src/dynamodb/item.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type FeatureManifest } from '../features.js';
|
|
2
|
+
import { type Item } from './item.js';
|
|
3
|
+
/** The partition key of the feature-marker row. */
|
|
4
|
+
export declare const FEATURES_PK = "SYSTEM#FEATURES";
|
|
5
|
+
/** The partition key of the rebuild-lock row, which every commit checks is absent. */
|
|
6
|
+
export declare const REBUILD_LOCK_PK = "SYSTEM#REBUILD";
|
|
7
|
+
/** Encodes a feature manifest as its marker item. Empty entity-type sets are left out. */
|
|
8
|
+
export declare function markerItem(manifest: FeatureManifest): Item;
|
|
9
|
+
/** Decodes a marker item. An absent text attribute is an empty map or set. */
|
|
10
|
+
export declare function manifestFromItem(item: Item): FeatureManifest;
|
|
11
|
+
//# sourceMappingURL=marker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marker.d.ts","sourceRoot":"","sources":["../../src/dynamodb/marker.ts"],"names":[],"mappings":"AAWA,OAAO,EAAC,KAAK,eAAe,EAAiC,MAAM,gBAAgB,CAAA;AACnF,OAAO,EAAC,KAAK,IAAI,EAAoB,MAAM,WAAW,CAAA;AAEtD,mDAAmD;AACnD,eAAO,MAAM,WAAW,oBAAoB,CAAA;AAE5C,sFAAsF;AACtF,eAAO,MAAM,eAAe,mBAAmB,CAAA;AAE/C,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAgB1D;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,eAAe,CAW5D"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// The DynamoDB item of the feature-marker row. The control rows live in the reserved SYSTEM#
|
|
2
|
+
// namespace at sort key 0.
|
|
3
|
+
//
|
|
4
|
+
// | Attribute | Type | Feature-marker item (`pk = SYSTEM#FEATURES`, `sk = 0`) |
|
|
5
|
+
// | ------------------ | ---- | ------------------------------------------------------------ |
|
|
6
|
+
// | `version` | N | bumped on every change to the manifest |
|
|
7
|
+
// | `features` | S | JSON object, feature name → stored-format version, sorted |
|
|
8
|
+
// | `historyDependent` | S | JSON array of entity types, sorted. Absent when empty |
|
|
9
|
+
// | `retention` | S | JSON array of entity types, sorted. Absent when empty |
|
|
10
|
+
import { checkInt64, invalid } from '../fields.js';
|
|
11
|
+
import { decodeManifest, encodeManifest } from '../features.js';
|
|
12
|
+
import { SNAPSHOT_SORT_KEY } from './item.js';
|
|
13
|
+
/** The partition key of the feature-marker row. */
|
|
14
|
+
export const FEATURES_PK = 'SYSTEM#FEATURES';
|
|
15
|
+
/** The partition key of the rebuild-lock row, which every commit checks is absent. */
|
|
16
|
+
export const REBUILD_LOCK_PK = 'SYSTEM#REBUILD';
|
|
17
|
+
/** Encodes a feature manifest as its marker item. Empty entity-type sets are left out. */
|
|
18
|
+
export function markerItem(manifest) {
|
|
19
|
+
const texts = encodeManifest(manifest);
|
|
20
|
+
const item = {
|
|
21
|
+
pk: { S: FEATURES_PK },
|
|
22
|
+
sk: { N: SNAPSHOT_SORT_KEY.toString() },
|
|
23
|
+
version: { N: manifest.version.toString() },
|
|
24
|
+
features: { S: texts.features },
|
|
25
|
+
};
|
|
26
|
+
if (manifest.historyDependent.length > 0) {
|
|
27
|
+
item['historyDependent'] = { S: texts.historyDependent };
|
|
28
|
+
}
|
|
29
|
+
if (manifest.retention.length > 0) {
|
|
30
|
+
item['retention'] = { S: texts.retention };
|
|
31
|
+
}
|
|
32
|
+
return item;
|
|
33
|
+
}
|
|
34
|
+
/** Decodes a marker item. An absent text attribute is an empty map or set. */
|
|
35
|
+
export function manifestFromItem(item) {
|
|
36
|
+
const version = item['version'];
|
|
37
|
+
if (version === undefined || !('N' in version) || !/^\d+$/.test(version.N)) {
|
|
38
|
+
throw invalid('the feature marker has no version');
|
|
39
|
+
}
|
|
40
|
+
return decodeManifest(checkInt64(BigInt(version.N), 'the feature marker version'), {
|
|
41
|
+
features: text(item, 'features'),
|
|
42
|
+
historyDependent: text(item, 'historyDependent'),
|
|
43
|
+
retention: text(item, 'retention'),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function text(item, name) {
|
|
47
|
+
const value = item[name];
|
|
48
|
+
if (value === undefined) {
|
|
49
|
+
return '';
|
|
50
|
+
}
|
|
51
|
+
if (!('S' in value)) {
|
|
52
|
+
throw invalid(`the feature marker's ${name} attribute is not a string`);
|
|
53
|
+
}
|
|
54
|
+
return value.S;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=marker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marker.js","sourceRoot":"","sources":["../../src/dynamodb/marker.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,2BAA2B;AAC3B,EAAE;AACF,+FAA+F;AAC/F,+FAA+F;AAC/F,+FAA+F;AAC/F,+FAA+F;AAC/F,+FAA+F;AAC/F,+FAA+F;AAE/F,OAAO,EAAC,UAAU,EAAE,OAAO,EAAC,MAAM,cAAc,CAAA;AAChD,OAAO,EAAuB,cAAc,EAAE,cAAc,EAAC,MAAM,gBAAgB,CAAA;AACnF,OAAO,EAAY,iBAAiB,EAAC,MAAM,WAAW,CAAA;AAEtD,mDAAmD;AACnD,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,CAAA;AAE5C,sFAAsF;AACtF,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAA;AAE/C,0FAA0F;AAC1F,MAAM,UAAU,UAAU,CAAC,QAAyB;IAClD,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAA;IACtC,MAAM,IAAI,GAAS;QACjB,EAAE,EAAE,EAAC,CAAC,EAAE,WAAW,EAAC;QACpB,EAAE,EAAE,EAAC,CAAC,EAAE,iBAAiB,CAAC,QAAQ,EAAE,EAAC;QACrC,OAAO,EAAE,EAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAC;QACzC,QAAQ,EAAE,EAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAC;KAC9B,CAAA;IACD,IAAI,QAAQ,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAC,CAAC,EAAE,KAAK,CAAC,gBAAgB,EAAC,CAAA;IACxD,CAAC;IACD,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAC,CAAC,EAAE,KAAK,CAAC,SAAS,EAAC,CAAA;IAC1C,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB,CAAC,IAAU;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAA;IAC/B,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,OAAO,CAAC,mCAAmC,CAAC,CAAA;IACpD,CAAC;IAED,OAAO,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,4BAA4B,CAAC,EAAE;QACjF,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QAChC,gBAAgB,EAAE,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC;QAChD,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;KACnC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,IAAU,EAAE,IAAY;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAA;IACX,CAAC;IACD,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,OAAO,CAAC,wBAAwB,IAAI,4BAA4B,CAAC,CAAA;IACzE,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,CAAA;AAChB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { SerializedEvent, SerializedSnapshot } from '../event.js';
|
|
2
|
+
import { type CallOptions, type Commit, type Repository, type StoreInitializer } from '../repository.js';
|
|
3
|
+
import type { DynamoClient } from './client.js';
|
|
4
|
+
/** How a {@link DynamoRepository} reads and initializes its store. */
|
|
5
|
+
export interface DynamoRepositoryOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Whether a write to a store that doesn't declare stream-heads initializes it, scanning the
|
|
8
|
+
* table to make sure it holds no data, instead of refusing with a
|
|
9
|
+
* {@link StoreNotInitializedError}. Off by default, so writers never need `dynamodb:Scan`:
|
|
10
|
+
* initialize a fresh store once, at deploy time, with {@link DynamoRepository.initialize}.
|
|
11
|
+
*/
|
|
12
|
+
lazyInitialization?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Whether event and snapshot reads are strongly consistent. On by default. Head reads, the
|
|
15
|
+
* failure-path probe, compaction and the feature marker always read consistently.
|
|
16
|
+
*/
|
|
17
|
+
consistentRead?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* How long the items of each entity type live, in whole milliseconds, keyed by entity type.
|
|
20
|
+
* Every event, snapshot and head item of a type with a positive retention carries a DynamoDB
|
|
21
|
+
* `ttl`, the write time plus the retention in Unix seconds, for the table's TTL to delete. A
|
|
22
|
+
* type that isn't listed, or has 0, is kept forever. TTL deletes items in no order, so retain
|
|
23
|
+
* only short-lived streams that nothing replays. Declare the retained types in the store's
|
|
24
|
+
* feature manifest too, from Go or Rust, so that their writers refuse read fences on them.
|
|
25
|
+
*/
|
|
26
|
+
retention?: Readonly<Record<string, number>> | ReadonlyMap<string, number>;
|
|
27
|
+
/**
|
|
28
|
+
* The clock that stamps `ttl`s and decides which have passed, in Unix milliseconds as
|
|
29
|
+
* `Date.now` gives them, never seconds. `Date.now` by default.
|
|
30
|
+
*/
|
|
31
|
+
clock?: () => number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A {@link Repository} on a DynamoDB event-log table, through the AWS SDK's low-level `DynamoDB`
|
|
35
|
+
* client or anything shaped like it ({@link DynamoClient}).
|
|
36
|
+
*
|
|
37
|
+
* The repository validates the store's feature manifest at its first write and caches the version
|
|
38
|
+
* it validated. Every commit and snapshot write checks that version, so when another writer
|
|
39
|
+
* declares a feature, the next write fails, validates the manifest again, and either refuses an
|
|
40
|
+
* unsupported feature or fails once with a retryable {@link FeatureManifestChangedError}.
|
|
41
|
+
*/
|
|
42
|
+
export declare class DynamoRepository implements Repository, StoreInitializer {
|
|
43
|
+
#private;
|
|
44
|
+
constructor(client: DynamoClient, eventsTable: string, options?: DynamoRepositoryOptions);
|
|
45
|
+
/** The events table this repository writes. */
|
|
46
|
+
get eventsTable(): string;
|
|
47
|
+
/**
|
|
48
|
+
* Declares stream-heads on a store that holds no data, and resolves `true` when this call
|
|
49
|
+
* declared it. It scans the table with strongly consistent reads, so run it once, at deploy
|
|
50
|
+
* time, with a role that may Scan. Concurrent initializations let exactly one declare.
|
|
51
|
+
*/
|
|
52
|
+
initialize(options?: CallOptions): Promise<boolean>;
|
|
53
|
+
commit(commit: Commit, options?: CallOptions): Promise<void>;
|
|
54
|
+
events(entityId: string, options?: CallOptions): Promise<SerializedEvent[]>;
|
|
55
|
+
eventsAfter(entityId: string, after: bigint, options?: CallOptions): Promise<SerializedEvent[]>;
|
|
56
|
+
latest(entityId: string, n: number, options?: CallOptions): Promise<SerializedEvent[]>;
|
|
57
|
+
snapshot(entityId: string, options?: CallOptions): Promise<SerializedSnapshot | null>;
|
|
58
|
+
putSnapshot(snapshot: SerializedSnapshot, options?: CallOptions): Promise<boolean>;
|
|
59
|
+
compactBelow(entityId: string, through: bigint, options?: CallOptions): Promise<number>;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/dynamodb/repository.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAC,eAAe,EAAE,kBAAkB,EAAC,MAAM,aAAa,CAAA;AASpE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,MAAM,EACX,KAAK,UAAU,EACf,KAAK,gBAAgB,EAMtB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAC,YAAY,EAAqC,MAAM,aAAa,CAAA;AAoBjF,sEAAsE;AACtE,MAAM,WAAW,uBAAuB;IACtC;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1E;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,MAAM,CAAA;CACrB;AAoBD;;;;;;;;GAQG;AACH,qBAAa,gBAAiB,YAAW,UAAU,EAAE,gBAAgB;;IAgBnE,YAAY,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,EAO3F;IAED,+CAA+C;IAC/C,IAAI,WAAW,IAAI,MAAM,CAExB;IAED;;;;OAIG;IACG,UAAU,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAyBxD;IAEK,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBjE;IAEK,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAEhF;IAEK,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,eAAe,EAAE,CAAC,CAa5B;IAEK,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAmB3F;IAEK,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAI1F;IAEK,WAAW,CAAC,QAAQ,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAgEvF;IAEK,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA+C5F;CAyjBF"}
|