@ariestools/aries-datalake-core 0.1.13
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 +12 -0
- package/dist/browser/api/errors.d.ts +24 -0
- package/dist/browser/api/errors.d.ts.map +1 -0
- package/dist/browser/api/health.d.ts +12 -0
- package/dist/browser/api/health.d.ts.map +1 -0
- package/dist/browser/api/paths.d.ts +13 -0
- package/dist/browser/api/paths.d.ts.map +1 -0
- package/dist/browser/api/planePaths.d.ts +31 -0
- package/dist/browser/api/planePaths.d.ts.map +1 -0
- package/dist/browser/api/requests.d.ts +18 -0
- package/dist/browser/api/requests.d.ts.map +1 -0
- package/dist/browser/browser.d.ts +21 -0
- package/dist/browser/browser.d.ts.map +1 -0
- package/dist/browser/browser.mjs +144 -0
- package/dist/browser/browser.mjs.map +7 -0
- package/dist/browser/types/AclEntry.d.ts +14 -0
- package/dist/browser/types/AclEntry.d.ts.map +1 -0
- package/dist/browser/types/BrowserPayload.d.ts +48 -0
- package/dist/browser/types/BrowserPayload.d.ts.map +1 -0
- package/dist/browser/types/DatalakeConfig.d.ts +48 -0
- package/dist/browser/types/DatalakeConfig.d.ts.map +1 -0
- package/dist/browser/types/DatalakeDescriptor.d.ts +38 -0
- package/dist/browser/types/DatalakeDescriptor.d.ts.map +1 -0
- package/dist/browser/types/Principal.d.ts +17 -0
- package/dist/browser/types/Principal.d.ts.map +1 -0
- package/dist/browser/types/Region.d.ts +8 -0
- package/dist/browser/types/Region.d.ts.map +1 -0
- package/dist/browser/types/Scope.d.ts +17 -0
- package/dist/browser/types/Scope.d.ts.map +1 -0
- package/dist/browser/types/Status.d.ts +7 -0
- package/dist/browser/types/Status.d.ts.map +1 -0
- package/dist/browser/types/Tier.d.ts +8 -0
- package/dist/browser/types/Tier.d.ts.map +1 -0
- package/dist/browser/types/Token.d.ts +18 -0
- package/dist/browser/types/Token.d.ts.map +1 -0
- package/dist/node/api/errors.d.ts +24 -0
- package/dist/node/api/errors.d.ts.map +1 -0
- package/dist/node/api/health.d.ts +12 -0
- package/dist/node/api/health.d.ts.map +1 -0
- package/dist/node/api/paths.d.ts +13 -0
- package/dist/node/api/paths.d.ts.map +1 -0
- package/dist/node/api/planePaths.d.ts +31 -0
- package/dist/node/api/planePaths.d.ts.map +1 -0
- package/dist/node/api/requests.d.ts +18 -0
- package/dist/node/api/requests.d.ts.map +1 -0
- package/dist/node/auth/sessionTokenCodec.d.ts +69 -0
- package/dist/node/auth/sessionTokenCodec.d.ts.map +1 -0
- package/dist/node/auth/strictHs256.d.ts +13 -0
- package/dist/node/auth/strictHs256.d.ts.map +1 -0
- package/dist/node/auth/tokenCodec.d.ts +49 -0
- package/dist/node/auth/tokenCodec.d.ts.map +1 -0
- package/dist/node/browser.d.ts +21 -0
- package/dist/node/browser.d.ts.map +1 -0
- package/dist/node/index.d.ts +27 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.mjs +423 -0
- package/dist/node/index.mjs.map +7 -0
- package/dist/node/store/DatalakeStore.d.ts +36 -0
- package/dist/node/store/DatalakeStore.d.ts.map +1 -0
- package/dist/node/types/AclEntry.d.ts +14 -0
- package/dist/node/types/AclEntry.d.ts.map +1 -0
- package/dist/node/types/BrowserPayload.d.ts +48 -0
- package/dist/node/types/BrowserPayload.d.ts.map +1 -0
- package/dist/node/types/DatalakeConfig.d.ts +48 -0
- package/dist/node/types/DatalakeConfig.d.ts.map +1 -0
- package/dist/node/types/DatalakeDescriptor.d.ts +38 -0
- package/dist/node/types/DatalakeDescriptor.d.ts.map +1 -0
- package/dist/node/types/Payload.d.ts +75 -0
- package/dist/node/types/Payload.d.ts.map +1 -0
- package/dist/node/types/Principal.d.ts +17 -0
- package/dist/node/types/Principal.d.ts.map +1 -0
- package/dist/node/types/Region.d.ts +8 -0
- package/dist/node/types/Region.d.ts.map +1 -0
- package/dist/node/types/Scope.d.ts +17 -0
- package/dist/node/types/Scope.d.ts.map +1 -0
- package/dist/node/types/Status.d.ts +7 -0
- package/dist/node/types/Status.d.ts.map +1 -0
- package/dist/node/types/Tier.d.ts +8 -0
- package/dist/node/types/Tier.d.ts.map +1 -0
- package/dist/node/types/Token.d.ts +18 -0
- package/dist/node/types/Token.d.ts.map +1 -0
- package/package.json +66 -0
package/README.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# `@ariestools/aries-datalake-core`
|
|
2
|
+
|
|
3
|
+
Shared Aries datalake wire contracts, path builders, payload types, scope constants, and Node token codecs.
|
|
4
|
+
|
|
5
|
+
## Entry points
|
|
6
|
+
|
|
7
|
+
- `@ariestools/aries-datalake-core` is the Node entry point. It includes the browser-safe contracts plus HS256 challenge, session, and datalake token signing and verification.
|
|
8
|
+
- `@ariestools/aries-datalake-core/browser` is the browser entry point. It contains wire types, route builders, error types, and the canonical control/data audience and scope constants. It does not import Node cryptography, filesystem APIs, environment variables, or credential storage.
|
|
9
|
+
|
|
10
|
+
Use the `/browser` entry point in browser applications. JWT verification belongs on the Aries control and data planes; importing the wire contracts does not make browser code an authorization boundary.
|
|
11
|
+
|
|
12
|
+
Browser wallet JWTs are short-lived, audience-bound bearer credentials. The server additionally enforces the exact HTTP Origin, signed origin, canonical scope vocabulary, signer identity, and current datalake ACL. A signed statement does not by itself establish truth, consent, privacy, or permanence.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standard error body returned by the control plane for any non-2xx response.
|
|
3
|
+
* The `code` is a stable machine-readable identifier; `message` is the
|
|
4
|
+
* human-readable description.
|
|
5
|
+
*/
|
|
6
|
+
export interface ApiErrorBody {
|
|
7
|
+
code: ApiErrorCode;
|
|
8
|
+
message: string;
|
|
9
|
+
/** Optional request-correlation id for server logs. */
|
|
10
|
+
requestId?: string;
|
|
11
|
+
}
|
|
12
|
+
export type ApiErrorCode = 'bad_request' | 'unauthorized' | 'forbidden' | 'not_found' | 'conflict' | 'unprocessable' | 'rate_limited' | 'internal';
|
|
13
|
+
export declare const API_ERROR_STATUS: Record<ApiErrorCode, number>;
|
|
14
|
+
/**
|
|
15
|
+
* Thrown by `RestDatalakeClient` when the server returns a non-2xx response.
|
|
16
|
+
* Carries the structured error body so callers can branch on `.code`.
|
|
17
|
+
*/
|
|
18
|
+
export declare class DatalakeApiError extends Error {
|
|
19
|
+
readonly code: ApiErrorCode;
|
|
20
|
+
readonly requestId?: string;
|
|
21
|
+
readonly status: number;
|
|
22
|
+
constructor(status: number, body: ApiErrorBody);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/api/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,YAAY,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,MAAM,YAAY,GAClB,aAAa,GACb,cAAc,GACd,WAAW,GACX,WAAW,GACX,UAAU,GACV,eAAe,GACf,cAAc,GACd,UAAU,CAAA;AAEhB,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CASzD,CAAA;AAED;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;gBAEX,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY;CAO/C"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response body for `GET /v1/health`. Used by the CLI to validate that a
|
|
3
|
+
* configured base URL is reachable and speaks our protocol before issuing
|
|
4
|
+
* real requests.
|
|
5
|
+
*/
|
|
6
|
+
export interface HealthResponse {
|
|
7
|
+
status: 'ok';
|
|
8
|
+
/** Server wall-clock time at the moment of response (ISO-8601). */
|
|
9
|
+
time: string;
|
|
10
|
+
version: string;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/api/health.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,IAAI,CAAA;IACZ,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical path builders for the datalake control-plane HTTP API.
|
|
3
|
+
* Both the REST client and the control-plane service import from here so
|
|
4
|
+
* the wire contract has a single source of truth.
|
|
5
|
+
*/
|
|
6
|
+
export declare const DATALAKE_API_VERSION = "v1";
|
|
7
|
+
export declare function datalakeCollectionPath(): string;
|
|
8
|
+
export declare function datalakeResourcePath(idOrName: string): string;
|
|
9
|
+
export declare function datalakeGrantsPath(idOrName: string): string;
|
|
10
|
+
export declare function datalakeGrantPath(idOrName: string, principal: string): string;
|
|
11
|
+
export declare function datalakeTokensPath(idOrName: string): string;
|
|
12
|
+
export declare function datalakeHealthPath(): string;
|
|
13
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/api/paths.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,oBAAoB,OAAO,CAAA;AAExC,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data-plane path builders. The data plane is addressed by datalake id
|
|
3
|
+
* (globally unique), not by name (which is scoped to owner). Route names
|
|
4
|
+
* mirror the XYO archivist REST middleware (`/insert`, `/get/:hash`, `/next`)
|
|
5
|
+
* so a generic archivist client can talk to a datalake-plane after picking
|
|
6
|
+
* the per-datalake prefix.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Header that conveys how many payloads in the insert request were skipped
|
|
10
|
+
* because their hash already existed in the datalake.
|
|
11
|
+
*/
|
|
12
|
+
export declare const DATALAKE_HEADER_DUPLICATES = "x-datalake-duplicates";
|
|
13
|
+
/**
|
|
14
|
+
* Header that conveys the comma-separated list of archivist-computed
|
|
15
|
+
* `_hash` values rejected by the datalake's schema policy.
|
|
16
|
+
*/
|
|
17
|
+
export declare const DATALAKE_HEADER_REJECTED = "x-datalake-rejected";
|
|
18
|
+
/**
|
|
19
|
+
* Header that conveys the cursor (`_sequence`) of the last payload in a
|
|
20
|
+
* `next` response page, when more pages may exist.
|
|
21
|
+
*/
|
|
22
|
+
export declare const DATALAKE_HEADER_NEXT_CURSOR = "x-datalake-next-cursor";
|
|
23
|
+
export declare function datalakePlaneResourcePath(id: string): string;
|
|
24
|
+
export declare function datalakePlaneInsertPath(id: string): string;
|
|
25
|
+
export declare function datalakePlaneGetPath(id: string, hash: string): string;
|
|
26
|
+
export declare function datalakePlaneGetManyPath(id: string): string;
|
|
27
|
+
export declare function datalakePlaneNextPath(id: string): string;
|
|
28
|
+
export declare function datalakePlaneDeletePath(id: string, hash: string): string;
|
|
29
|
+
export declare function datalakePlaneClearPath(id: string): string;
|
|
30
|
+
export declare function datalakePlaneUsagePath(id: string): string;
|
|
31
|
+
//# sourceMappingURL=planePaths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planePaths.d.ts","sourceRoot":"","sources":["../../../src/api/planePaths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;GAGG;AACH,eAAO,MAAM,0BAA0B,0BAA0B,CAAA;AAEjE;;;GAGG;AACH,eAAO,MAAM,wBAAwB,wBAAwB,CAAA;AAE7D;;;GAGG;AACH,eAAO,MAAM,2BAA2B,2BAA2B,CAAA;AAEnE,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEzD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DatalakeConfig } from '../types/DatalakeConfig.ts';
|
|
2
|
+
import type { DatalakePrincipal, DatalakeRole } from '../types/Principal.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Request payloads for the control-plane HTTP API. Exchanged as JSON bodies.
|
|
5
|
+
*/
|
|
6
|
+
export interface CreateDatalakeBody {
|
|
7
|
+
config: DatalakeConfig;
|
|
8
|
+
name: string;
|
|
9
|
+
}
|
|
10
|
+
export interface GrantBody {
|
|
11
|
+
principal: DatalakePrincipal;
|
|
12
|
+
role: DatalakeRole;
|
|
13
|
+
}
|
|
14
|
+
export interface MintTokenBody {
|
|
15
|
+
role: DatalakeRole;
|
|
16
|
+
ttlSeconds?: number;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=requests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requests.d.ts","sourceRoot":"","sources":["../../../src/api/requests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAE5E;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,cAAc,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,iBAAiB,CAAA;IAC5B,IAAI,EAAE,YAAY,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type { ApiErrorBody, ApiErrorCode } from './api/errors.ts';
|
|
2
|
+
export { API_ERROR_STATUS, DatalakeApiError } from './api/errors.ts';
|
|
3
|
+
export type { HealthResponse } from './api/health.ts';
|
|
4
|
+
export { DATALAKE_API_VERSION, datalakeCollectionPath, datalakeGrantPath, datalakeGrantsPath, datalakeHealthPath, datalakeResourcePath, datalakeTokensPath, } from './api/paths.ts';
|
|
5
|
+
export { DATALAKE_HEADER_DUPLICATES, DATALAKE_HEADER_NEXT_CURSOR, DATALAKE_HEADER_REJECTED, datalakePlaneClearPath, datalakePlaneDeletePath, datalakePlaneGetManyPath, datalakePlaneGetPath, datalakePlaneInsertPath, datalakePlaneNextPath, datalakePlaneResourcePath, datalakePlaneUsagePath, } from './api/planePaths.ts';
|
|
6
|
+
export type { CreateDatalakeBody, GrantBody, MintTokenBody, } from './api/requests.ts';
|
|
7
|
+
export type { AclEntry } from './types/AclEntry.ts';
|
|
8
|
+
export type { DatalakeInsertSummary, InsertPayloadsBody, InsertPayloadsResponse, InsertPayloadsResult, JsonObject, JsonPrimitive, JsonValue, NextPayloadsOptions, NextPayloadsResponse, NextPayloadsResult, Payload, StorageMeta, StoredPayload, WithStorageMeta, } from './types/BrowserPayload.ts';
|
|
9
|
+
export type { DatalakeConfig, RateLimitOverrides } from './types/DatalakeConfig.ts';
|
|
10
|
+
export type { DatalakeDescriptor, DatalakeUsage } from './types/DatalakeDescriptor.ts';
|
|
11
|
+
export type { DatalakePrincipal, DatalakeRole } from './types/Principal.ts';
|
|
12
|
+
export { isPublicPrincipal, PUBLIC_PRINCIPAL } from './types/Principal.ts';
|
|
13
|
+
export type { DatalakeRegion } from './types/Region.ts';
|
|
14
|
+
export { DATALAKE_REGIONS, DEFAULT_REGION } from './types/Region.ts';
|
|
15
|
+
export type { DatalakeControlOperation, DatalakeDataOperation, DatalakeOperation, } from './types/Scope.ts';
|
|
16
|
+
export { DATALAKE_CONTROL_AUDIENCE, DATALAKE_CONTROL_OPERATIONS, DATALAKE_CONTROL_SCOPE, DATALAKE_DATA_OPERATIONS, DATALAKE_DATA_SCOPE, DATALAKE_WALLET_JWT_SCHEMA, isDatalakeControlOperation, isDatalakeDataOperation, } from './types/Scope.ts';
|
|
17
|
+
export type { DatalakeStatus } from './types/Status.ts';
|
|
18
|
+
export type { DatalakeTier } from './types/Tier.ts';
|
|
19
|
+
export { DATALAKE_TIERS } from './types/Tier.ts';
|
|
20
|
+
export type { DatalakeToken } from './types/Token.ts';
|
|
21
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACjE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACpE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EACV,kBAAkB,EAAE,SAAS,EAAE,aAAa,GAC7C,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACnD,YAAY,EACV,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,UAAU,EACV,aAAa,EACb,SAAS,EACT,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,OAAO,EACP,WAAW,EACX,aAAa,EACb,eAAe,GAChB,MAAM,2BAA2B,CAAA;AAClC,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACnF,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AACtF,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAC3E,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAC1E,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACpE,YAAY,EACV,wBAAwB,EAAE,qBAAqB,EAAE,iBAAiB,GACnE,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,EACnB,0BAA0B,EAC1B,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,kBAAkB,CAAA;AACzB,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// src/api/errors.ts
|
|
2
|
+
var API_ERROR_STATUS = {
|
|
3
|
+
bad_request: 400,
|
|
4
|
+
unauthorized: 401,
|
|
5
|
+
forbidden: 403,
|
|
6
|
+
not_found: 404,
|
|
7
|
+
conflict: 409,
|
|
8
|
+
unprocessable: 422,
|
|
9
|
+
rate_limited: 429,
|
|
10
|
+
internal: 500
|
|
11
|
+
};
|
|
12
|
+
var DatalakeApiError = class extends Error {
|
|
13
|
+
code;
|
|
14
|
+
requestId;
|
|
15
|
+
status;
|
|
16
|
+
constructor(status, body) {
|
|
17
|
+
super(body.message);
|
|
18
|
+
this.name = "DatalakeApiError";
|
|
19
|
+
this.code = body.code;
|
|
20
|
+
this.status = status;
|
|
21
|
+
this.requestId = body.requestId;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// src/api/paths.ts
|
|
26
|
+
var DATALAKE_API_VERSION = "v1";
|
|
27
|
+
function datalakeCollectionPath() {
|
|
28
|
+
return `/${DATALAKE_API_VERSION}/datalakes`;
|
|
29
|
+
}
|
|
30
|
+
function datalakeResourcePath(idOrName) {
|
|
31
|
+
return `${datalakeCollectionPath()}/${encodeURIComponent(idOrName)}`;
|
|
32
|
+
}
|
|
33
|
+
function datalakeGrantsPath(idOrName) {
|
|
34
|
+
return `${datalakeResourcePath(idOrName)}/grants`;
|
|
35
|
+
}
|
|
36
|
+
function datalakeGrantPath(idOrName, principal) {
|
|
37
|
+
return `${datalakeGrantsPath(idOrName)}/${encodeURIComponent(principal)}`;
|
|
38
|
+
}
|
|
39
|
+
function datalakeTokensPath(idOrName) {
|
|
40
|
+
return `${datalakeResourcePath(idOrName)}/tokens`;
|
|
41
|
+
}
|
|
42
|
+
function datalakeHealthPath() {
|
|
43
|
+
return `/${DATALAKE_API_VERSION}/health`;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// src/api/planePaths.ts
|
|
47
|
+
var DATALAKE_HEADER_DUPLICATES = "x-datalake-duplicates";
|
|
48
|
+
var DATALAKE_HEADER_REJECTED = "x-datalake-rejected";
|
|
49
|
+
var DATALAKE_HEADER_NEXT_CURSOR = "x-datalake-next-cursor";
|
|
50
|
+
function datalakePlaneResourcePath(id) {
|
|
51
|
+
return `/${DATALAKE_API_VERSION}/datalakes/${encodeURIComponent(id)}`;
|
|
52
|
+
}
|
|
53
|
+
function datalakePlaneInsertPath(id) {
|
|
54
|
+
return `${datalakePlaneResourcePath(id)}/insert`;
|
|
55
|
+
}
|
|
56
|
+
function datalakePlaneGetPath(id, hash) {
|
|
57
|
+
return `${datalakePlaneResourcePath(id)}/get/${encodeURIComponent(hash)}`;
|
|
58
|
+
}
|
|
59
|
+
function datalakePlaneGetManyPath(id) {
|
|
60
|
+
return `${datalakePlaneResourcePath(id)}/get`;
|
|
61
|
+
}
|
|
62
|
+
function datalakePlaneNextPath(id) {
|
|
63
|
+
return `${datalakePlaneResourcePath(id)}/next`;
|
|
64
|
+
}
|
|
65
|
+
function datalakePlaneDeletePath(id, hash) {
|
|
66
|
+
return `${datalakePlaneResourcePath(id)}/delete/${encodeURIComponent(hash)}`;
|
|
67
|
+
}
|
|
68
|
+
function datalakePlaneClearPath(id) {
|
|
69
|
+
return `${datalakePlaneResourcePath(id)}/clear`;
|
|
70
|
+
}
|
|
71
|
+
function datalakePlaneUsagePath(id) {
|
|
72
|
+
return `${datalakePlaneResourcePath(id)}/usage`;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// src/types/Principal.ts
|
|
76
|
+
var PUBLIC_PRINCIPAL = "public";
|
|
77
|
+
function isPublicPrincipal(principal) {
|
|
78
|
+
return principal === PUBLIC_PRINCIPAL;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// src/types/Region.ts
|
|
82
|
+
var DATALAKE_REGIONS = ["us-west-2", "us-east-1", "eu-west-1"];
|
|
83
|
+
var DEFAULT_REGION = "us-west-2";
|
|
84
|
+
|
|
85
|
+
// src/types/Scope.ts
|
|
86
|
+
var DATALAKE_CONTROL_AUDIENCE = "aries-datalake-control";
|
|
87
|
+
var DATALAKE_WALLET_JWT_SCHEMA = "network.xyo.auth.signin";
|
|
88
|
+
var DATALAKE_CONTROL_OPERATIONS = [
|
|
89
|
+
"datalake:create",
|
|
90
|
+
"datalake:describe",
|
|
91
|
+
"datalake:list"
|
|
92
|
+
];
|
|
93
|
+
var DATALAKE_DATA_OPERATIONS = [
|
|
94
|
+
"payload:append",
|
|
95
|
+
"payload:read",
|
|
96
|
+
"usage:read"
|
|
97
|
+
];
|
|
98
|
+
var DATALAKE_CONTROL_SCOPE = DATALAKE_CONTROL_OPERATIONS.join(" ");
|
|
99
|
+
var DATALAKE_DATA_SCOPE = DATALAKE_DATA_OPERATIONS.join(" ");
|
|
100
|
+
function isDatalakeControlOperation(value) {
|
|
101
|
+
return DATALAKE_CONTROL_OPERATIONS.includes(value);
|
|
102
|
+
}
|
|
103
|
+
function isDatalakeDataOperation(value) {
|
|
104
|
+
return DATALAKE_DATA_OPERATIONS.includes(value);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// src/types/Tier.ts
|
|
108
|
+
var DATALAKE_TIERS = ["small", "medium", "large", "archive"];
|
|
109
|
+
export {
|
|
110
|
+
API_ERROR_STATUS,
|
|
111
|
+
DATALAKE_API_VERSION,
|
|
112
|
+
DATALAKE_CONTROL_AUDIENCE,
|
|
113
|
+
DATALAKE_CONTROL_OPERATIONS,
|
|
114
|
+
DATALAKE_CONTROL_SCOPE,
|
|
115
|
+
DATALAKE_DATA_OPERATIONS,
|
|
116
|
+
DATALAKE_DATA_SCOPE,
|
|
117
|
+
DATALAKE_HEADER_DUPLICATES,
|
|
118
|
+
DATALAKE_HEADER_NEXT_CURSOR,
|
|
119
|
+
DATALAKE_HEADER_REJECTED,
|
|
120
|
+
DATALAKE_REGIONS,
|
|
121
|
+
DATALAKE_TIERS,
|
|
122
|
+
DATALAKE_WALLET_JWT_SCHEMA,
|
|
123
|
+
DEFAULT_REGION,
|
|
124
|
+
DatalakeApiError,
|
|
125
|
+
PUBLIC_PRINCIPAL,
|
|
126
|
+
datalakeCollectionPath,
|
|
127
|
+
datalakeGrantPath,
|
|
128
|
+
datalakeGrantsPath,
|
|
129
|
+
datalakeHealthPath,
|
|
130
|
+
datalakePlaneClearPath,
|
|
131
|
+
datalakePlaneDeletePath,
|
|
132
|
+
datalakePlaneGetManyPath,
|
|
133
|
+
datalakePlaneGetPath,
|
|
134
|
+
datalakePlaneInsertPath,
|
|
135
|
+
datalakePlaneNextPath,
|
|
136
|
+
datalakePlaneResourcePath,
|
|
137
|
+
datalakePlaneUsagePath,
|
|
138
|
+
datalakeResourcePath,
|
|
139
|
+
datalakeTokensPath,
|
|
140
|
+
isDatalakeControlOperation,
|
|
141
|
+
isDatalakeDataOperation,
|
|
142
|
+
isPublicPrincipal
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=browser.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/api/errors.ts", "../../src/api/paths.ts", "../../src/api/planePaths.ts", "../../src/types/Principal.ts", "../../src/types/Region.ts", "../../src/types/Scope.ts", "../../src/types/Tier.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Standard error body returned by the control plane for any non-2xx response.\n * The `code` is a stable machine-readable identifier; `message` is the\n * human-readable description.\n */\nexport interface ApiErrorBody {\n code: ApiErrorCode\n message: string\n /** Optional request-correlation id for server logs. */\n requestId?: string\n}\n\nexport type ApiErrorCode\n = | 'bad_request'\n | 'unauthorized'\n | 'forbidden'\n | 'not_found'\n | 'conflict'\n | 'unprocessable'\n | 'rate_limited'\n | 'internal'\n\nexport const API_ERROR_STATUS: Record<ApiErrorCode, number> = {\n bad_request: 400,\n unauthorized: 401,\n forbidden: 403,\n not_found: 404,\n conflict: 409,\n unprocessable: 422,\n rate_limited: 429,\n internal: 500,\n}\n\n/**\n * Thrown by `RestDatalakeClient` when the server returns a non-2xx response.\n * Carries the structured error body so callers can branch on `.code`.\n */\nexport class DatalakeApiError extends Error {\n readonly code: ApiErrorCode\n readonly requestId?: string\n readonly status: number\n\n constructor(status: number, body: ApiErrorBody) {\n super(body.message)\n this.name = 'DatalakeApiError'\n this.code = body.code\n this.status = status\n this.requestId = body.requestId\n }\n}\n", "/**\n * Canonical path builders for the datalake control-plane HTTP API.\n * Both the REST client and the control-plane service import from here so\n * the wire contract has a single source of truth.\n */\n\nexport const DATALAKE_API_VERSION = 'v1'\n\nexport function datalakeCollectionPath(): string {\n return `/${DATALAKE_API_VERSION}/datalakes`\n}\n\nexport function datalakeResourcePath(idOrName: string): string {\n return `${datalakeCollectionPath()}/${encodeURIComponent(idOrName)}`\n}\n\nexport function datalakeGrantsPath(idOrName: string): string {\n return `${datalakeResourcePath(idOrName)}/grants`\n}\n\nexport function datalakeGrantPath(idOrName: string, principal: string): string {\n return `${datalakeGrantsPath(idOrName)}/${encodeURIComponent(principal)}`\n}\n\nexport function datalakeTokensPath(idOrName: string): string {\n return `${datalakeResourcePath(idOrName)}/tokens`\n}\n\nexport function datalakeHealthPath(): string {\n return `/${DATALAKE_API_VERSION}/health`\n}\n", "/**\n * Data-plane path builders. The data plane is addressed by datalake id\n * (globally unique), not by name (which is scoped to owner). Route names\n * mirror the XYO archivist REST middleware (`/insert`, `/get/:hash`, `/next`)\n * so a generic archivist client can talk to a datalake-plane after picking\n * the per-datalake prefix.\n */\n\nimport { DATALAKE_API_VERSION } from './paths.ts'\n\n/**\n * Header that conveys how many payloads in the insert request were skipped\n * because their hash already existed in the datalake.\n */\nexport const DATALAKE_HEADER_DUPLICATES = 'x-datalake-duplicates'\n\n/**\n * Header that conveys the comma-separated list of archivist-computed\n * `_hash` values rejected by the datalake's schema policy.\n */\nexport const DATALAKE_HEADER_REJECTED = 'x-datalake-rejected'\n\n/**\n * Header that conveys the cursor (`_sequence`) of the last payload in a\n * `next` response page, when more pages may exist.\n */\nexport const DATALAKE_HEADER_NEXT_CURSOR = 'x-datalake-next-cursor'\n\nexport function datalakePlaneResourcePath(id: string): string {\n return `/${DATALAKE_API_VERSION}/datalakes/${encodeURIComponent(id)}`\n}\n\nexport function datalakePlaneInsertPath(id: string): string {\n return `${datalakePlaneResourcePath(id)}/insert`\n}\n\nexport function datalakePlaneGetPath(id: string, hash: string): string {\n return `${datalakePlaneResourcePath(id)}/get/${encodeURIComponent(hash)}`\n}\n\nexport function datalakePlaneGetManyPath(id: string): string {\n return `${datalakePlaneResourcePath(id)}/get`\n}\n\nexport function datalakePlaneNextPath(id: string): string {\n return `${datalakePlaneResourcePath(id)}/next`\n}\n\nexport function datalakePlaneDeletePath(id: string, hash: string): string {\n return `${datalakePlaneResourcePath(id)}/delete/${encodeURIComponent(hash)}`\n}\n\nexport function datalakePlaneClearPath(id: string): string {\n return `${datalakePlaneResourcePath(id)}/clear`\n}\n\nexport function datalakePlaneUsagePath(id: string): string {\n return `${datalakePlaneResourcePath(id)}/usage`\n}\n", "/**\n * Access-control role granted to a principal on a datalake.\n * Maps 1:1 to XL1's DataLakeViewer (read) and DataLakeRunner (read/write) monikers.\n */\nexport type DatalakeRole = 'viewer' | 'runner'\n\n/**\n * A principal identifier. Either a control-plane user id, or the reserved\n * value `PUBLIC_PRINCIPAL` (`'public'`) which opens access to unauthenticated\n * callers at the granted role.\n */\nexport type DatalakePrincipal = string\n\nexport const PUBLIC_PRINCIPAL = 'public'\n\n/**\n * Type guard for the reserved `public` principal.\n */\nexport function isPublicPrincipal(principal: DatalakePrincipal): boolean {\n return principal === PUBLIC_PRINCIPAL\n}\n", "/**\n * Cloud regions where datalakes can be provisioned. Starts with AWS us-west-2;\n * additional regions are added as the control plane expands.\n */\nexport type DatalakeRegion = 'us-west-2' | 'us-east-1' | 'eu-west-1'\n\nexport const DATALAKE_REGIONS: readonly DatalakeRegion[] = ['us-west-2', 'us-east-1', 'eu-west-1'] as const\n\nexport const DEFAULT_REGION: DatalakeRegion = 'us-west-2'\n", "/** Audience used by browser wallet JWTs for control-plane operations. */\nexport const DATALAKE_CONTROL_AUDIENCE = 'aries-datalake-control'\n\n/** Schema required on every wallet sign-in JWT accepted by Aries. */\nexport const DATALAKE_WALLET_JWT_SCHEMA = 'network.xyo.auth.signin'\n\n/** Browser operations intentionally exposed by the datalake control plane. */\nexport const DATALAKE_CONTROL_OPERATIONS = [\n 'datalake:create',\n 'datalake:describe',\n 'datalake:list',\n] as const\n\n/** Browser operations intentionally exposed by the datalake data plane. */\nexport const DATALAKE_DATA_OPERATIONS = [\n 'payload:append',\n 'payload:read',\n 'usage:read',\n] as const\n\nexport type DatalakeControlOperation = typeof DATALAKE_CONTROL_OPERATIONS[number]\nexport type DatalakeDataOperation = typeof DATALAKE_DATA_OPERATIONS[number]\nexport type DatalakeOperation = DatalakeControlOperation | DatalakeDataOperation\n\n/** Canonical complete scope strings used when requesting browser wallet approval. */\nexport const DATALAKE_CONTROL_SCOPE = DATALAKE_CONTROL_OPERATIONS.join(' ')\nexport const DATALAKE_DATA_SCOPE = DATALAKE_DATA_OPERATIONS.join(' ')\n\nexport function isDatalakeControlOperation(value: string): value is DatalakeControlOperation {\n return (DATALAKE_CONTROL_OPERATIONS as readonly string[]).includes(value)\n}\n\nexport function isDatalakeDataOperation(value: string): value is DatalakeDataOperation {\n return (DATALAKE_DATA_OPERATIONS as readonly string[]).includes(value)\n}\n", "/**\n * Datalake service tiers. Each tier maps to a storage driver + resource profile\n * on the control plane: small/medium use the shared hot pool, large gets a\n * dedicated RestDataLake pod, archive uses the S3 + DynamoDB cold driver.\n */\nexport type DatalakeTier = 'small' | 'medium' | 'large' | 'archive'\n\nexport const DATALAKE_TIERS: readonly DatalakeTier[] = ['small', 'medium', 'large', 'archive'] as const\n"],
|
|
5
|
+
"mappings": ";AAsBO,IAAM,mBAAiD;AAAA,EAC5D,aAAa;AAAA,EACb,cAAc;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,eAAe;AAAA,EACf,cAAc;AAAA,EACd,UAAU;AACZ;AAMO,IAAM,mBAAN,cAA+B,MAAM;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAgB,MAAoB;AAC9C,UAAM,KAAK,OAAO;AAClB,SAAK,OAAO;AACZ,SAAK,OAAO,KAAK;AACjB,SAAK,SAAS;AACd,SAAK,YAAY,KAAK;AAAA,EACxB;AACF;;;AC3CO,IAAM,uBAAuB;AAE7B,SAAS,yBAAiC;AAC/C,SAAO,IAAI,oBAAoB;AACjC;AAEO,SAAS,qBAAqB,UAA0B;AAC7D,SAAO,GAAG,uBAAuB,CAAC,IAAI,mBAAmB,QAAQ,CAAC;AACpE;AAEO,SAAS,mBAAmB,UAA0B;AAC3D,SAAO,GAAG,qBAAqB,QAAQ,CAAC;AAC1C;AAEO,SAAS,kBAAkB,UAAkB,WAA2B;AAC7E,SAAO,GAAG,mBAAmB,QAAQ,CAAC,IAAI,mBAAmB,SAAS,CAAC;AACzE;AAEO,SAAS,mBAAmB,UAA0B;AAC3D,SAAO,GAAG,qBAAqB,QAAQ,CAAC;AAC1C;AAEO,SAAS,qBAA6B;AAC3C,SAAO,IAAI,oBAAoB;AACjC;;;AChBO,IAAM,6BAA6B;AAMnC,IAAM,2BAA2B;AAMjC,IAAM,8BAA8B;AAEpC,SAAS,0BAA0B,IAAoB;AAC5D,SAAO,IAAI,oBAAoB,cAAc,mBAAmB,EAAE,CAAC;AACrE;AAEO,SAAS,wBAAwB,IAAoB;AAC1D,SAAO,GAAG,0BAA0B,EAAE,CAAC;AACzC;AAEO,SAAS,qBAAqB,IAAY,MAAsB;AACrE,SAAO,GAAG,0BAA0B,EAAE,CAAC,QAAQ,mBAAmB,IAAI,CAAC;AACzE;AAEO,SAAS,yBAAyB,IAAoB;AAC3D,SAAO,GAAG,0BAA0B,EAAE,CAAC;AACzC;AAEO,SAAS,sBAAsB,IAAoB;AACxD,SAAO,GAAG,0BAA0B,EAAE,CAAC;AACzC;AAEO,SAAS,wBAAwB,IAAY,MAAsB;AACxE,SAAO,GAAG,0BAA0B,EAAE,CAAC,WAAW,mBAAmB,IAAI,CAAC;AAC5E;AAEO,SAAS,uBAAuB,IAAoB;AACzD,SAAO,GAAG,0BAA0B,EAAE,CAAC;AACzC;AAEO,SAAS,uBAAuB,IAAoB;AACzD,SAAO,GAAG,0BAA0B,EAAE,CAAC;AACzC;;;AC7CO,IAAM,mBAAmB;AAKzB,SAAS,kBAAkB,WAAuC;AACvE,SAAO,cAAc;AACvB;;;ACdO,IAAM,mBAA8C,CAAC,aAAa,aAAa,WAAW;AAE1F,IAAM,iBAAiC;;;ACPvC,IAAM,4BAA4B;AAGlC,IAAM,6BAA6B;AAGnC,IAAM,8BAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,2BAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF;AAOO,IAAM,yBAAyB,4BAA4B,KAAK,GAAG;AACnE,IAAM,sBAAsB,yBAAyB,KAAK,GAAG;AAE7D,SAAS,2BAA2B,OAAkD;AAC3F,SAAQ,4BAAkD,SAAS,KAAK;AAC1E;AAEO,SAAS,wBAAwB,OAA+C;AACrF,SAAQ,yBAA+C,SAAS,KAAK;AACvE;;;AC3BO,IAAM,iBAA0C,CAAC,SAAS,UAAU,SAAS,SAAS;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DatalakePrincipal, DatalakeRole } from './Principal.ts';
|
|
2
|
+
/**
|
|
3
|
+
* A single grant on a datalake. The control plane stores one row per
|
|
4
|
+
* (datalakeId, principal) pair; `role` is the highest privilege granted.
|
|
5
|
+
*/
|
|
6
|
+
export interface AclEntry {
|
|
7
|
+
/** ISO-8601 timestamp of when the grant was created. */
|
|
8
|
+
grantedAt: string;
|
|
9
|
+
/** Optional user id of the grantor. */
|
|
10
|
+
grantedBy?: string;
|
|
11
|
+
principal: DatalakePrincipal;
|
|
12
|
+
role: DatalakeRole;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=AclEntry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AclEntry.d.ts","sourceRoot":"","sources":["../../../src/types/AclEntry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAErE;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAA;IACjB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,iBAAiB,CAAA;IAC5B,IAAI,EAAE,YAAY,CAAA;CACnB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** JSON values accepted and returned by the browser datalake wire API. */
|
|
2
|
+
export type JsonPrimitive = boolean | null | number | string;
|
|
3
|
+
export type JsonValue = JsonPrimitive | JsonObject | JsonValue[];
|
|
4
|
+
export interface JsonObject {
|
|
5
|
+
[key: string]: JsonValue;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Browser wire representation of an XYO payload. Canonical protocol
|
|
9
|
+
* validation and storage remain responsibilities of the Node data plane.
|
|
10
|
+
*/
|
|
11
|
+
export interface Payload {
|
|
12
|
+
[key: string]: JsonValue | undefined;
|
|
13
|
+
/** Optional client-side lineage metadata. */
|
|
14
|
+
$sources?: string[];
|
|
15
|
+
/** XYO payload schema identifier. */
|
|
16
|
+
schema: string;
|
|
17
|
+
}
|
|
18
|
+
/** Storage metadata serialized by the datalake data plane. */
|
|
19
|
+
export interface StorageMeta {
|
|
20
|
+
_dataHash: string;
|
|
21
|
+
_hash: string;
|
|
22
|
+
_sequence: string;
|
|
23
|
+
}
|
|
24
|
+
export type WithStorageMeta<T extends Payload = Payload> = T & StorageMeta;
|
|
25
|
+
/** A payload as it leaves the data plane after archivist processing. */
|
|
26
|
+
export type StoredPayload = WithStorageMeta<Payload>;
|
|
27
|
+
export interface NextPayloadsOptions {
|
|
28
|
+
cursor?: string;
|
|
29
|
+
limit?: number;
|
|
30
|
+
order?: 'asc' | 'desc';
|
|
31
|
+
schemas?: string[];
|
|
32
|
+
}
|
|
33
|
+
export type NextPayloadsResponse = StoredPayload[];
|
|
34
|
+
export type InsertPayloadsBody = Payload | Payload[];
|
|
35
|
+
export type InsertPayloadsResponse = StoredPayload[];
|
|
36
|
+
export interface DatalakeInsertSummary {
|
|
37
|
+
duplicates: number;
|
|
38
|
+
rejected: string[];
|
|
39
|
+
}
|
|
40
|
+
export interface InsertPayloadsResult {
|
|
41
|
+
inserted: StoredPayload[];
|
|
42
|
+
summary: DatalakeInsertSummary;
|
|
43
|
+
}
|
|
44
|
+
export interface NextPayloadsResult {
|
|
45
|
+
nextCursor?: string;
|
|
46
|
+
payloads: StoredPayload[];
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=BrowserPayload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BrowserPayload.d.ts","sourceRoot":"","sources":["../../../src/types/BrowserPayload.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;AAC5D,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,SAAS,EAAE,CAAA;AAEhE,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;IACpC,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAA;CACf;AAED,8DAA8D;AAC9D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI,CAAC,GAAG,WAAW,CAAA;AAE1E,wEAAwE;AACxE,MAAM,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;AAEpD,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,MAAM,oBAAoB,GAAG,aAAa,EAAE,CAAA;AAClD,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,OAAO,EAAE,CAAA;AACpD,MAAM,MAAM,sBAAsB,GAAG,aAAa,EAAE,CAAA;AAEpD,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,OAAO,EAAE,qBAAqB,CAAA;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,aAAa,EAAE,CAAA;CAC1B"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { DatalakeRegion } from './Region.ts';
|
|
2
|
+
import type { DatalakeTier } from './Tier.ts';
|
|
3
|
+
/**
|
|
4
|
+
* User-supplied configuration for provisioning a new datalake. All fields are
|
|
5
|
+
* optional except tier; the control plane applies defaults for the rest.
|
|
6
|
+
*/
|
|
7
|
+
export interface DatalakeConfig {
|
|
8
|
+
/** Payload schemas allowed for insert; empty array means all allowed. */
|
|
9
|
+
allowedSchemas?: string[];
|
|
10
|
+
/** Payload schemas disallowed for insert. */
|
|
11
|
+
disallowedSchemas?: string[];
|
|
12
|
+
/** Provisioned IOPS target. Ignored for the archive tier. */
|
|
13
|
+
iops?: number;
|
|
14
|
+
/**
|
|
15
|
+
* Per-datalake rate-limit overrides. When omitted, the data plane's
|
|
16
|
+
* default limits apply. Use this to tighten compliance-sensitive
|
|
17
|
+
* datalakes or relax a limit for a trusted internal tenant.
|
|
18
|
+
*/
|
|
19
|
+
rateLimits?: RateLimitOverrides;
|
|
20
|
+
/** Deployment region. */
|
|
21
|
+
region?: DatalakeRegion;
|
|
22
|
+
/** Retention policy in days. `null` means keep forever. */
|
|
23
|
+
retentionDays?: number | null;
|
|
24
|
+
/** Provisioned capacity in bytes. Ignored for the archive tier. */
|
|
25
|
+
sizeBytes?: number;
|
|
26
|
+
/** Service tier (controls storage driver, IOPS ceiling, compute shape). */
|
|
27
|
+
tier: DatalakeTier;
|
|
28
|
+
/**
|
|
29
|
+
* Reserved. The archivist always recomputes `_hash` and `_dataHash` from
|
|
30
|
+
* payload bytes trustlessly, so this flag is a no-op. Kept on the type so
|
|
31
|
+
* older configs still parse; will be removed in a future major.
|
|
32
|
+
*
|
|
33
|
+
* @deprecated archivist is the trustless authority — no client-supplied
|
|
34
|
+
* hash is honored.
|
|
35
|
+
*/
|
|
36
|
+
verifyHashes?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface RateLimitOverrides {
|
|
39
|
+
/** Max anonymous requests per minute. */
|
|
40
|
+
anonymousPerMinute?: number;
|
|
41
|
+
/** Max authenticated requests per minute. */
|
|
42
|
+
authenticatedPerMinute?: number;
|
|
43
|
+
/**
|
|
44
|
+
* Burst multiplier (1 = no burst). Bucket capacity = perMinute * burstFactor.
|
|
45
|
+
*/
|
|
46
|
+
burstFactor?: number;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=DatalakeConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatalakeConfig.d.ts","sourceRoot":"","sources":["../../../src/types/DatalakeConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAE7C;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,UAAU,CAAC,EAAE,kBAAkB,CAAA;IAC/B,yBAAyB;IACzB,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2EAA2E;IAC3E,IAAI,EAAE,YAAY,CAAA;IAClB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,yCAAyC;IACzC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,6CAA6C;IAC7C,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AclEntry } from './AclEntry.ts';
|
|
2
|
+
import type { DatalakeConfig } from './DatalakeConfig.ts';
|
|
3
|
+
import type { DatalakeStatus } from './Status.ts';
|
|
4
|
+
/**
|
|
5
|
+
* Full server-side view of a provisioned datalake. Returned by
|
|
6
|
+
* `DatalakeClient.describe`, `DatalakeClient.list`, and `DatalakeClient.create`.
|
|
7
|
+
*/
|
|
8
|
+
export interface DatalakeDescriptor {
|
|
9
|
+
/** Access grants. Owner is implicit and not listed here. */
|
|
10
|
+
acl: AclEntry[];
|
|
11
|
+
/** Requested configuration. */
|
|
12
|
+
config: DatalakeConfig;
|
|
13
|
+
/** ISO-8601 timestamps. */
|
|
14
|
+
createdAt: string;
|
|
15
|
+
/** Human-readable message when status === 'error'. */
|
|
16
|
+
errorMessage?: string;
|
|
17
|
+
/** Opaque server-assigned id. */
|
|
18
|
+
id: string;
|
|
19
|
+
/** Human-friendly name scoped to the owner. */
|
|
20
|
+
name: string;
|
|
21
|
+
/** User id of the owner. */
|
|
22
|
+
ownerId: string;
|
|
23
|
+
/** Current lifecycle state. */
|
|
24
|
+
status: DatalakeStatus;
|
|
25
|
+
updatedAt: string;
|
|
26
|
+
/** Public HTTPS URL of the RestDataLake endpoint (set once status === 'ready'). */
|
|
27
|
+
url?: string;
|
|
28
|
+
/** Current usage, refreshed periodically by the control plane. */
|
|
29
|
+
usage?: DatalakeUsage;
|
|
30
|
+
}
|
|
31
|
+
export interface DatalakeUsage {
|
|
32
|
+
bytesStored: number;
|
|
33
|
+
bytesStoredLimit: number;
|
|
34
|
+
payloadCount: number;
|
|
35
|
+
readsLast24h: number;
|
|
36
|
+
writesLast24h: number;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=DatalakeDescriptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatalakeDescriptor.d.ts","sourceRoot":"","sources":["../../../src/types/DatalakeDescriptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,GAAG,EAAE,QAAQ,EAAE,CAAA;IACf,+BAA+B;IAC/B,MAAM,EAAE,cAAc,CAAA;IACtB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAA;IACZ,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,+BAA+B;IAC/B,MAAM,EAAE,cAAc,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,mFAAmF;IACnF,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,kEAAkE;IAClE,KAAK,CAAC,EAAE,aAAa,CAAA;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;CACtB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Access-control role granted to a principal on a datalake.
|
|
3
|
+
* Maps 1:1 to XL1's DataLakeViewer (read) and DataLakeRunner (read/write) monikers.
|
|
4
|
+
*/
|
|
5
|
+
export type DatalakeRole = 'viewer' | 'runner';
|
|
6
|
+
/**
|
|
7
|
+
* A principal identifier. Either a control-plane user id, or the reserved
|
|
8
|
+
* value `PUBLIC_PRINCIPAL` (`'public'`) which opens access to unauthenticated
|
|
9
|
+
* callers at the granted role.
|
|
10
|
+
*/
|
|
11
|
+
export type DatalakePrincipal = string;
|
|
12
|
+
export declare const PUBLIC_PRINCIPAL = "public";
|
|
13
|
+
/**
|
|
14
|
+
* Type guard for the reserved `public` principal.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isPublicPrincipal(principal: DatalakePrincipal): boolean;
|
|
17
|
+
//# sourceMappingURL=Principal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Principal.d.ts","sourceRoot":"","sources":["../../../src/types/Principal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE9C;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAA;AAEtC,eAAO,MAAM,gBAAgB,WAAW,CAAA;AAExC;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAEvE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud regions where datalakes can be provisioned. Starts with AWS us-west-2;
|
|
3
|
+
* additional regions are added as the control plane expands.
|
|
4
|
+
*/
|
|
5
|
+
export type DatalakeRegion = 'us-west-2' | 'us-east-1' | 'eu-west-1';
|
|
6
|
+
export declare const DATALAKE_REGIONS: readonly DatalakeRegion[];
|
|
7
|
+
export declare const DEFAULT_REGION: DatalakeRegion;
|
|
8
|
+
//# sourceMappingURL=Region.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Region.d.ts","sourceRoot":"","sources":["../../../src/types/Region.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAA;AAEpE,eAAO,MAAM,gBAAgB,EAAE,SAAS,cAAc,EAAqD,CAAA;AAE3G,eAAO,MAAM,cAAc,EAAE,cAA4B,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Audience used by browser wallet JWTs for control-plane operations. */
|
|
2
|
+
export declare const DATALAKE_CONTROL_AUDIENCE = "aries-datalake-control";
|
|
3
|
+
/** Schema required on every wallet sign-in JWT accepted by Aries. */
|
|
4
|
+
export declare const DATALAKE_WALLET_JWT_SCHEMA = "network.xyo.auth.signin";
|
|
5
|
+
/** Browser operations intentionally exposed by the datalake control plane. */
|
|
6
|
+
export declare const DATALAKE_CONTROL_OPERATIONS: readonly ["datalake:create", "datalake:describe", "datalake:list"];
|
|
7
|
+
/** Browser operations intentionally exposed by the datalake data plane. */
|
|
8
|
+
export declare const DATALAKE_DATA_OPERATIONS: readonly ["payload:append", "payload:read", "usage:read"];
|
|
9
|
+
export type DatalakeControlOperation = typeof DATALAKE_CONTROL_OPERATIONS[number];
|
|
10
|
+
export type DatalakeDataOperation = typeof DATALAKE_DATA_OPERATIONS[number];
|
|
11
|
+
export type DatalakeOperation = DatalakeControlOperation | DatalakeDataOperation;
|
|
12
|
+
/** Canonical complete scope strings used when requesting browser wallet approval. */
|
|
13
|
+
export declare const DATALAKE_CONTROL_SCOPE: string;
|
|
14
|
+
export declare const DATALAKE_DATA_SCOPE: string;
|
|
15
|
+
export declare function isDatalakeControlOperation(value: string): value is DatalakeControlOperation;
|
|
16
|
+
export declare function isDatalakeDataOperation(value: string): value is DatalakeDataOperation;
|
|
17
|
+
//# sourceMappingURL=Scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Scope.d.ts","sourceRoot":"","sources":["../../../src/types/Scope.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,eAAO,MAAM,yBAAyB,2BAA2B,CAAA;AAEjE,qEAAqE;AACrE,eAAO,MAAM,0BAA0B,4BAA4B,CAAA;AAEnE,8EAA8E;AAC9E,eAAO,MAAM,2BAA2B,oEAI9B,CAAA;AAEV,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB,2DAI3B,CAAA;AAEV,MAAM,MAAM,wBAAwB,GAAG,OAAO,2BAA2B,CAAC,MAAM,CAAC,CAAA;AACjF,MAAM,MAAM,qBAAqB,GAAG,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAA;AAC3E,MAAM,MAAM,iBAAiB,GAAG,wBAAwB,GAAG,qBAAqB,CAAA;AAEhF,qFAAqF;AACrF,eAAO,MAAM,sBAAsB,QAAwC,CAAA;AAC3E,eAAO,MAAM,mBAAmB,QAAqC,CAAA;AAErE,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,wBAAwB,CAE3F;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,qBAAqB,CAErF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lifecycle state of a datalake on the control plane. The Provisioner worker
|
|
3
|
+
* transitions a datalake through these states; the CLI surfaces them via
|
|
4
|
+
* `aries datalake describe`.
|
|
5
|
+
*/
|
|
6
|
+
export type DatalakeStatus = 'pending' | 'provisioning' | 'ready' | 'resizing' | 'deprovisioning' | 'deleted' | 'error';
|
|
7
|
+
//# sourceMappingURL=Status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Status.d.ts","sourceRoot":"","sources":["../../../src/types/Status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,cAAc,GACpB,SAAS,GACT,cAAc,GACd,OAAO,GACP,UAAU,GACV,gBAAgB,GAChB,SAAS,GACT,OAAO,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Datalake service tiers. Each tier maps to a storage driver + resource profile
|
|
3
|
+
* on the control plane: small/medium use the shared hot pool, large gets a
|
|
4
|
+
* dedicated RestDataLake pod, archive uses the S3 + DynamoDB cold driver.
|
|
5
|
+
*/
|
|
6
|
+
export type DatalakeTier = 'small' | 'medium' | 'large' | 'archive';
|
|
7
|
+
export declare const DATALAKE_TIERS: readonly DatalakeTier[];
|
|
8
|
+
//# sourceMappingURL=Tier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tier.d.ts","sourceRoot":"","sources":["../../../src/types/Tier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAA;AAEnE,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAAqD,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DatalakeRole } from './Principal.ts';
|
|
2
|
+
/**
|
|
3
|
+
* A scoped token minted for a single datalake + role. Safe to embed in SDKs
|
|
4
|
+
* or CI. Expires; refresh via the control plane.
|
|
5
|
+
*/
|
|
6
|
+
export interface DatalakeToken {
|
|
7
|
+
/** Datalake id the token is scoped to. */
|
|
8
|
+
datalakeId: string;
|
|
9
|
+
/** ISO-8601 expiration. */
|
|
10
|
+
expiresAt: string;
|
|
11
|
+
/** Granted role. */
|
|
12
|
+
role: DatalakeRole;
|
|
13
|
+
/** The raw JWT string. */
|
|
14
|
+
token: string;
|
|
15
|
+
/** The URL the token should be used against. */
|
|
16
|
+
url: string;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=Token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Token.d.ts","sourceRoot":"","sources":["../../../src/types/Token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,oBAAoB;IACpB,IAAI,EAAE,YAAY,CAAA;IAClB,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAA;CACZ"}
|