was-teaching-server 0.10.0 → 0.11.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 +68 -0
- package/README.md +23 -11
- package/dist/backends/filesystem.d.ts +86 -2
- package/dist/backends/filesystem.d.ts.map +1 -1
- package/dist/backends/filesystem.js +220 -21
- package/dist/backends/filesystem.js.map +1 -1
- package/dist/backends/postgres.d.ts +74 -2
- package/dist/backends/postgres.d.ts.map +1 -1
- package/dist/backends/postgres.js +175 -13
- package/dist/backends/postgres.js.map +1 -1
- package/dist/backends/postgresSchema.d.ts.map +1 -1
- package/dist/backends/postgresSchema.js +69 -82
- package/dist/backends/postgresSchema.js.map +1 -1
- package/dist/errors.d.ts +13 -9
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +22 -12
- package/dist/errors.js.map +1 -1
- package/dist/lib/equalityIndex.d.ts +334 -0
- package/dist/lib/equalityIndex.d.ts.map +1 -0
- package/dist/lib/equalityIndex.js +552 -0
- package/dist/lib/equalityIndex.js.map +1 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +5 -2
- package/dist/plugin.js.map +1 -1
- package/dist/requests/CollectionRequest.d.ts +22 -5
- package/dist/requests/CollectionRequest.d.ts.map +1 -1
- package/dist/requests/CollectionRequest.js +192 -11
- package/dist/requests/CollectionRequest.js.map +1 -1
- package/dist/requests/ResourceRequest.d.ts.map +1 -1
- package/dist/requests/ResourceRequest.js +20 -0
- package/dist/requests/ResourceRequest.js.map +1 -1
- package/dist/requests/SpaceRequest.d.ts +1 -0
- package/dist/requests/SpaceRequest.d.ts.map +1 -1
- package/dist/requests/SpaceRequest.js +21 -1
- package/dist/requests/SpaceRequest.js.map +1 -1
- package/dist/types.d.ts +84 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +19 -18
- package/src/backends/filesystem.ts +286 -18
- package/src/backends/postgres.ts +247 -11
- package/src/errors.ts +25 -12
- package/src/lib/equalityIndex.ts +769 -0
- package/src/plugin.ts +5 -2
- package/src/requests/CollectionRequest.ts +221 -12
- package/src/requests/ResourceRequest.ts +20 -0
- package/src/requests/SpaceRequest.ts +25 -1
- package/src/types.ts +97 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,73 @@
|
|
|
1
1
|
# History
|
|
2
2
|
|
|
3
|
+
## 0.11.0 - 2026-07-19
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- **The `equality` query profile (the `equality-query` backend feature).** A
|
|
8
|
+
plaintext Collection can now declare which top-level attributes the server
|
|
9
|
+
extracts and indexes, and answer server-side equality queries over them at
|
|
10
|
+
`POST /space/{spaceId}/{collectionId}/query` with `{ "profile": "equality" }`.
|
|
11
|
+
The body carries exactly one of `equals` (a disjunction of `{ name: value }`
|
|
12
|
+
conjunctions) or `has` (attributes that must be present), plus optional
|
|
13
|
+
`count`, `limit`, and an opaque `cursor`; matching is strict JSON equality
|
|
14
|
+
(`"1"` never matches `1`; a multi-valued array attribute matches any element)
|
|
15
|
+
and a query naming an attribute the Collection does not declare is rejected
|
|
16
|
+
fail-closed (`invalid-request-body`, 400). The response is a
|
|
17
|
+
`{ documents: [{ id, data?, custom? }], hasMore, cursor? }` page in ascending
|
|
18
|
+
Resource-id order (`data` for JSON Resources, `custom` for any Resource with
|
|
19
|
+
custom metadata -- so blob Resources are queryable through their `custom`
|
|
20
|
+
tags), or `{ count }`. Unlike the client-computed `blinded-index` profile, the
|
|
21
|
+
server does the extraction, so a plain Resource write is immediately
|
|
22
|
+
queryable; the profile is capability-or-policy readable like List Collection,
|
|
23
|
+
and an encrypted Collection answers `unsupported-operation` (501). Both
|
|
24
|
+
first-party backends evaluate through one shared module so their semantics
|
|
25
|
+
cannot drift.
|
|
26
|
+
- **The `indexes` Collection Description property.** A plaintext Collection opts
|
|
27
|
+
in by declaring `indexes`: an array of attribute-name strings, or objects
|
|
28
|
+
`{ name, source: "content" | "custom", unique: true }` where `source` (default
|
|
29
|
+
`content`) names where the attribute is extracted from -- a JSON Resource's
|
|
30
|
+
content, or any Resource's `custom` metadata object. Declared names must be
|
|
31
|
+
unique across the array. Unlike `encryption`, `indexes` is updatable (entries
|
|
32
|
+
may be added or removed); it MUST NOT be combined with an `encryption` marker
|
|
33
|
+
(rejected `invalid-request-body`, 400, in both directions). An entry marked
|
|
34
|
+
`unique: true` claims per-Collection uniqueness for that attribute's
|
|
35
|
+
`(name, value)` pairs: a content or metadata write whose extracted value is
|
|
36
|
+
already held by a different Resource is rejected with `id-conflict` (409),
|
|
37
|
+
enforced atomically with the write; adding a unique claim to a Collection
|
|
38
|
+
whose stored Resources already violate it is likewise rejected (409).
|
|
39
|
+
- **The GET `filter[attr]=value` equality filter on List Collection.**
|
|
40
|
+
`GET /space/{spaceId}/{collectionId}/?filter[attr]=value` runs the equality
|
|
41
|
+
profile over the same machinery from the anonymous, HTTP-cacheable listing
|
|
42
|
+
endpoint: it answers the same document page. Every filter attribute must be
|
|
43
|
+
declared in the Collection's `indexes` (fail-closed 400); on a `PublicCanRead`
|
|
44
|
+
Collection the filter query needs no capability, so a cache can serve it.
|
|
45
|
+
|
|
46
|
+
## 0.10.2 - TBD
|
|
47
|
+
|
|
48
|
+
### Changed
|
|
49
|
+
|
|
50
|
+
- Protocol conformance testing now uses the extracted
|
|
51
|
+
`@interop/was-conformance-suite` package (devDependency) instead of the
|
|
52
|
+
in-tree `conformance/` directory, which has been removed. `pnpm conformance`
|
|
53
|
+
now runs the package's `was-conformance` CLI (URL passed positionally;
|
|
54
|
+
`TEST_SERVER_URL` / `TEST_ONBOARDING_TOKEN` env vars still work as fallbacks),
|
|
55
|
+
and `pnpm conformance:local` still spins up a matched local server but
|
|
56
|
+
delegates the test run to the CLI, forwarding any extra arguments. CI now
|
|
57
|
+
exercises the production build against the CLI twice -- open provisioning and
|
|
58
|
+
onboarding-token-gated -- and uploads the JSON conformance reports as build
|
|
59
|
+
artifacts.
|
|
60
|
+
|
|
61
|
+
## 0.10.1 - 2026-07-19
|
|
62
|
+
|
|
63
|
+
### Fixed
|
|
64
|
+
|
|
65
|
+
- CORS registration now sets `exposedHeaders: ['Location', 'ETag', 'Link']`, so
|
|
66
|
+
browser-based clients can read the `Location` header on space/resource
|
|
67
|
+
creation, `ETag` for metaVersion concurrency, and `Link` for pagination and
|
|
68
|
+
policy linkset discovery. Previously these were blocked by the default CORS
|
|
69
|
+
response-header allowlist, breaking browser wallets.
|
|
70
|
+
|
|
3
71
|
## 0.10.0 - 2026-07-19
|
|
4
72
|
|
|
5
73
|
### Added
|
package/README.md
CHANGED
|
@@ -272,30 +272,42 @@ reusable.
|
|
|
272
272
|
|
|
273
273
|
### Conformance Tests
|
|
274
274
|
|
|
275
|
-
|
|
276
|
-
`
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
275
|
+
Protocol conformance testing lives in its own package,
|
|
276
|
+
[`@interop/was-conformance-suite`](https://github.com/interop-alliance/was-conformance-suite),
|
|
277
|
+
which ships a `was-conformance` CLI that runs against any WAS server by URL
|
|
278
|
+
(installed here as a devDependency). The URL passed to the CLI and the server's
|
|
279
|
+
`SERVER_URL` **must be byte-for-byte identical** (including host and port) —
|
|
280
|
+
ZCap `invocationTarget` URLs embed the full host:port, so even `localhost` vs
|
|
281
|
+
`127.0.0.1` or a port mismatch will make delegated-access tests 404.
|
|
280
282
|
|
|
281
283
|
For a local run, `pnpm conformance:local` does the whole dance for you: it spins
|
|
282
|
-
up the server on a fixed local URL, waits until it answers, runs the
|
|
283
|
-
|
|
284
|
-
|
|
284
|
+
up the server on a fixed local URL, waits until it answers, runs the CLI against
|
|
285
|
+
that same URL, and tears the server down afterward (even if the suite fails) —
|
|
286
|
+
so the two URLs can't drift out of sync.
|
|
285
287
|
|
|
286
288
|
```bash
|
|
287
289
|
# One-shot local run (recommended). Override the port with PORT=... if 3002 is
|
|
288
|
-
# taken; the server and
|
|
290
|
+
# taken; the server and CLI URLs are both derived from it, so they stay in
|
|
291
|
+
# sync. Arguments after -- are forwarded to the CLI.
|
|
289
292
|
pnpm conformance:local
|
|
293
|
+
pnpm conformance:local -- --grep chunk --reporter json
|
|
290
294
|
|
|
291
295
|
# Against an already-running or external server. Start it with a matching
|
|
292
296
|
# SERVER_URL, then in another shell:
|
|
293
|
-
|
|
297
|
+
pnpm conformance https://was.example.com
|
|
294
298
|
|
|
295
299
|
# With an onboarding token, for servers that require one for POST /spaces/:
|
|
296
|
-
|
|
300
|
+
pnpm conformance https://was.example.com --token abc123
|
|
301
|
+
|
|
302
|
+
# TEST_SERVER_URL / TEST_ONBOARDING_TOKEN env vars still work as fallbacks:
|
|
303
|
+
TEST_SERVER_URL=https://was.example.com pnpm conformance
|
|
297
304
|
```
|
|
298
305
|
|
|
306
|
+
Useful CLI options: `-s/--suite <id>`, `-g/--grep <pattern>`,
|
|
307
|
+
`--include-optional` / `--skip-optional`, `-r json`, `--timeout <ms>`,
|
|
308
|
+
`--fail-fast`. Exit codes: `0` conformant, `1` failures, `2` usage error or
|
|
309
|
+
server unreachable.
|
|
310
|
+
|
|
299
311
|
## Security
|
|
300
312
|
|
|
301
313
|
This is an experimental research server.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Transform, type Readable } from 'node:stream';
|
|
2
2
|
import type { FastifyBaseLogger } from 'fastify';
|
|
3
3
|
import type { BlindedIndexQuery, BlindedIndexQueryPage } from '../lib/blindedIndex.js';
|
|
4
|
+
import type { EqualityQuery, EqualityQueryPage, EqualityValue, NormalizedIndexDeclaration } from '../lib/equalityIndex.js';
|
|
4
5
|
import type { SpaceDescription, CollectionDescription, CollectionSummary, CollectionResourcesList, ResourceResult, ResourceMetadata, ResourceMetadataCustom, ResourceInput, ImportStats, PolicyDocument, BackendDescriptor, BackendUsage, CollectionUsage, StorageBackend, StoredBackendRecord, KeystoreConfig, KmsKeyRecord, RevocationRecord, RevocationScope, CapabilitySummary, IDID } from '../types.js';
|
|
5
6
|
/**
|
|
6
7
|
* The on-disk shape of a Resource's metadata sidecar (`.meta.<resourceId>.json`,
|
|
@@ -590,13 +591,14 @@ export declare class FileSystemBackend implements StorageBackend {
|
|
|
590
591
|
* @param [options.ifNoneMatch] {boolean} `If-None-Match: *` (create-if-absent)
|
|
591
592
|
* @returns {Promise<{ version: number }>} the Resource's new version
|
|
592
593
|
*/
|
|
593
|
-
writeResource({ spaceId, collectionId, resourceId, input, createdBy, epoch, ifMatch, ifNoneMatch }: {
|
|
594
|
+
writeResource({ spaceId, collectionId, resourceId, input, createdBy, epoch, uniqueIndexes, ifMatch, ifNoneMatch }: {
|
|
594
595
|
spaceId: string;
|
|
595
596
|
collectionId: string;
|
|
596
597
|
resourceId: string;
|
|
597
598
|
input: ResourceInput;
|
|
598
599
|
createdBy?: IDID;
|
|
599
600
|
epoch?: string;
|
|
601
|
+
uniqueIndexes?: NormalizedIndexDeclaration[];
|
|
600
602
|
ifMatch?: string;
|
|
601
603
|
ifNoneMatch?: boolean;
|
|
602
604
|
}): Promise<{
|
|
@@ -786,12 +788,13 @@ export declare class FileSystemBackend implements StorageBackend {
|
|
|
786
788
|
* @returns {Promise<{ metaVersion: number } | undefined>} the new
|
|
787
789
|
* `metaVersion`, or `undefined` when the Resource does not exist
|
|
788
790
|
*/
|
|
789
|
-
writeResourceMetadata({ spaceId, collectionId, resourceId, custom, epoch, ifMatch, ifNoneMatch }: {
|
|
791
|
+
writeResourceMetadata({ spaceId, collectionId, resourceId, custom, epoch, uniqueIndexes, ifMatch, ifNoneMatch }: {
|
|
790
792
|
spaceId: string;
|
|
791
793
|
collectionId: string;
|
|
792
794
|
resourceId: string;
|
|
793
795
|
custom: ResourceMetadataCustom | Record<string, unknown>;
|
|
794
796
|
epoch?: string;
|
|
797
|
+
uniqueIndexes?: NormalizedIndexDeclaration[];
|
|
795
798
|
ifMatch?: string;
|
|
796
799
|
ifNoneMatch?: boolean;
|
|
797
800
|
}): Promise<{
|
|
@@ -1052,6 +1055,87 @@ export declare class FileSystemBackend implements StorageBackend {
|
|
|
1052
1055
|
* @returns {Promise<Array<{ resourceId: string, document: unknown }>>}
|
|
1053
1056
|
*/
|
|
1054
1057
|
private _readJsonCandidates;
|
|
1058
|
+
/**
|
|
1059
|
+
* Plaintext equality query (the `equality` query profile; see the
|
|
1060
|
+
* `StorageBackend.queryByEquality` contract). Reads every live Resource of
|
|
1061
|
+
* the Collection -- JSON Resources carrying parsed `content`, blobs carrying
|
|
1062
|
+
* only their sidecar `custom` -- and hands the candidates to the shared
|
|
1063
|
+
* evaluator (`lib/equalityIndex.ts`) for extraction, matching, ordering, and
|
|
1064
|
+
* cursor pagination. O(n) over the Collection per call, with every JSON body
|
|
1065
|
+
* read -- deliberate for this teaching backend; a materialized backend would
|
|
1066
|
+
* answer from an attribute index. Tombstones are excluded naturally (no live
|
|
1067
|
+
* content file).
|
|
1068
|
+
* @param options {object}
|
|
1069
|
+
* @param options.spaceId {string}
|
|
1070
|
+
* @param options.collectionId {string}
|
|
1071
|
+
* @param options.query {EqualityQuery}
|
|
1072
|
+
* @param options.indexes {NormalizedIndexDeclaration[]} the normalized
|
|
1073
|
+
* declared indexes (the request layer resolves them from the description)
|
|
1074
|
+
* @param [options.count] {boolean} return only the match count
|
|
1075
|
+
* @param [options.limit] {number} requested page size
|
|
1076
|
+
* @param [options.cursor] {string} opaque cursor from a prior page
|
|
1077
|
+
* @returns {Promise<{ count: number } | EqualityQueryPage>}
|
|
1078
|
+
*/
|
|
1079
|
+
queryByEquality({ spaceId, collectionId, query, indexes, count, limit, cursor }: {
|
|
1080
|
+
spaceId: string;
|
|
1081
|
+
collectionId: string;
|
|
1082
|
+
query: EqualityQuery;
|
|
1083
|
+
indexes: NormalizedIndexDeclaration[];
|
|
1084
|
+
count?: boolean;
|
|
1085
|
+
limit?: number;
|
|
1086
|
+
cursor?: string;
|
|
1087
|
+
}): Promise<{
|
|
1088
|
+
count: number;
|
|
1089
|
+
} | EqualityQueryPage>;
|
|
1090
|
+
/**
|
|
1091
|
+
* Declare-time uniqueness scan for the `equality` profile (see the
|
|
1092
|
+
* `StorageBackend.findEqualityUniqueViolation` contract): reads the
|
|
1093
|
+
* Collection's live Resources and delegates to the shared scan, which reports
|
|
1094
|
+
* the first `(name, value)` claimed by two different Resources under the given
|
|
1095
|
+
* `unique` declarations (or `undefined` when none is).
|
|
1096
|
+
* @param options {object}
|
|
1097
|
+
* @param options.spaceId {string}
|
|
1098
|
+
* @param options.collectionId {string}
|
|
1099
|
+
* @param options.indexes {NormalizedIndexDeclaration[]}
|
|
1100
|
+
* @returns {Promise<{ name: string, value: EqualityValue } | undefined>}
|
|
1101
|
+
*/
|
|
1102
|
+
findEqualityUniqueViolation({ spaceId, collectionId, indexes }: {
|
|
1103
|
+
spaceId: string;
|
|
1104
|
+
collectionId: string;
|
|
1105
|
+
indexes: NormalizedIndexDeclaration[];
|
|
1106
|
+
}): Promise<{
|
|
1107
|
+
name: string;
|
|
1108
|
+
value: EqualityValue;
|
|
1109
|
+
} | undefined>;
|
|
1110
|
+
/**
|
|
1111
|
+
* Reads every live Resource of a Collection as an equality candidate -- the
|
|
1112
|
+
* candidate set for the equality query and the plaintext unique-attribute
|
|
1113
|
+
* conflict scans. Unlike `_readJsonCandidates` this INCLUDES blob Resources
|
|
1114
|
+
* (a blob is queryable through its `custom`-sourced attributes): each entry
|
|
1115
|
+
* resolves `{ resourceId, content?, custom? }`, where `content` is the parsed
|
|
1116
|
+
* JSON of a JSON-typed representation (the blob content read is skipped, and
|
|
1117
|
+
* unparsable JSON is dropped, as in `_readJsonCandidates`) and `custom` is the
|
|
1118
|
+
* `.meta.` sidecar's `custom` when present. Tombstones are excluded naturally
|
|
1119
|
+
* (no live `r.` content file); an optional excluded Resource is skipped. An
|
|
1120
|
+
* absent Collection dir resolves empty.
|
|
1121
|
+
* @param options {object}
|
|
1122
|
+
* @param options.spaceId {string}
|
|
1123
|
+
* @param options.collectionId {string}
|
|
1124
|
+
* @param [options.excludeResourceId] {string} omit this Resource (a conflict
|
|
1125
|
+
* scan excludes the Resource being written)
|
|
1126
|
+
* @returns {Promise<EqualityCandidate[]>}
|
|
1127
|
+
*/
|
|
1128
|
+
private _readEqualityCandidates;
|
|
1129
|
+
/**
|
|
1130
|
+
* Reads and parses a single Resource's stored JSON content, or resolves
|
|
1131
|
+
* `undefined` when the Resource is absent, a blob, or unparsable JSON -- the
|
|
1132
|
+
* content side of a custom-sourced unique-attribute claim on a metadata write.
|
|
1133
|
+
* @param options {object}
|
|
1134
|
+
* @param options.collectionDir {string}
|
|
1135
|
+
* @param options.resourceId {string}
|
|
1136
|
+
* @returns {Promise<unknown>}
|
|
1137
|
+
*/
|
|
1138
|
+
private _readResourceJsonContent;
|
|
1055
1139
|
/**
|
|
1056
1140
|
* Builds the on-disk path for a policy document. Stored as a dot-file keyed by
|
|
1057
1141
|
* the entity id, alongside the matching `.space.` / `.collection.` description:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/backends/filesystem.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/backends/filesystem.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AAItD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AA2DhD,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,wBAAwB,CAAA;AAM/B,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EAEjB,aAAa,EACb,0BAA0B,EAC3B,MAAM,yBAAyB,CAAA;AAMhC,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,IAAI,EACL,MAAM,aAAa,CAAA;AAsBpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IAMjB,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IAIpB,MAAM,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAMzD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE9D;AA0BD,qBAAa,iBAAkB,YAAW,cAAc;IACtD,SAAS,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAA;IACpB;;;;;;;;OAQG;IACH,mBAAmB,EAAE,MAAM,CAAA;IAC3B,MAAM,EAAE,iBAAiB,CAAA;IACzB;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;;;;;;OASG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAE7B;;;;;;OAMG;IACH,OAAO,CAAC,WAAW,CAAmB;IAEtC;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW,CAGhB;gBAES,EACV,OAAO,EACP,MAAM,EACN,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,EACrB,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,CAAC,EAAE,iBAAiB,CAAA;QAC1B,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,sBAAsB,CAAC,EAAE,MAAM,CAAA;QAC/B,sBAAsB,CAAC,EAAE,MAAM,CAAA;QAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAA;KAC9B;IAyCD;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,YAAY,CAAC,CAAC;IAmCxE;;;;;;;;;OASG;IACG,UAAU,CACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC;IA4C9D;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACG,WAAW,CAAC,EAChB,OAAO,EACP,kBAA0B,EAC3B,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAC7B,GAAG,OAAO,CAAC,YAAY,CAAC;IAczB;;;;;;;;;;;;;OAaG;IACG,qBAAqB,CAAC,EAC1B,OAAO,EACP,YAAY,EACb,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;KACrB,GAAG,OAAO,CAAC,YAAY,CAAC;IAezB;;;;;;;;;;;OAWG;IACH,mBAAmB,CAAC,EAClB,UAAU,EACV,eAAe,EAChB,EAAE;QACD,UAAU,EAAE,MAAM,CAAA;QAClB,eAAe,EAAE,MAAM,CAAA;KACxB,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,mBAAmB,CAAC;IAa1D;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,oBAAoB,CAAC,EACzB,OAAO,EACP,aAAa,EACb,aAAiB,EAClB,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,aAAa,EAAE,MAAM,CAAA;QACrB,aAAa,CAAC,EAAE,MAAM,CAAA;KACvB,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBnB;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,EACV,OAAO,EACP,aAAa,EACb,aAAa,EACd,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,aAAa,EAAE,MAAM,CAAA;QACrB,aAAa,EAAE,MAAM,CAAA;KACtB,GAAG,SAAS;IAcb;;;;;;;;;OASG;IACH,eAAe,CAAC,EAAE,cAAc,EAAE,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAe1E;;;;;;;;;OASG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,MAAuB,GAAG,IAAI;IAY5E,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAMlC;;;;;;OAMG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAM5C,cAAc,CAAC,EACb,OAAO,EACP,YAAY,EACb,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;KACrB,GAAG,MAAM;IAMV;;;;OAIG;IACG,eAAe,CAAC,EAAE,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBxE;;;;;OAKG;IACG,oBAAoB,CAAC,EACzB,OAAO,EACP,YAAY,EACb,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;KACrB,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBnB;;;;;;;;;;;;;;;OAeG;IACG,iBAAiB,CAAC,EACtB,aAAa,EACb,UAAU,EACX,EAAE;QACD,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;KACnB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAkBrB;;;;;OAKG;IACG,SAAS,CAAC,EACd,aAAa,EACb,UAAU,EACX,EAAE;QACD,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;KACnB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAU/B;;;;;;;OAOG;IACG,UAAU,CAAC,EACf,OAAO,EACP,gBAAgB,EAChB,SAAS,EACV,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,gBAAgB,EAAE,gBAAgB,CAAA;QAClC,SAAS,CAAC,EAAE,IAAI,CAAA;KACjB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+CjB;;;;;OAKG;IACG,mBAAmB,CAAC,EACxB,OAAO,EACR,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;KAChB,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IASzC;;;;;;;;OAQG;IACG,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAalE;;;;;;OAMG;IACG,UAAU,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IA2B/C;;;;;;;;;;OAUG;IACG,mBAAmB,CAAC,EAAE,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAmC5E;;;;OAIG;IACG,eAAe,CAAC,EACpB,OAAO,EACR,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;KAChB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IA6BhC;;;;OAIG;IACG,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IAiKtE;;;;;;;OAOG;IACG,WAAW,CAAC,EAChB,OAAO,EACP,SAAS,EACV,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,QAAQ,CAAA;KACpB,GAAG,OAAO,CAAC,WAAW,CAAC;IA0UxB;;;;;;;;;;;;OAYG;IACG,eAAe,CAAC,EACpB,OAAO,EACP,YAAY,EACZ,qBAAqB,EACrB,SAAS,EACT,OAAO,EACP,gBAAgB,EACjB,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,qBAAqB,EAAE,qBAAqB,CAAA;QAC5C,SAAS,CAAC,EAAE,IAAI,CAAA;QAChB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,gBAAgB,CAAC,EAAE,CACjB,KAAK,CAAC,EAAE,qBAAqB,GAAG;YAAE,kBAAkB,CAAC,EAAE,MAAM,CAAA;SAAE,KAC5D,IAAI,CAAA;KACV,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAwEhC;;;;;;;;;OASG;IACH,sBAAsB,CAAC,EACrB,OAAO,EACP,YAAY,EACb,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;KACrB,GAAG,MAAM;IAIV;;;;;;;;;;;;;;;;;OAiBG;IACG,kBAAkB,CAAC,EACvB,OAAO,EACP,YAAY,EACZ,qBAAqB,EACrB,kBAAkB,EACnB,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,qBAAqB,EAAE,qBAAqB,CAAA;QAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAC5B,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBjB;;;;;;OAMG;IACG,wBAAwB,CAAC,EAC7B,OAAO,EACP,YAAY,EACb,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;KACrB,GAAG,OAAO,CACT,CAAC,qBAAqB,GAAG;QAAE,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,CACtE;IAsBD;;;;;OAKG;IACG,gBAAgB,CAAC,EACrB,OAAO,EACP,YAAY,EACb,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;KACrB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjB;;;;;;;;;;;;;;;OAeG;IACG,mBAAmB,CAAC,EACxB,OAAO,EACP,YAAY,EACZ,KAAK,EACL,MAAM,EACN,qBAAqB,EAAE,mBAAmB,EAC3C,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,qBAAqB,CAAC,EAAE,qBAAqB,CAAA;KAC9C,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAqHpC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACG,aAAa,CAAC,EAClB,OAAO,EACP,YAAY,EACZ,UAAU,EACV,KAAK,EACL,SAAS,EACT,KAAK,EACL,aAAa,EACb,OAAO,EACP,WAAW,EACZ,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;QAClB,KAAK,EAAE,aAAa,CAAA;QACpB,SAAS,CAAC,EAAE,IAAI,CAAA;QAChB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,aAAa,CAAC,EAAE,0BAA0B,EAAE,CAAA;QAC5C,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,WAAW,CAAC,EAAE,OAAO,CAAA;KACtB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA+EhC;;;;;;OAMG;YACW,oBAAoB;IAuGlC;;;;;;;;;;;;;;;;OAgBG;YACW,yBAAyB;IAoGvC;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EACf,OAAO,EACP,YAAY,EACZ,UAAU,EACX,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;KACnB,GAAG,MAAM;IAIV;;;;;;;;OAQG;IACH,kBAAkB,CAAC,EACjB,OAAO,EACP,YAAY,EACb,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;KACrB,GAAG,MAAM;IAIV;;;;;;;;;;;OAWG;IACG,wBAAwB,CAAC,EAC7B,aAAa,EACb,UAAU,EACV,OAAO,EACP,WAAW,EACZ,EAAE;QACD,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,WAAW,CAAC,EAAE,OAAO,CAAA;KACtB,GAAG,OAAO,CAAC,IAAI,CAAC;IAejB;;;;;;;;OAQG;IACG,WAAW,CAAC,EAChB,OAAO,EACP,YAAY,EACZ,UAAU,EACX,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;QAClB;;;WAGG;QACH,WAAW,CAAC,EAAE,MAAM,CAAA;KACrB,GAAG,OAAO,CAAC,cAAc,CAAC;IAkC3B;;;;;;;OAOG;IACH,gBAAgB,CAAC,EACf,aAAa,EACb,UAAU,EACX,EAAE;QACD,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;KACnB,GAAG,MAAM;IAMV;;;;;;;OAOG;IACG,gBAAgB,CAAC,EACrB,aAAa,EACb,UAAU,EACX,EAAE;QACD,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;KACnB,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAOpC;;;;;;;OAOG;IACG,iBAAiB,CAAC,EACtB,aAAa,EACb,UAAU,EACV,OAAO,EACR,EAAE;QACD,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,EAAE,WAAW,CAAA;KACrB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,mBAAmB,CAAC,EACxB,OAAO,EACP,YAAY,EACZ,UAAU,EACX,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;KACnB,GAAG,OAAO,CACT,CAAC,gBAAgB,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,CAC5E;IA8CD;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACG,qBAAqB,CAAC,EAC1B,OAAO,EACP,YAAY,EACZ,UAAU,EACV,MAAM,EACN,KAAK,EACL,aAAa,EACb,OAAO,EACP,WAAW,EACZ,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;QAClB,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACxD,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,aAAa,CAAC,EAAE,0BAA0B,EAAE,CAAA;QAC5C,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,WAAW,CAAC,EAAE,OAAO,CAAA;KACtB,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAiGhD;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACG,cAAc,CAAC,EACnB,OAAO,EACP,YAAY,EACZ,UAAU,EACV,OAAO,EACR,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4EjB;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,EACR,aAAa,EACb,UAAU,EACX,EAAE;QACD,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;KACnB,GAAG,MAAM;IAMV;;;;;;;;;;;;;;;;;;;OAmBG;IACG,UAAU,CAAC,EACf,OAAO,EACP,YAAY,EACZ,UAAU,EACV,UAAU,EACV,KAAK,EACL,OAAO,EACP,WAAW,EACZ,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;QAClB,KAAK,EAAE,aAAa,CAAA;QACpB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,WAAW,CAAC,EAAE,OAAO,CAAA;KACtB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBhC;;;;OAIG;YACW,iBAAiB;IAqF/B;;;;;;;;;;OAUG;IACG,QAAQ,CAAC,EACb,OAAO,EACP,YAAY,EACZ,UAAU,EACV,UAAU,EACX,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;KACnB,GAAG,OAAO,CAAC,cAAc,CAAC;IAmC3B;;;;;;;;;;OAUG;IACG,gBAAgB,CAAC,EACrB,OAAO,EACP,YAAY,EACZ,UAAU,EACV,UAAU,EACX,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;KACnB,GAAG,OAAO,CACT;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CACpE;IAkCD;;;;;;;;;;;;;;OAcG;IACG,WAAW,CAAC,EAChB,OAAO,EACP,YAAY,EACZ,UAAU,EACV,UAAU,EACV,OAAO,EACR,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,GAAG,OAAO,CAAC,OAAO,CAAC;IAkDpB;;;;;;;;;;;OAWG;IACG,UAAU,CAAC,EACf,OAAO,EACP,YAAY,EACZ,UAAU,EACX,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;KACnB,GAAG,OAAO,CAAC;QACV,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,KAAK,CAAC;YACZ,KAAK,EAAE,MAAM,CAAA;YACb,IAAI,EAAE,MAAM,CAAA;YACZ,WAAW,EAAE,MAAM,CAAA;YACnB,OAAO,CAAC,EAAE,MAAM,CAAA;SACjB,CAAC,CAAA;KACH,CAAC;IAyCF;;;;;;;;;;;;;;;;OAgBG;IACG,YAAY,CAAC,EACjB,OAAO,EACP,YAAY,EACZ,UAAU,EACV,KAAK,EACN,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,CAAC,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAA;QAC9C,KAAK,EAAE,MAAM,CAAA;KACd,GAAG,OAAO,CAAC;QACV,SAAS,EAAE,KAAK,CAAC;YACf,UAAU,EAAE,MAAM,CAAA;YAClB,OAAO,EAAE,MAAM,CAAA;YACf,WAAW,CAAC,EAAE,MAAM,CAAA;YACpB,SAAS,CAAC,EAAE,IAAI,CAAA;YAChB,SAAS,EAAE,MAAM,CAAA;YACjB,OAAO,EAAE,OAAO,CAAA;YAChB,IAAI,CAAC,EAAE,OAAO,CAAA;YACd,MAAM,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACzD,KAAK,CAAC,EAAE,MAAM,CAAA;SACf,CAAC,CAAA;QACF,UAAU,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAA;KACrD,CAAC;IA2NF;;;;;;;;;;;;;;;;;;OAkBG;IACG,mBAAmB,CAAC,EACxB,OAAO,EACP,YAAY,EACZ,KAAK,EACL,KAAK,EACL,KAAK,EACL,MAAM,EACP,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,KAAK,EAAE,iBAAiB,CAAA;QACxB,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,qBAAqB,CAAC;IAQtD;;;;;;;;;;;;OAYG;YACW,mBAAmB;IAqDjC;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,eAAe,CAAC,EACpB,OAAO,EACP,YAAY,EACZ,KAAK,EACL,OAAO,EACP,KAAK,EACL,KAAK,EACL,MAAM,EACP,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,KAAK,EAAE,aAAa,CAAA;QACpB,OAAO,EAAE,0BAA0B,EAAE,CAAA;QACrC,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,iBAAiB,CAAC;IAelD;;;;;;;;;;;OAWG;IACG,2BAA2B,CAAC,EAChC,OAAO,EACP,YAAY,EACZ,OAAO,EACR,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,OAAO,EAAE,0BAA0B,EAAE,CAAA;KACtC,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,aAAa,CAAA;KAAE,GAAG,SAAS,CAAC;IAQ/D;;;;;;;;;;;;;;;;;OAiBG;YACW,uBAAuB;IA4DrC;;;;;;;;OAQG;YACW,wBAAwB;IAwBtC;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EACV,OAAO,EACP,YAAY,EACZ,UAAU,EACX,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,GAAG,MAAM;IAWV;;;;;;;OAOG;IACG,SAAS,CAAC,EACd,OAAO,EACP,YAAY,EACZ,UAAU,EACX,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAOvC;;;;;;;OAOG;IACG,WAAW,CAAC,EAChB,OAAO,EACP,YAAY,EACZ,UAAU,EACV,MAAM,EACP,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,MAAM,EAAE,cAAc,CAAA;KACvB,GAAG,OAAO,CAAC,IAAI,CAAC;IAajB;;;;;;OAMG;IACG,YAAY,CAAC,EACjB,OAAO,EACP,YAAY,EACZ,UAAU,EACX,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjB;;;;;;;;OAQG;IACH,YAAY,CAAC,EACX,OAAO,EACP,SAAS,EACV,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;KAClB,GAAG,MAAM;IASV;;;;;;;OAOG;IACG,YAAY,CAAC,EACjB,OAAO,EACP,SAAS,EACT,MAAM,EACP,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;QACjB,MAAM,EAAE,mBAAmB,CAAA;KAC5B,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjB;;;;;;;;OAQG;IACG,UAAU,CAAC,EACf,OAAO,EACP,SAAS,EACV,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;KAClB,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAO5C;;;;;;;;OAQG;IACG,YAAY,CAAC,EACjB,OAAO,EACR,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;KAChB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IA0BhC;;;;;;OAMG;IACG,aAAa,CAAC,EAClB,OAAO,EACP,SAAS,EACV,EAAE;QACD,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;KAClB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjB;;;;;;;;;OASG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAMxC,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAI/C;;;;;;;;OAQG;IACG,aAAa,CAAC,EAClB,UAAU,EACV,MAAM,EACP,EAAE;QACD,UAAU,EAAE,MAAM,CAAA;QAClB,MAAM,EAAE,cAAc,CAAA;KACvB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjB;;;;;OAKG;IACG,WAAW,CAAC,EAChB,UAAU,EACX,EAAE;QACD,UAAU,EAAE,MAAM,CAAA;KACnB,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAOvC;;;;;;;;;;OAUG;IACG,cAAc,CAAC,EACnB,UAAU,EACV,MAAM,EACP,EAAE;QACD,UAAU,EAAE,MAAM,CAAA;QAClB,MAAM,EAAE,cAAc,CAAA;KACvB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBjB;;;;;;;;OAQG;IACG,yBAAyB,CAAC,EAC9B,UAAU,EACX,EAAE;QACD,UAAU,EAAE,IAAI,CAAA;KACjB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAyB7B;;;;;;;;;OASG;IACH,QAAQ,CAAC,EACP,UAAU,EACV,OAAO,EACR,EAAE;QACD,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,EAAE,MAAM,CAAA;KAChB,GAAG,MAAM;IAOV;;;;;;;;;OASG;IACG,SAAS,CAAC,EACd,UAAU,EACV,OAAO,EACP,MAAM,EACP,EAAE;QACD,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,YAAY,CAAA;KACrB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBjB;;;;;;OAMG;IACG,MAAM,CAAC,EACX,UAAU,EACV,OAAO,EACR,EAAE;QACD,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,EAAE,MAAM,CAAA;KAChB,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAerC;;;;;;;;OAQG;IACG,QAAQ,CAAC,EACb,UAAU,EACX,EAAE;QACD,UAAU,EAAE,MAAM,CAAA;KACnB,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IA2B7D;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,EACd,KAAK,EACL,SAAS,EACT,YAAY,EACb,EAAE;QACD,KAAK,EAAE,eAAe,CAAA;QACtB,SAAS,EAAE,MAAM,CAAA;QACjB,YAAY,EAAE,MAAM,CAAA;KACrB,GAAG,MAAM;IAYV;;;;;;;;;OASG;IACG,gBAAgB,CAAC,EACrB,KAAK,EACL,MAAM,EACP,EAAE;QACD,KAAK,EAAE,eAAe,CAAA;QACtB,MAAM,EAAE,gBAAgB,CAAA;KACzB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCjB;;;;;;;;;;;OAWG;IACG,SAAS,CAAC,EACd,KAAK,EACL,YAAY,EACb,EAAE;QACD,KAAK,EAAE,eAAe,CAAA;QACtB,YAAY,EAAE,iBAAiB,EAAE,CAAA;KAClC,GAAG,OAAO,CAAC,OAAO,CAAC;CA0BrB"}
|
|
@@ -32,6 +32,7 @@ import { normalizeDescriptionWrite } from '../lib/collectionDescription.js';
|
|
|
32
32
|
import { atomicWriteFile, atomicCreateFile, tempPathFor, commitTempFile } from '../lib/atomicFile.js';
|
|
33
33
|
import { DEFAULT_PAGE_SIZE, clampPageSize } from '../lib/pagination.js';
|
|
34
34
|
import { runBlindedIndexQuery, collectUniqueBlindedTerms, assertNoUniqueBlindedConflict } from '../lib/blindedIndex.js';
|
|
35
|
+
import { runEqualityQuery, assertNoUniqueEqualityConflict, findEqualityUniqueViolation } from '../lib/equalityIndex.js';
|
|
35
36
|
import { assertWritePrecondition, assertMetaWritePrecondition, assertCollectionWritePrecondition } from '../lib/preconditions.js';
|
|
36
37
|
const { Store: MetadataJsonStore } = jsonfs;
|
|
37
38
|
const execFileAsync = promisify(execFile);
|
|
@@ -232,10 +233,14 @@ export class FileSystemBackend {
|
|
|
232
233
|
// Resources, and conditional (`If-Match`) Collection Description writes.
|
|
233
234
|
// `chunked-streams`: chunk addressing (`/{resourceId}/chunks/{n}`) for a
|
|
234
235
|
// large Resource, each chunk stored opaquely (bytes + content-type).
|
|
236
|
+
// `equality-query`: serves the `equality` profile -- server-extracted
|
|
237
|
+
// plaintext attribute equality over a Collection's declared `indexes`
|
|
238
|
+
// (`queryByEquality`), plus the GET `filter[attr]=value` equality filter.
|
|
235
239
|
features: [
|
|
236
240
|
'conditional-writes',
|
|
237
241
|
'changes-query',
|
|
238
242
|
'blinded-index-query',
|
|
243
|
+
'equality-query',
|
|
239
244
|
'key-epochs',
|
|
240
245
|
'chunked-streams'
|
|
241
246
|
]
|
|
@@ -1529,7 +1534,7 @@ export class FileSystemBackend {
|
|
|
1529
1534
|
* @param [options.ifNoneMatch] {boolean} `If-None-Match: *` (create-if-absent)
|
|
1530
1535
|
* @returns {Promise<{ version: number }>} the Resource's new version
|
|
1531
1536
|
*/
|
|
1532
|
-
async writeResource({ spaceId, collectionId, resourceId, input, createdBy, epoch, ifMatch, ifNoneMatch }) {
|
|
1537
|
+
async writeResource({ spaceId, collectionId, resourceId, input, createdBy, epoch, uniqueIndexes, ifMatch, ifNoneMatch }) {
|
|
1533
1538
|
const collectionDir = this._collectionDir({ spaceId, collectionId });
|
|
1534
1539
|
const lockKey = this._resourceLockKey({
|
|
1535
1540
|
spaceId,
|
|
@@ -1546,26 +1551,53 @@ export class FileSystemBackend {
|
|
|
1546
1551
|
ifMatch,
|
|
1547
1552
|
ifNoneMatch
|
|
1548
1553
|
}));
|
|
1549
|
-
//
|
|
1550
|
-
//
|
|
1551
|
-
//
|
|
1552
|
-
//
|
|
1553
|
-
//
|
|
1554
|
-
//
|
|
1555
|
-
// Collection
|
|
1556
|
-
//
|
|
1557
|
-
//
|
|
1558
|
-
|
|
1559
|
-
|
|
1554
|
+
// Two unique-attribute invariants can force a write to serialize on the
|
|
1555
|
+
// Collection lock before it takes its per-Resource lock: the EDV blinded
|
|
1556
|
+
// one (`unique: true` blinded attributes; the `blinded-index-query`
|
|
1557
|
+
// feature) and the plaintext equality one (a Collection's `unique`-declared
|
|
1558
|
+
// `indexes`; the `equality-query` feature). Only a JSON content write can
|
|
1559
|
+
// create either claim, so only such writes pay for it: they serialize per
|
|
1560
|
+
// Collection (the outer lock, so two racing claimants cannot both pass the
|
|
1561
|
+
// scan), evaluate the conflict against the Collection's other live
|
|
1562
|
+
// documents, then take the ordinary per-Resource lock nested inside.
|
|
1563
|
+
// Distinct-key nesting cannot deadlock: plain writes never hold a Resource
|
|
1564
|
+
// key while waiting on a Collection key. The two conditions are unified so a
|
|
1565
|
+
// write carrying both claims acquires the Collection lock exactly once.
|
|
1566
|
+
const blindedUnique = input.kind === 'json' &&
|
|
1567
|
+
collectUniqueBlindedTerms({ document: input.data }).length > 0;
|
|
1568
|
+
const equalityUnique = input.kind === 'json' &&
|
|
1569
|
+
uniqueIndexes !== undefined &&
|
|
1570
|
+
uniqueIndexes.length > 0;
|
|
1571
|
+
if (blindedUnique || equalityUnique) {
|
|
1560
1572
|
return this._writeMutex.run(this._collectionLockKey({ spaceId, collectionId }), async () => {
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1573
|
+
if (blindedUnique) {
|
|
1574
|
+
assertNoUniqueBlindedConflict({
|
|
1575
|
+
document: input.kind === 'json' ? input.data : undefined,
|
|
1576
|
+
candidates: await this._readJsonCandidates({
|
|
1577
|
+
spaceId,
|
|
1578
|
+
collectionId,
|
|
1579
|
+
excludeResourceId: resourceId
|
|
1580
|
+
})
|
|
1581
|
+
});
|
|
1582
|
+
}
|
|
1583
|
+
if (equalityUnique) {
|
|
1584
|
+
// A content write does not change the Resource's `custom`, so the
|
|
1585
|
+
// custom side of the claim comes from the CURRENT stored sidecar.
|
|
1586
|
+
const priorSidecar = await this._readMetaSidecar({
|
|
1587
|
+
collectionDir,
|
|
1588
|
+
resourceId
|
|
1589
|
+
});
|
|
1590
|
+
assertNoUniqueEqualityConflict({
|
|
1591
|
+
indexes: uniqueIndexes,
|
|
1592
|
+
content: input.kind === 'json' ? input.data : undefined,
|
|
1593
|
+
custom: priorSidecar?.custom,
|
|
1594
|
+
candidates: await this._readEqualityCandidates({
|
|
1595
|
+
spaceId,
|
|
1596
|
+
collectionId,
|
|
1597
|
+
excludeResourceId: resourceId
|
|
1598
|
+
})
|
|
1599
|
+
});
|
|
1600
|
+
}
|
|
1569
1601
|
return write();
|
|
1570
1602
|
});
|
|
1571
1603
|
}
|
|
@@ -1978,7 +2010,7 @@ export class FileSystemBackend {
|
|
|
1978
2010
|
* @returns {Promise<{ metaVersion: number } | undefined>} the new
|
|
1979
2011
|
* `metaVersion`, or `undefined` when the Resource does not exist
|
|
1980
2012
|
*/
|
|
1981
|
-
async writeResourceMetadata({ spaceId, collectionId, resourceId, custom, epoch, ifMatch, ifNoneMatch }) {
|
|
2013
|
+
async writeResourceMetadata({ spaceId, collectionId, resourceId, custom, epoch, uniqueIndexes, ifMatch, ifNoneMatch }) {
|
|
1982
2014
|
const collectionDir = this._collectionDir({ spaceId, collectionId });
|
|
1983
2015
|
const writeMeta = async () => {
|
|
1984
2016
|
const filePath = await this._findFile({ collectionDir, resourceId });
|
|
@@ -2035,6 +2067,32 @@ export class FileSystemBackend {
|
|
|
2035
2067
|
});
|
|
2036
2068
|
return { metaVersion };
|
|
2037
2069
|
};
|
|
2070
|
+
// A metadata write can create a plaintext equality unique claim for a
|
|
2071
|
+
// `custom`-sourced attribute (the `equality-query` feature). When the
|
|
2072
|
+
// Collection declares any unique index, serialize on the Collection lock and
|
|
2073
|
+
// scan for a conflict -- content is the Resource's stored JSON content
|
|
2074
|
+
// (unchanged by a metadata write), custom is the incoming value this write
|
|
2075
|
+
// sets -- before taking the per-Resource lock nested inside. Distinct-key
|
|
2076
|
+
// nesting cannot deadlock (plain writes never hold a Resource key while
|
|
2077
|
+
// waiting on a Collection key).
|
|
2078
|
+
if (uniqueIndexes !== undefined && uniqueIndexes.length > 0) {
|
|
2079
|
+
return this._writeMutex.run(this._collectionLockKey({ spaceId, collectionId }), async () => {
|
|
2080
|
+
assertNoUniqueEqualityConflict({
|
|
2081
|
+
indexes: uniqueIndexes,
|
|
2082
|
+
content: await this._readResourceJsonContent({
|
|
2083
|
+
collectionDir,
|
|
2084
|
+
resourceId
|
|
2085
|
+
}),
|
|
2086
|
+
custom,
|
|
2087
|
+
candidates: await this._readEqualityCandidates({
|
|
2088
|
+
spaceId,
|
|
2089
|
+
collectionId,
|
|
2090
|
+
excludeResourceId: resourceId
|
|
2091
|
+
})
|
|
2092
|
+
});
|
|
2093
|
+
return this._writeMutex.run(this._resourceLockKey({ spaceId, collectionId, resourceId }), writeMeta);
|
|
2094
|
+
});
|
|
2095
|
+
}
|
|
2038
2096
|
return this._writeMutex.run(this._resourceLockKey({ spaceId, collectionId, resourceId }), writeMeta);
|
|
2039
2097
|
}
|
|
2040
2098
|
/**
|
|
@@ -2690,6 +2748,147 @@ export class FileSystemBackend {
|
|
|
2690
2748
|
}
|
|
2691
2749
|
}))).filter(candidate => candidate !== undefined);
|
|
2692
2750
|
}
|
|
2751
|
+
/**
|
|
2752
|
+
* Plaintext equality query (the `equality` query profile; see the
|
|
2753
|
+
* `StorageBackend.queryByEquality` contract). Reads every live Resource of
|
|
2754
|
+
* the Collection -- JSON Resources carrying parsed `content`, blobs carrying
|
|
2755
|
+
* only their sidecar `custom` -- and hands the candidates to the shared
|
|
2756
|
+
* evaluator (`lib/equalityIndex.ts`) for extraction, matching, ordering, and
|
|
2757
|
+
* cursor pagination. O(n) over the Collection per call, with every JSON body
|
|
2758
|
+
* read -- deliberate for this teaching backend; a materialized backend would
|
|
2759
|
+
* answer from an attribute index. Tombstones are excluded naturally (no live
|
|
2760
|
+
* content file).
|
|
2761
|
+
* @param options {object}
|
|
2762
|
+
* @param options.spaceId {string}
|
|
2763
|
+
* @param options.collectionId {string}
|
|
2764
|
+
* @param options.query {EqualityQuery}
|
|
2765
|
+
* @param options.indexes {NormalizedIndexDeclaration[]} the normalized
|
|
2766
|
+
* declared indexes (the request layer resolves them from the description)
|
|
2767
|
+
* @param [options.count] {boolean} return only the match count
|
|
2768
|
+
* @param [options.limit] {number} requested page size
|
|
2769
|
+
* @param [options.cursor] {string} opaque cursor from a prior page
|
|
2770
|
+
* @returns {Promise<{ count: number } | EqualityQueryPage>}
|
|
2771
|
+
*/
|
|
2772
|
+
async queryByEquality({ spaceId, collectionId, query, indexes, count, limit, cursor }) {
|
|
2773
|
+
const candidates = await this._readEqualityCandidates({
|
|
2774
|
+
spaceId,
|
|
2775
|
+
collectionId
|
|
2776
|
+
});
|
|
2777
|
+
return runEqualityQuery({
|
|
2778
|
+
candidates,
|
|
2779
|
+
query,
|
|
2780
|
+
indexes,
|
|
2781
|
+
count,
|
|
2782
|
+
limit,
|
|
2783
|
+
cursor
|
|
2784
|
+
});
|
|
2785
|
+
}
|
|
2786
|
+
/**
|
|
2787
|
+
* Declare-time uniqueness scan for the `equality` profile (see the
|
|
2788
|
+
* `StorageBackend.findEqualityUniqueViolation` contract): reads the
|
|
2789
|
+
* Collection's live Resources and delegates to the shared scan, which reports
|
|
2790
|
+
* the first `(name, value)` claimed by two different Resources under the given
|
|
2791
|
+
* `unique` declarations (or `undefined` when none is).
|
|
2792
|
+
* @param options {object}
|
|
2793
|
+
* @param options.spaceId {string}
|
|
2794
|
+
* @param options.collectionId {string}
|
|
2795
|
+
* @param options.indexes {NormalizedIndexDeclaration[]}
|
|
2796
|
+
* @returns {Promise<{ name: string, value: EqualityValue } | undefined>}
|
|
2797
|
+
*/
|
|
2798
|
+
async findEqualityUniqueViolation({ spaceId, collectionId, indexes }) {
|
|
2799
|
+
const candidates = await this._readEqualityCandidates({
|
|
2800
|
+
spaceId,
|
|
2801
|
+
collectionId
|
|
2802
|
+
});
|
|
2803
|
+
return findEqualityUniqueViolation({ indexes, candidates });
|
|
2804
|
+
}
|
|
2805
|
+
/**
|
|
2806
|
+
* Reads every live Resource of a Collection as an equality candidate -- the
|
|
2807
|
+
* candidate set for the equality query and the plaintext unique-attribute
|
|
2808
|
+
* conflict scans. Unlike `_readJsonCandidates` this INCLUDES blob Resources
|
|
2809
|
+
* (a blob is queryable through its `custom`-sourced attributes): each entry
|
|
2810
|
+
* resolves `{ resourceId, content?, custom? }`, where `content` is the parsed
|
|
2811
|
+
* JSON of a JSON-typed representation (the blob content read is skipped, and
|
|
2812
|
+
* unparsable JSON is dropped, as in `_readJsonCandidates`) and `custom` is the
|
|
2813
|
+
* `.meta.` sidecar's `custom` when present. Tombstones are excluded naturally
|
|
2814
|
+
* (no live `r.` content file); an optional excluded Resource is skipped. An
|
|
2815
|
+
* absent Collection dir resolves empty.
|
|
2816
|
+
* @param options {object}
|
|
2817
|
+
* @param options.spaceId {string}
|
|
2818
|
+
* @param options.collectionId {string}
|
|
2819
|
+
* @param [options.excludeResourceId] {string} omit this Resource (a conflict
|
|
2820
|
+
* scan excludes the Resource being written)
|
|
2821
|
+
* @returns {Promise<EqualityCandidate[]>}
|
|
2822
|
+
*/
|
|
2823
|
+
async _readEqualityCandidates({ spaceId, collectionId, excludeResourceId }) {
|
|
2824
|
+
const collectionDir = this._collectionDir({ spaceId, collectionId });
|
|
2825
|
+
let entries = [];
|
|
2826
|
+
try {
|
|
2827
|
+
entries = await fs.promises.readdir(collectionDir, {
|
|
2828
|
+
withFileTypes: true
|
|
2829
|
+
});
|
|
2830
|
+
}
|
|
2831
|
+
catch (err) {
|
|
2832
|
+
if (err.code !== 'ENOENT') {
|
|
2833
|
+
throw err;
|
|
2834
|
+
}
|
|
2835
|
+
}
|
|
2836
|
+
return await Promise.all(entries
|
|
2837
|
+
.filter(entry => entry.isFile() && entry.name.startsWith('r.'))
|
|
2838
|
+
.map(entry => ({
|
|
2839
|
+
fileName: entry.name,
|
|
2840
|
+
...parseResourceFileName(entry.name)
|
|
2841
|
+
}))
|
|
2842
|
+
.filter(({ resourceId }) => resourceId !== excludeResourceId)
|
|
2843
|
+
.map(async ({ resourceId, fileName, contentType }) => {
|
|
2844
|
+
// Parse the content only for a JSON representation; a blob contributes
|
|
2845
|
+
// no content-sourced attributes (its `custom` still makes it
|
|
2846
|
+
// queryable). Unparsable JSON is treated as no content.
|
|
2847
|
+
let content;
|
|
2848
|
+
if (isJson({ contentType })) {
|
|
2849
|
+
try {
|
|
2850
|
+
content = JSON.parse(await fs.promises.readFile(path.join(collectionDir, fileName), 'utf8'));
|
|
2851
|
+
}
|
|
2852
|
+
catch {
|
|
2853
|
+
content = undefined;
|
|
2854
|
+
}
|
|
2855
|
+
}
|
|
2856
|
+
const sidecar = await this._readMetaSidecar({
|
|
2857
|
+
collectionDir,
|
|
2858
|
+
resourceId
|
|
2859
|
+
});
|
|
2860
|
+
return {
|
|
2861
|
+
resourceId,
|
|
2862
|
+
...(content !== undefined && { content }),
|
|
2863
|
+
...(sidecar?.custom !== undefined && { custom: sidecar.custom })
|
|
2864
|
+
};
|
|
2865
|
+
}));
|
|
2866
|
+
}
|
|
2867
|
+
/**
|
|
2868
|
+
* Reads and parses a single Resource's stored JSON content, or resolves
|
|
2869
|
+
* `undefined` when the Resource is absent, a blob, or unparsable JSON -- the
|
|
2870
|
+
* content side of a custom-sourced unique-attribute claim on a metadata write.
|
|
2871
|
+
* @param options {object}
|
|
2872
|
+
* @param options.collectionDir {string}
|
|
2873
|
+
* @param options.resourceId {string}
|
|
2874
|
+
* @returns {Promise<unknown>}
|
|
2875
|
+
*/
|
|
2876
|
+
async _readResourceJsonContent({ collectionDir, resourceId }) {
|
|
2877
|
+
const filePath = await this._findFile({ collectionDir, resourceId });
|
|
2878
|
+
if (!filePath) {
|
|
2879
|
+
return undefined;
|
|
2880
|
+
}
|
|
2881
|
+
const { contentType } = parseResourceFileName(path.basename(filePath));
|
|
2882
|
+
if (!isJson({ contentType })) {
|
|
2883
|
+
return undefined;
|
|
2884
|
+
}
|
|
2885
|
+
try {
|
|
2886
|
+
return JSON.parse(await fs.promises.readFile(filePath, 'utf8'));
|
|
2887
|
+
}
|
|
2888
|
+
catch {
|
|
2889
|
+
return undefined;
|
|
2890
|
+
}
|
|
2891
|
+
}
|
|
2693
2892
|
// Policies
|
|
2694
2893
|
/**
|
|
2695
2894
|
* Builds the on-disk path for a policy document. Stored as a dot-file keyed by
|