@enbox/api 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +235 -35
- package/dist/browser.mjs +13 -13
- package/dist/browser.mjs.map +4 -4
- package/dist/esm/dwn-api.js +24 -10
- package/dist/esm/dwn-api.js.map +1 -1
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/live-query.js +34 -5
- package/dist/esm/live-query.js.map +1 -1
- package/dist/esm/permission-grant.js +3 -6
- package/dist/esm/permission-grant.js.map +1 -1
- package/dist/esm/permission-request.js +4 -7
- package/dist/esm/permission-request.js.map +1 -1
- package/dist/esm/record-data.js +131 -0
- package/dist/esm/record-data.js.map +1 -0
- package/dist/esm/record-types.js +9 -0
- package/dist/esm/record-types.js.map +1 -0
- package/dist/esm/record.js +58 -184
- package/dist/esm/record.js.map +1 -1
- package/dist/esm/repository-types.js +13 -0
- package/dist/esm/repository-types.js.map +1 -0
- package/dist/esm/repository.js +347 -0
- package/dist/esm/repository.js.map +1 -0
- package/dist/esm/typed-live-query.js +101 -0
- package/dist/esm/typed-live-query.js.map +1 -0
- package/dist/esm/typed-record.js +227 -0
- package/dist/esm/typed-record.js.map +1 -0
- package/dist/esm/typed-web5.js +134 -23
- package/dist/esm/typed-web5.js.map +1 -1
- package/dist/esm/web5.js +78 -20
- package/dist/esm/web5.js.map +1 -1
- package/dist/types/dwn-api.d.ts.map +1 -1
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/live-query.d.ts +43 -4
- package/dist/types/live-query.d.ts.map +1 -1
- package/dist/types/permission-grant.d.ts +1 -1
- package/dist/types/permission-grant.d.ts.map +1 -1
- package/dist/types/permission-request.d.ts +1 -1
- package/dist/types/permission-request.d.ts.map +1 -1
- package/dist/types/record-data.d.ts +49 -0
- package/dist/types/record-data.d.ts.map +1 -0
- package/dist/types/record-types.d.ts +145 -0
- package/dist/types/record-types.d.ts.map +1 -0
- package/dist/types/record.d.ts +13 -144
- package/dist/types/record.d.ts.map +1 -1
- package/dist/types/repository-types.d.ts +137 -0
- package/dist/types/repository-types.d.ts.map +1 -0
- package/dist/types/repository.d.ts +59 -0
- package/dist/types/repository.d.ts.map +1 -0
- package/dist/types/typed-live-query.d.ts +86 -0
- package/dist/types/typed-live-query.d.ts.map +1 -0
- package/dist/types/typed-record.d.ts +179 -0
- package/dist/types/typed-record.d.ts.map +1 -0
- package/dist/types/typed-web5.d.ts +55 -24
- package/dist/types/typed-web5.d.ts.map +1 -1
- package/dist/types/web5.d.ts +47 -2
- package/dist/types/web5.d.ts.map +1 -1
- package/package.json +8 -7
- package/src/dwn-api.ts +30 -13
- package/src/index.ts +6 -0
- package/src/live-query.ts +71 -7
- package/src/permission-grant.ts +2 -3
- package/src/permission-request.ts +3 -4
- package/src/record-data.ts +155 -0
- package/src/record-types.ts +188 -0
- package/src/record.ts +86 -389
- package/src/repository-types.ts +249 -0
- package/src/repository.ts +391 -0
- package/src/typed-live-query.ts +156 -0
- package/src/typed-record.ts +309 -0
- package/src/typed-web5.ts +202 -49
- package/src/web5.ts +150 -23
package/dist/types/record.d.ts
CHANGED
|
@@ -3,142 +3,11 @@
|
|
|
3
3
|
* https://github.com/enboxorg/enbox/pull/507
|
|
4
4
|
*/
|
|
5
5
|
import type { DwnDateSort, DwnMessage, DwnMessageDescriptor, DwnPaginationCursor, DwnResponseStatus, PermissionsApi, Web5Agent } from '@enbox/agent';
|
|
6
|
+
import type { RecordDeleteParams, RecordModel, RecordOptions, RecordUpdateParams } from './record-types.js';
|
|
6
7
|
import { DwnInterface } from '@enbox/agent';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
* @beta
|
|
11
|
-
* */
|
|
12
|
-
export type ImmutableRecordProperties = Pick<DwnMessageDescriptor[DwnInterface.RecordsWrite], 'dateCreated' | 'parentId' | 'protocol' | 'protocolPath' | 'recipient' | 'schema'>;
|
|
13
|
-
/**
|
|
14
|
-
* Represents Optional Record properties that depend on the Record's current state.
|
|
15
|
-
*
|
|
16
|
-
* @beta
|
|
17
|
-
*/
|
|
18
|
-
export type OptionalRecordProperties = Pick<DwnMessage[DwnInterface.RecordsWrite], 'authorization' | 'attestation' | 'encryption' | 'contextId'> & Pick<DwnMessageDescriptor[DwnInterface.RecordsWrite], 'dataFormat' | 'dataCid' | 'dataSize' | 'datePublished' | 'published' | 'tags'>;
|
|
19
|
-
/**
|
|
20
|
-
* Represents the structured data model of a record, encapsulating the essential fields that define
|
|
21
|
-
* the record's metadata and payload within a Decentralized Web Node (DWN).
|
|
22
|
-
*
|
|
23
|
-
* @beta
|
|
24
|
-
*/
|
|
25
|
-
export type RecordModel = ImmutableRecordProperties & OptionalRecordProperties & {
|
|
26
|
-
/** The logical author of the record. */
|
|
27
|
-
author: string;
|
|
28
|
-
/** The unique identifier of the record. */
|
|
29
|
-
recordId?: string;
|
|
30
|
-
/** The message timestamp (time of creation, most recent update, or deletion). */
|
|
31
|
-
timestamp?: string;
|
|
32
|
-
/** The protocol role under which this record is written. */
|
|
33
|
-
protocolRole?: RecordOptions['protocolRole'];
|
|
34
|
-
};
|
|
35
|
-
/**
|
|
36
|
-
* Options for configuring a {@link Record} instance, extending the base `RecordsWriteMessage` with
|
|
37
|
-
* additional properties.
|
|
38
|
-
*
|
|
39
|
-
* This type combines the standard fields required for writing DWN records with additional metadata
|
|
40
|
-
* and configuration options used specifically in the {@link Record} class.
|
|
41
|
-
*
|
|
42
|
-
* @beta
|
|
43
|
-
*/
|
|
44
|
-
export type RecordOptions = DwnMessage[DwnInterface.RecordsWrite | DwnInterface.RecordsDelete] & {
|
|
45
|
-
/** The DID that signed the record. */
|
|
46
|
-
author: string;
|
|
47
|
-
/** The attestation signature(s) for the record. */
|
|
48
|
-
attestation?: DwnMessage[DwnInterface.RecordsWrite]['attestation'];
|
|
49
|
-
/** The encryption information for the record. */
|
|
50
|
-
encryption?: DwnMessage[DwnInterface.RecordsWrite]['encryption'];
|
|
51
|
-
/** The contextId associated with the record. */
|
|
52
|
-
contextId?: string;
|
|
53
|
-
/** The unique identifier of the record */
|
|
54
|
-
recordId?: string;
|
|
55
|
-
/** The DID of the DWN tenant under which record operations are being performed. */
|
|
56
|
-
connectedDid: string;
|
|
57
|
-
/** The optional DID that will sign the records on behalf of the connectedDid */
|
|
58
|
-
delegateDid?: string;
|
|
59
|
-
/** The data of the record, either as a Base64 URL encoded string or a Blob. */
|
|
60
|
-
encodedData?: string | Blob;
|
|
61
|
-
/**
|
|
62
|
-
* A stream of data, conforming to the Web `ReadableStream` interface, providing a mechanism
|
|
63
|
-
* to read the record's data sequentially. This is particularly useful for handling large
|
|
64
|
-
* datasets that should not be loaded entirely in memory, allowing for efficient, chunked
|
|
65
|
-
* processing of the record's data.
|
|
66
|
-
*
|
|
67
|
-
* The DWN SDK now returns Web `ReadableStream` natively, so no conversion is needed.
|
|
68
|
-
*/
|
|
69
|
-
data?: ReadableStream;
|
|
70
|
-
/** The initial `RecordsWriteMessage` that represents the initial state/version of the record. */
|
|
71
|
-
initialWrite?: DwnMessage[DwnInterface.RecordsWrite];
|
|
72
|
-
/** The protocol role under which this record is written. */
|
|
73
|
-
protocolRole?: string;
|
|
74
|
-
/** The remote tenant DID if the record was queried or read from a remote DWN. */
|
|
75
|
-
remoteOrigin?: string;
|
|
76
|
-
};
|
|
77
|
-
/**
|
|
78
|
-
* Parameters for updating a DWN record.
|
|
79
|
-
*
|
|
80
|
-
* This type specifies the set of properties that can be updated on an existing record. It is used
|
|
81
|
-
* to convey the new state or changes to be applied to the record.
|
|
82
|
-
*
|
|
83
|
-
* @beta
|
|
84
|
-
*/
|
|
85
|
-
export type RecordUpdateParams = {
|
|
86
|
-
/**
|
|
87
|
-
* The new data for the record, which can be of any type. This data will replace the existing
|
|
88
|
-
* data of the record. It's essential to ensure that this data is compatible with the record's
|
|
89
|
-
* schema or data format expectations.
|
|
90
|
-
*/
|
|
91
|
-
data?: unknown;
|
|
92
|
-
/**
|
|
93
|
-
* The Content Identifier (CID) of the data. Updating this value changes the reference to the data
|
|
94
|
-
* associated with the record.
|
|
95
|
-
*/
|
|
96
|
-
dataCid?: DwnMessageDescriptor[DwnInterface.RecordsWrite]['dataCid'];
|
|
97
|
-
/** Whether or not to store the updated message. */
|
|
98
|
-
store?: boolean;
|
|
99
|
-
/** The data format/MIME type of the supplied data */
|
|
100
|
-
dataFormat?: string;
|
|
101
|
-
/** The size of the data in bytes. */
|
|
102
|
-
dataSize?: DwnMessageDescriptor[DwnInterface.RecordsWrite]['dataSize'];
|
|
103
|
-
/** The timestamp of the update message. */
|
|
104
|
-
timestamp?: DwnMessageDescriptor[DwnInterface.RecordsWrite]['messageTimestamp'];
|
|
105
|
-
/** The timestamp indicating when the record was published. */
|
|
106
|
-
datePublished?: DwnMessageDescriptor[DwnInterface.RecordsWrite]['datePublished'];
|
|
107
|
-
/** The protocol role under which this record is written. */
|
|
108
|
-
protocolRole?: RecordOptions['protocolRole'];
|
|
109
|
-
/** The published status of the record. */
|
|
110
|
-
published?: DwnMessageDescriptor[DwnInterface.RecordsWrite]['published'];
|
|
111
|
-
/** The tags associated with the updated record */
|
|
112
|
-
tags?: DwnMessageDescriptor[DwnInterface.RecordsWrite]['tags'];
|
|
113
|
-
/**
|
|
114
|
-
* Controls whether the updated record should be auto-encrypted.
|
|
115
|
-
*
|
|
116
|
-
* If omitted, auto-detected from the original record: if the record was
|
|
117
|
-
* originally encrypted, the update is automatically re-encrypted with a
|
|
118
|
-
* fresh DEK. Set to `false` explicitly to skip encryption on the update.
|
|
119
|
-
*/
|
|
120
|
-
encryption?: boolean;
|
|
121
|
-
};
|
|
122
|
-
/**
|
|
123
|
-
* Parameters for deleting a DWN record.
|
|
124
|
-
*
|
|
125
|
-
* This type specifies the set of properties that are used when deleting an existing record. It is used
|
|
126
|
-
* to convey the new state or changes to be applied to the record.
|
|
127
|
-
*
|
|
128
|
-
* @beta
|
|
129
|
-
*/
|
|
130
|
-
export type RecordDeleteParams = {
|
|
131
|
-
/** Whether or not to store the message. */
|
|
132
|
-
store?: boolean;
|
|
133
|
-
/** Whether or not to sign the delete as an owner in order to import it. */
|
|
134
|
-
signAsOwner?: boolean;
|
|
135
|
-
/** Whether or not to prune any children this record may have. */
|
|
136
|
-
prune?: DwnMessageDescriptor[DwnInterface.RecordsDelete]['prune'];
|
|
137
|
-
/** The timestamp of the delete message. */
|
|
138
|
-
timestamp?: DwnMessageDescriptor[DwnInterface.RecordsDelete]['messageTimestamp'];
|
|
139
|
-
/** The protocol role under which this record will be deleted. */
|
|
140
|
-
protocolRole?: string;
|
|
141
|
-
};
|
|
8
|
+
import type { RecordData } from './record-data.js';
|
|
9
|
+
export type { ImmutableRecordProperties, OptionalRecordProperties, RecordDeleteParams, RecordModel, RecordOptions, RecordUpdateParams, } from './record-types.js';
|
|
10
|
+
export type { RecordData } from './record-data.js';
|
|
142
11
|
/**
|
|
143
12
|
* The result of a {@link Record.update} operation.
|
|
144
13
|
*
|
|
@@ -282,15 +151,7 @@ export declare class Record implements RecordModel {
|
|
|
282
151
|
*
|
|
283
152
|
* @beta
|
|
284
153
|
*/
|
|
285
|
-
get data():
|
|
286
|
-
blob: () => Promise<Blob>;
|
|
287
|
-
bytes: () => Promise<Uint8Array>;
|
|
288
|
-
json: <T = unknown>() => Promise<T>;
|
|
289
|
-
text: () => Promise<string>;
|
|
290
|
-
stream: () => Promise<ReadableStream>;
|
|
291
|
-
then: (onFulfilled?: (value: ReadableStream) => ReadableStream | PromiseLike<ReadableStream>, onRejected?: (reason: any) => PromiseLike<never>) => Promise<ReadableStream>;
|
|
292
|
-
catch: (onRejected?: (reason: any) => PromiseLike<never>) => Promise<ReadableStream>;
|
|
293
|
-
};
|
|
154
|
+
get data(): RecordData;
|
|
294
155
|
/**
|
|
295
156
|
* Stores the current record state as well as any initial write to the owner's DWN.
|
|
296
157
|
*
|
|
@@ -382,6 +243,14 @@ export declare class Record implements RecordModel {
|
|
|
382
243
|
* @beta
|
|
383
244
|
*/
|
|
384
245
|
private readRecordData;
|
|
246
|
+
/**
|
|
247
|
+
* If the record is operating as a delegate, fetches the appropriate permission grant
|
|
248
|
+
* and applies it to the given DWN request options. This centralises the repeated
|
|
249
|
+
* pattern of looking up a delegated grant and attaching it to a request.
|
|
250
|
+
*
|
|
251
|
+
* @param requestOptions - The DWN request options to augment with the delegate grant.
|
|
252
|
+
*/
|
|
253
|
+
private applyDelegateGrant;
|
|
385
254
|
/**
|
|
386
255
|
* Verifies if the properties to be mutated are mutable.
|
|
387
256
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/record.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,oBAAoB,EAEpB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EAGd,SAAS,EACV,MAAM,cAAc,CAAC;AAEtB,OAAO,
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/record.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-level machinery for the protocol repository pattern.
|
|
3
|
+
*
|
|
4
|
+
* These types produce a statically-typed CRUD API shape from a
|
|
5
|
+
* `ProtocolDefinition` + `SchemaMap`, with singleton detection
|
|
6
|
+
* (via `$recordLimit: { max: 1 }`) and nested-path awareness.
|
|
7
|
+
*
|
|
8
|
+
* All types are purely compile-time — they produce no runtime code.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import type { SchemaMap } from './protocol-types.js';
|
|
13
|
+
import type { TypedLiveQuery } from './typed-live-query.js';
|
|
14
|
+
import type { TypedRecord } from './typed-record.js';
|
|
15
|
+
import type { DataForPath, TypedCreateRequest, TypedQueryRequest, TypedSubscribeRequest } from './typed-web5.js';
|
|
16
|
+
import type { DwnPaginationCursor, DwnResponseStatus } from '@enbox/agent';
|
|
17
|
+
import type { ProtocolDefinition, ProtocolRuleSet } from '@enbox/dwn-sdk-js';
|
|
18
|
+
/**
|
|
19
|
+
* Navigates a `ProtocolRuleSet` tree to the node at a slash-delimited path.
|
|
20
|
+
*/
|
|
21
|
+
type RuleSetAtPath<R, Path extends string> = Path extends `${infer Head}/${infer Tail}` ? Head extends keyof R ? R[Head] extends ProtocolRuleSet ? RuleSetAtPath<R[Head], Tail> : never : never : Path extends keyof R ? R[Path] extends ProtocolRuleSet ? R[Path] : never : never;
|
|
22
|
+
/**
|
|
23
|
+
* Extracts the `$recordLimit` from a rule set node, if present.
|
|
24
|
+
*/
|
|
25
|
+
type RecordLimitAtRuleSet<RS> = RS extends {
|
|
26
|
+
$recordLimit: infer L;
|
|
27
|
+
} ? L : never;
|
|
28
|
+
/**
|
|
29
|
+
* `true` when the rule set at `Path` has `$recordLimit: { max: 1 }`.
|
|
30
|
+
*/
|
|
31
|
+
export type IsSingleton<D extends ProtocolDefinition, Path extends string> = RecordLimitAtRuleSet<RuleSetAtPath<D['structure'], Path>> extends {
|
|
32
|
+
max: 1;
|
|
33
|
+
} ? true : false;
|
|
34
|
+
/** Resolves the TypeScript data type for a given path. */
|
|
35
|
+
type DataAt<D extends ProtocolDefinition, M extends SchemaMap, Path extends string> = DataForPath<D, M, Path>;
|
|
36
|
+
/**
|
|
37
|
+
* Write options for a collection `create()` call.
|
|
38
|
+
* Omits `data` (passed separately) and protocol-injected fields.
|
|
39
|
+
*/
|
|
40
|
+
export type CollectionCreateOptions<D extends ProtocolDefinition, M extends SchemaMap, Path extends string> = Omit<TypedCreateRequest<D, M, Path>, 'data' | 'parentContextId'> & {
|
|
41
|
+
data: DataAt<D, M, Path>;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Write options for a singleton `set()` call.
|
|
45
|
+
*/
|
|
46
|
+
export type SingletonSetOptions<D extends ProtocolDefinition, M extends SchemaMap, Path extends string> = Omit<TypedCreateRequest<D, M, Path>, 'data' | 'parentContextId'> & {
|
|
47
|
+
data: DataAt<D, M, Path>;
|
|
48
|
+
};
|
|
49
|
+
/** CRUD API for a root-level collection (unbounded or max > 1). */
|
|
50
|
+
export type CollectionCRUD<D extends ProtocolDefinition, M extends SchemaMap, Path extends string> = {
|
|
51
|
+
create(options: CollectionCreateOptions<D, M, Path>): Promise<DwnResponseStatus & {
|
|
52
|
+
record: TypedRecord<DataAt<D, M, Path>>;
|
|
53
|
+
}>;
|
|
54
|
+
query(options?: TypedQueryRequest): Promise<DwnResponseStatus & {
|
|
55
|
+
records: TypedRecord<DataAt<D, M, Path>>[];
|
|
56
|
+
cursor?: DwnPaginationCursor;
|
|
57
|
+
}>;
|
|
58
|
+
get(recordId: string): Promise<TypedRecord<DataAt<D, M, Path>>>;
|
|
59
|
+
delete(recordId: string): Promise<DwnResponseStatus>;
|
|
60
|
+
subscribe(options?: TypedSubscribeRequest): Promise<TypedLiveQuery<DataAt<D, M, Path>> | undefined>;
|
|
61
|
+
};
|
|
62
|
+
/** CRUD API for a root-level singleton ($recordLimit max: 1). */
|
|
63
|
+
export type SingletonCRUD<D extends ProtocolDefinition, M extends SchemaMap, Path extends string> = {
|
|
64
|
+
set(options: SingletonSetOptions<D, M, Path>): Promise<DwnResponseStatus & {
|
|
65
|
+
record: TypedRecord<DataAt<D, M, Path>>;
|
|
66
|
+
}>;
|
|
67
|
+
get(): Promise<TypedRecord<DataAt<D, M, Path>> | undefined>;
|
|
68
|
+
delete(recordId: string): Promise<DwnResponseStatus>;
|
|
69
|
+
};
|
|
70
|
+
/** CRUD API for a nested collection (parent context required). */
|
|
71
|
+
export type NestedCollectionCRUD<D extends ProtocolDefinition, M extends SchemaMap, Path extends string> = {
|
|
72
|
+
create(parentContextId: string, options: CollectionCreateOptions<D, M, Path>): Promise<DwnResponseStatus & {
|
|
73
|
+
record: TypedRecord<DataAt<D, M, Path>>;
|
|
74
|
+
}>;
|
|
75
|
+
query(parentContextId: string, options?: TypedQueryRequest): Promise<DwnResponseStatus & {
|
|
76
|
+
records: TypedRecord<DataAt<D, M, Path>>[];
|
|
77
|
+
cursor?: DwnPaginationCursor;
|
|
78
|
+
}>;
|
|
79
|
+
get(recordId: string): Promise<TypedRecord<DataAt<D, M, Path>>>;
|
|
80
|
+
delete(recordId: string): Promise<DwnResponseStatus>;
|
|
81
|
+
subscribe(parentContextId: string, options?: TypedSubscribeRequest): Promise<TypedLiveQuery<DataAt<D, M, Path>> | undefined>;
|
|
82
|
+
};
|
|
83
|
+
/** CRUD API for a nested singleton ($recordLimit max: 1). */
|
|
84
|
+
export type NestedSingletonCRUD<D extends ProtocolDefinition, M extends SchemaMap, Path extends string> = {
|
|
85
|
+
set(parentContextId: string, options: SingletonSetOptions<D, M, Path>): Promise<DwnResponseStatus & {
|
|
86
|
+
record: TypedRecord<DataAt<D, M, Path>>;
|
|
87
|
+
}>;
|
|
88
|
+
get(parentContextId: string): Promise<TypedRecord<DataAt<D, M, Path>> | undefined>;
|
|
89
|
+
delete(recordId: string): Promise<DwnResponseStatus>;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Extracts the child type names (non-`$`-prefixed keys that extend ProtocolRuleSet)
|
|
93
|
+
* from a rule set node.
|
|
94
|
+
*/
|
|
95
|
+
type ChildKeys<RS> = {
|
|
96
|
+
[K in Extract<keyof RS, string>]: K extends `$${string}` ? never : RS[K] extends ProtocolRuleSet ? K : never;
|
|
97
|
+
}[Extract<keyof RS, string>];
|
|
98
|
+
/**
|
|
99
|
+
* Builds nested repository nodes for all children of a given rule set.
|
|
100
|
+
*/
|
|
101
|
+
type ChildNodes<D extends ProtocolDefinition, M extends SchemaMap, RS, ParentPath extends string> = {
|
|
102
|
+
[K in ChildKeys<RS>]: RepositoryNode<D, M, RS[K], `${ParentPath}/${K}`, true>;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* A single node in the repository tree. Provides CRUD methods appropriate
|
|
106
|
+
* to whether the path is root/nested and singleton/collection, plus child
|
|
107
|
+
* nodes for further nesting.
|
|
108
|
+
*/
|
|
109
|
+
export type RepositoryNode<D extends ProtocolDefinition, M extends SchemaMap, RS, Path extends string, IsNested extends boolean = false> = (IsNested extends true ? (IsSingleton<D, Path> extends true ? NestedSingletonCRUD<D, M, Path> : NestedCollectionCRUD<D, M, Path>) : (IsSingleton<D, Path> extends true ? SingletonCRUD<D, M, Path> : CollectionCRUD<D, M, Path>)) & ChildNodes<D, M, RS, Path>;
|
|
110
|
+
/**
|
|
111
|
+
* The top-level repository type for a protocol definition.
|
|
112
|
+
*
|
|
113
|
+
* Maps each root-level type name in the protocol's `structure` to a
|
|
114
|
+
* `RepositoryNode` with the appropriate CRUD methods and nested children.
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```ts
|
|
118
|
+
* const social: Repository<typeof SocialGraphDef, SocialGraphSchemaMap>;
|
|
119
|
+
*
|
|
120
|
+
* // Root collection
|
|
121
|
+
* await social.friend.create({ data: { did: '...' } });
|
|
122
|
+
* await social.friend.query();
|
|
123
|
+
*
|
|
124
|
+
* // Nested under group
|
|
125
|
+
* await social.group.member.create(groupCtxId, { data: { did: '...' } });
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
export type Repository<D extends ProtocolDefinition, M extends SchemaMap> = {
|
|
129
|
+
[K in Extract<keyof D['structure'], string> as K extends `$${string}` ? never : K]: D['structure'][K] extends ProtocolRuleSet ? RepositoryNode<D, M, D['structure'][K], K> : never;
|
|
130
|
+
} & {
|
|
131
|
+
/** Install (configure) the protocol. Idempotent — no-op if already installed. */
|
|
132
|
+
configure(options?: {
|
|
133
|
+
encryption?: boolean;
|
|
134
|
+
}): Promise<DwnResponseStatus>;
|
|
135
|
+
};
|
|
136
|
+
export {};
|
|
137
|
+
//# sourceMappingURL=repository-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository-types.d.ts","sourceRoot":"","sources":["../../src/repository-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol-aware repository factory.
|
|
3
|
+
*
|
|
4
|
+
* `repository()` takes a `TypedWeb5` instance and returns a Proxy-backed
|
|
5
|
+
* object whose shape mirrors the protocol's `structure` tree with
|
|
6
|
+
* ergonomic CRUD methods on each node.
|
|
7
|
+
*
|
|
8
|
+
* - **Collections** (default): `create`, `query`, `get`, `delete`, `subscribe`
|
|
9
|
+
* - **Singletons** (`$recordLimit: { max: 1 }`): `set`, `get`, `delete`
|
|
10
|
+
* - **Nested types**: first argument is `parentContextId`
|
|
11
|
+
* - **`configure()`**: idempotent protocol installation
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const social = repository(web5.using(SocialGraphProtocol));
|
|
16
|
+
* await social.configure();
|
|
17
|
+
*
|
|
18
|
+
* // Root collection
|
|
19
|
+
* const { record } = await social.friend.create({
|
|
20
|
+
* data: { did: 'did:example:alice' },
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* // Nested under group
|
|
24
|
+
* const members = await social.group.member.query(groupContextId);
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @module
|
|
28
|
+
*/
|
|
29
|
+
import type { Repository } from './repository-types.js';
|
|
30
|
+
import type { SchemaMap } from './protocol-types.js';
|
|
31
|
+
import type { TypedWeb5 } from './typed-web5.js';
|
|
32
|
+
import type { ProtocolDefinition } from '@enbox/dwn-sdk-js';
|
|
33
|
+
/**
|
|
34
|
+
* Creates a protocol-aware repository from a `TypedWeb5` instance.
|
|
35
|
+
*
|
|
36
|
+
* The returned object provides domain-specific CRUD methods that mirror
|
|
37
|
+
* the protocol's structure tree:
|
|
38
|
+
*
|
|
39
|
+
* - Root types: `repo.friend.create()`, `repo.friend.query()`
|
|
40
|
+
* - Nested types: `repo.group.member.create(groupCtxId, { data })`
|
|
41
|
+
* - Singletons: `repo.profile.set()`, `repo.profile.get()`
|
|
42
|
+
* - Protocol install: `repo.configure()`
|
|
43
|
+
*
|
|
44
|
+
* @param typed - A `TypedWeb5` instance from `web5.using(protocol)`.
|
|
45
|
+
* @returns A typed repository object.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* const social = repository(web5.using(SocialGraphProtocol));
|
|
50
|
+
* await social.configure();
|
|
51
|
+
*
|
|
52
|
+
* const rec = await social.friend.create({
|
|
53
|
+
* data: { did: 'did:example:alice' },
|
|
54
|
+
* });
|
|
55
|
+
* const friends = await social.friend.query();
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function repository<D extends ProtocolDefinition, M extends SchemaMap>(typed: TypedWeb5<D, M>): Repository<D, M>;
|
|
59
|
+
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAmB,MAAM,mBAAmB,CAAC;AAoS7E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,UAAU,CACxB,CAAC,SAAS,kBAAkB,EAC5B,CAAC,SAAS,SAAS,EACnB,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAqC1C"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A type-safe wrapper around {@link LiveQuery} that carries the data type `T`
|
|
3
|
+
* through initial snapshot records and real-time change events.
|
|
4
|
+
*
|
|
5
|
+
* `TypedLiveQuery<T>` wraps a `LiveQuery` so that:
|
|
6
|
+
* - `.records` returns `TypedRecord<T>[]` instead of `Record[]`.
|
|
7
|
+
* - `.on('create', handler)` provides `TypedRecord<T>` in the callback.
|
|
8
|
+
* - `.on('change', handler)` provides `TypedRecordChange<T>` in the callback.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const { liveQuery } = await typed.records.subscribe('friend');
|
|
13
|
+
* // liveQuery is TypedLiveQuery<FriendData>
|
|
14
|
+
*
|
|
15
|
+
* for (const record of liveQuery.records) {
|
|
16
|
+
* const data = await record.data.json(); // FriendData
|
|
17
|
+
* }
|
|
18
|
+
*
|
|
19
|
+
* liveQuery.on('create', async (record) => {
|
|
20
|
+
* const data = await record.data.json(); // FriendData
|
|
21
|
+
* });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
import type { PaginationCursor } from '@enbox/dwn-sdk-js';
|
|
25
|
+
import type { LiveQuery, RecordChange } from './live-query.js';
|
|
26
|
+
import { TypedRecord } from './typed-record.js';
|
|
27
|
+
/**
|
|
28
|
+
* Describes a change to a record in a {@link TypedLiveQuery}.
|
|
29
|
+
*
|
|
30
|
+
* Same shape as {@link RecordChange} but with the record wrapped
|
|
31
|
+
* in a {@link TypedRecord}.
|
|
32
|
+
*/
|
|
33
|
+
export type TypedRecordChange<T> = {
|
|
34
|
+
/** Whether the record was created, updated, or deleted. */
|
|
35
|
+
type: RecordChange['type'];
|
|
36
|
+
/** The typed record affected by the change. */
|
|
37
|
+
record: TypedRecord<T>;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* A type-safe wrapper around {@link LiveQuery} that preserves the data type `T`
|
|
41
|
+
* through the initial snapshot and all subsequent change events.
|
|
42
|
+
*
|
|
43
|
+
* Obtain instances through `TypedWeb5.records.subscribe()` — never construct
|
|
44
|
+
* directly.
|
|
45
|
+
*/
|
|
46
|
+
export declare class TypedLiveQuery<T> {
|
|
47
|
+
/** The underlying untyped LiveQuery instance. */
|
|
48
|
+
private _liveQuery;
|
|
49
|
+
/** Cached typed record array, built lazily from the underlying records. */
|
|
50
|
+
private _typedRecords?;
|
|
51
|
+
constructor(liveQuery: LiveQuery);
|
|
52
|
+
/** Access the underlying untyped {@link LiveQuery} for advanced use cases. */
|
|
53
|
+
get rawLiveQuery(): LiveQuery;
|
|
54
|
+
/** The initial snapshot of matching records, typed as `TypedRecord<T>[]`. */
|
|
55
|
+
get records(): TypedRecord<T>[];
|
|
56
|
+
/**
|
|
57
|
+
* Pagination cursor for fetching the next page of initial results.
|
|
58
|
+
*
|
|
59
|
+
* `undefined` when there are no more results.
|
|
60
|
+
*/
|
|
61
|
+
get cursor(): PaginationCursor | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* Register a typed event handler. Returns an unsubscribe function.
|
|
64
|
+
*
|
|
65
|
+
* @param event - The event type to listen for.
|
|
66
|
+
* @param handler - The handler function with typed record(s).
|
|
67
|
+
* @returns A function that removes the handler when called.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```ts
|
|
71
|
+
* const off = liveQuery.on('create', (record) => {
|
|
72
|
+
* // record is TypedRecord<T>
|
|
73
|
+
* });
|
|
74
|
+
* off(); // stop listening
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
on(event: 'change', handler: (change: TypedRecordChange<T>) => void): () => void;
|
|
78
|
+
on(event: 'create', handler: (record: TypedRecord<T>) => void): () => void;
|
|
79
|
+
on(event: 'update', handler: (record: TypedRecord<T>) => void): () => void;
|
|
80
|
+
on(event: 'delete', handler: (record: TypedRecord<T>) => void): () => void;
|
|
81
|
+
/**
|
|
82
|
+
* Close the underlying subscription and stop dispatching events.
|
|
83
|
+
*/
|
|
84
|
+
close(): Promise<void>;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=typed-live-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-live-query.d.ts","sourceRoot":"","sources":["../../src/typed-live-query.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMhD;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI;IACjC,2DAA2D;IAC3D,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAE3B,+CAA+C;IAC/C,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;CACxB,CAAC;AAMF;;;;;;GAMG;AACH,qBAAa,cAAc,CAAC,CAAC;IAC3B,iDAAiD;IACjD,OAAO,CAAC,UAAU,CAAY;IAE9B,2EAA2E;IAC3E,OAAO,CAAC,aAAa,CAAC,CAAmB;gBAE7B,SAAS,EAAE,SAAS;IAQhC,8EAA8E;IAC9E,IAAW,YAAY,IAAI,SAAS,CAEnC;IAMD,6EAA6E;IAC7E,IAAW,OAAO,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAOrC;IAED;;;;OAIG;IACH,IAAW,MAAM,IAAI,gBAAgB,GAAG,SAAS,CAEhD;IAMD;;;;;;;;;;;;;;OAcG;IACI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAChF,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAC1E,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAC1E,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IA0BjF;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpC"}
|