@enbox/api 0.2.2 → 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 -37
- 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 +206 -53
- package/src/web5.ts +150 -23
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A type-safe wrapper around {@link Record} that carries the data type `T`
|
|
3
|
+
* through its entire lifecycle — from write to read, query, update, and
|
|
4
|
+
* subscribe.
|
|
5
|
+
*
|
|
6
|
+
* `TypedRecord<T>` uses composition (not inheritance) to wrap the underlying
|
|
7
|
+
* untyped `Record` class. All read-only getters and lifecycle methods are
|
|
8
|
+
* forwarded, while data-access and mutation methods are enhanced with the
|
|
9
|
+
* generic `T`:
|
|
10
|
+
*
|
|
11
|
+
* - `.data.json()` returns `Promise<T>` instead of `Promise<unknown>`.
|
|
12
|
+
* - `.update({ data })` accepts `Partial<T>` for the data payload.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const { record } = await typed.records.write('friend', {
|
|
17
|
+
* data: { did: 'did:example:alice', alias: 'Alice' },
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* // record is TypedRecord<FriendData>
|
|
21
|
+
* const data = await record.data.json(); // FriendData — no manual cast
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
25
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
26
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
27
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
28
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
29
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
30
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// TypedRecord class
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
/**
|
|
37
|
+
* A type-safe wrapper around {@link Record} that preserves the data type `T`.
|
|
38
|
+
*
|
|
39
|
+
* Obtain instances through `TypedWeb5.records.write()`, `.query()`, `.read()`,
|
|
40
|
+
* or `.subscribe()` — never construct directly.
|
|
41
|
+
*/
|
|
42
|
+
export class TypedRecord {
|
|
43
|
+
constructor(record) {
|
|
44
|
+
this._record = record;
|
|
45
|
+
}
|
|
46
|
+
// -------------------------------------------------------------------------
|
|
47
|
+
// Escape hatch
|
|
48
|
+
// -------------------------------------------------------------------------
|
|
49
|
+
/** Access the underlying untyped {@link Record} for advanced use cases. */
|
|
50
|
+
get rawRecord() {
|
|
51
|
+
return this._record;
|
|
52
|
+
}
|
|
53
|
+
// -------------------------------------------------------------------------
|
|
54
|
+
// Typed data accessor
|
|
55
|
+
// -------------------------------------------------------------------------
|
|
56
|
+
/**
|
|
57
|
+
* Returns the data of the current record with type-safe accessors.
|
|
58
|
+
*
|
|
59
|
+
* The `json()` method returns `Promise<T>` — no manual generic needed.
|
|
60
|
+
*
|
|
61
|
+
* @throws `Error` if the record has been deleted.
|
|
62
|
+
*/
|
|
63
|
+
get data() {
|
|
64
|
+
const underlying = this._record.data;
|
|
65
|
+
return {
|
|
66
|
+
blob: () => underlying.blob(),
|
|
67
|
+
bytes: () => underlying.bytes(),
|
|
68
|
+
json: () => underlying.json(),
|
|
69
|
+
text: () => underlying.text(),
|
|
70
|
+
stream: () => underlying.stream(),
|
|
71
|
+
then: underlying.then.bind(underlying),
|
|
72
|
+
catch: underlying.catch.bind(underlying),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// -------------------------------------------------------------------------
|
|
76
|
+
// Typed mutation methods
|
|
77
|
+
// -------------------------------------------------------------------------
|
|
78
|
+
/**
|
|
79
|
+
* Update the current record on the DWN.
|
|
80
|
+
*
|
|
81
|
+
* @param params - Parameters including the typed `data` payload.
|
|
82
|
+
* @returns The status and an updated {@link TypedRecord}.
|
|
83
|
+
* @throws `Error` if the record has been deleted.
|
|
84
|
+
*/
|
|
85
|
+
update(params) {
|
|
86
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
87
|
+
const { status, record } = yield this._record.update(params);
|
|
88
|
+
return { status, record: new TypedRecord(record) };
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Delete the current record on the DWN.
|
|
93
|
+
*
|
|
94
|
+
* @param params - Delete parameters.
|
|
95
|
+
* @returns The status and a {@link TypedRecord} reflecting the deleted state.
|
|
96
|
+
*/
|
|
97
|
+
delete(params) {
|
|
98
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
99
|
+
const { status, record } = yield this._record.delete(params);
|
|
100
|
+
return { status, record: new TypedRecord(record) };
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// -------------------------------------------------------------------------
|
|
104
|
+
// Forwarded lifecycle methods
|
|
105
|
+
// -------------------------------------------------------------------------
|
|
106
|
+
/**
|
|
107
|
+
* Stores the current record state to the owner's DWN.
|
|
108
|
+
*
|
|
109
|
+
* @param importRecord - If true, sign as owner before storing. Defaults to false.
|
|
110
|
+
*/
|
|
111
|
+
store() {
|
|
112
|
+
return __awaiter(this, arguments, void 0, function* (importRecord = false) {
|
|
113
|
+
return this._record.store(importRecord);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Signs and optionally stores the record to the owner's DWN.
|
|
118
|
+
* Useful when importing a record signed by someone else.
|
|
119
|
+
*
|
|
120
|
+
* @param store - If true, store after signing. Defaults to true.
|
|
121
|
+
*/
|
|
122
|
+
import() {
|
|
123
|
+
return __awaiter(this, arguments, void 0, function* (store = true) {
|
|
124
|
+
return this._record.import(store);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Send the current record to a remote DWN.
|
|
129
|
+
*
|
|
130
|
+
* @param target - Optional DID of the target DWN. Defaults to the connected DID.
|
|
131
|
+
*/
|
|
132
|
+
send(target) {
|
|
133
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
134
|
+
return this._record.send(target);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Returns a JSON representation of the Record instance.
|
|
139
|
+
*/
|
|
140
|
+
toJSON() {
|
|
141
|
+
return this._record.toJSON();
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Returns a string representation of the Record instance.
|
|
145
|
+
*/
|
|
146
|
+
toString() {
|
|
147
|
+
return this._record.toString();
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Returns a pagination cursor for the current record given a sort order.
|
|
151
|
+
*/
|
|
152
|
+
paginationCursor(sort) {
|
|
153
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
154
|
+
return this._record.paginationCursor(sort);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
// -------------------------------------------------------------------------
|
|
158
|
+
// Forwarded immutable property getters
|
|
159
|
+
// -------------------------------------------------------------------------
|
|
160
|
+
/** Record's ID. */
|
|
161
|
+
get id() { return this._record.id; }
|
|
162
|
+
/** Record's context ID. */
|
|
163
|
+
get contextId() { return this._record.contextId; }
|
|
164
|
+
/** Record's creation date. */
|
|
165
|
+
get dateCreated() { return this._record.dateCreated; }
|
|
166
|
+
/** Record's parent ID. */
|
|
167
|
+
get parentId() { return this._record.parentId; }
|
|
168
|
+
/** Record's protocol. */
|
|
169
|
+
get protocol() { return this._record.protocol; }
|
|
170
|
+
/** Record's protocol path. */
|
|
171
|
+
get protocolPath() { return this._record.protocolPath; }
|
|
172
|
+
/** Record's recipient. */
|
|
173
|
+
get recipient() { return this._record.recipient; }
|
|
174
|
+
/** Record's schema. */
|
|
175
|
+
get schema() { return this._record.schema; }
|
|
176
|
+
// -------------------------------------------------------------------------
|
|
177
|
+
// Forwarded mutable property getters
|
|
178
|
+
// -------------------------------------------------------------------------
|
|
179
|
+
/** Record's data format. */
|
|
180
|
+
get dataFormat() { return this._record.dataFormat; }
|
|
181
|
+
/** Record's data CID. */
|
|
182
|
+
get dataCid() { return this._record.dataCid; }
|
|
183
|
+
/** Record's data size. */
|
|
184
|
+
get dataSize() { return this._record.dataSize; }
|
|
185
|
+
/** Record's published date. */
|
|
186
|
+
get datePublished() { return this._record.datePublished; }
|
|
187
|
+
/** Record's published status. */
|
|
188
|
+
get published() { return this._record.published; }
|
|
189
|
+
/** Tags of the record. */
|
|
190
|
+
get tags() {
|
|
191
|
+
return this._record.tags;
|
|
192
|
+
}
|
|
193
|
+
// -------------------------------------------------------------------------
|
|
194
|
+
// Forwarded state-dependent property getters
|
|
195
|
+
// -------------------------------------------------------------------------
|
|
196
|
+
/** DID that is the logical author of the Record. */
|
|
197
|
+
get author() { return this._record.author; }
|
|
198
|
+
/** DID that is the original creator of the Record. */
|
|
199
|
+
get creator() { return this._record.creator; }
|
|
200
|
+
/** Record's message timestamp. */
|
|
201
|
+
get timestamp() { return this._record.timestamp; }
|
|
202
|
+
/** Record's encryption details. */
|
|
203
|
+
get encryption() {
|
|
204
|
+
return this._record.encryption;
|
|
205
|
+
}
|
|
206
|
+
/** Record's authorization. */
|
|
207
|
+
get authorization() {
|
|
208
|
+
return this._record.authorization;
|
|
209
|
+
}
|
|
210
|
+
/** Record's attestation. */
|
|
211
|
+
get attestation() {
|
|
212
|
+
return this._record.attestation;
|
|
213
|
+
}
|
|
214
|
+
/** Role under which the author is writing the record. */
|
|
215
|
+
get protocolRole() { return this._record.protocolRole; }
|
|
216
|
+
/** Record's deleted state. */
|
|
217
|
+
get deleted() { return this._record.deleted; }
|
|
218
|
+
/** Record's initial write if the record has been updated. */
|
|
219
|
+
get initialWrite() {
|
|
220
|
+
return this._record.initialWrite;
|
|
221
|
+
}
|
|
222
|
+
/** The raw DWN message backing this record. */
|
|
223
|
+
get rawMessage() {
|
|
224
|
+
return this._record.rawMessage;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=typed-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-record.js","sourceRoot":"","sources":["../../src/typed-record.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/typed-web5.js
CHANGED
|
@@ -6,6 +6,10 @@
|
|
|
6
6
|
* and schema into every operation, and provides compile-time path
|
|
7
7
|
* autocompletion plus typed data payloads via the schema map.
|
|
8
8
|
*
|
|
9
|
+
* All record-returning methods wrap the underlying `Record` instances in
|
|
10
|
+
* {@link TypedRecord} so that type information flows through reads, queries,
|
|
11
|
+
* updates, and subscriptions without manual casts.
|
|
12
|
+
*
|
|
9
13
|
* @example
|
|
10
14
|
* ```ts
|
|
11
15
|
* const social = web5.using(SocialProtocol);
|
|
@@ -13,17 +17,23 @@
|
|
|
13
17
|
* // Install the protocol
|
|
14
18
|
* await social.configure();
|
|
15
19
|
*
|
|
16
|
-
* //
|
|
17
|
-
* const { record } = await social.records.
|
|
20
|
+
* // Create — path and data type are checked at compile time
|
|
21
|
+
* const { record } = await social.records.create('thread', {
|
|
18
22
|
* data: { title: 'Hello World', body: '...' },
|
|
19
23
|
* });
|
|
24
|
+
* // record is TypedRecord<ThreadData>
|
|
25
|
+
*
|
|
26
|
+
* const data = await record.data.json(); // ThreadData — no cast needed
|
|
20
27
|
*
|
|
21
28
|
* // Query — protocol and protocolPath are auto-injected
|
|
22
29
|
* const { records } = await social.records.query('thread');
|
|
30
|
+
* // records is TypedRecord<ThreadData>[]
|
|
23
31
|
*
|
|
24
|
-
* // Subscribe — real-time changes via
|
|
32
|
+
* // Subscribe — real-time changes via TypedLiveQuery
|
|
25
33
|
* const { liveQuery } = await social.records.subscribe('thread/reply');
|
|
26
|
-
* liveQuery.on('create', (record) => {
|
|
34
|
+
* liveQuery.on('create', (record) => {
|
|
35
|
+
* // record is TypedRecord<ReplyData>
|
|
36
|
+
* });
|
|
27
37
|
* ```
|
|
28
38
|
*/
|
|
29
39
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
@@ -35,6 +45,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
35
45
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
36
46
|
});
|
|
37
47
|
};
|
|
48
|
+
import { TypedLiveQuery } from './typed-live-query.js';
|
|
49
|
+
import { TypedRecord } from './typed-record.js';
|
|
38
50
|
// ---------------------------------------------------------------------------
|
|
39
51
|
// TypedWeb5 class
|
|
40
52
|
// ---------------------------------------------------------------------------
|
|
@@ -42,6 +54,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
42
54
|
* A protocol-scoped API that auto-injects `protocol`, `protocolPath`, and
|
|
43
55
|
* `schema` into every DWN operation.
|
|
44
56
|
*
|
|
57
|
+
* All record-returning methods wrap results in {@link TypedRecord} so that
|
|
58
|
+
* the data type `T` (resolved from the schema map) flows end-to-end — from
|
|
59
|
+
* write through read, query, update, and subscribe — without manual casts.
|
|
60
|
+
*
|
|
45
61
|
* Obtain an instance via `web5.using(typedProtocol)`.
|
|
46
62
|
*
|
|
47
63
|
* @example
|
|
@@ -50,19 +66,25 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
50
66
|
*
|
|
51
67
|
* await social.configure();
|
|
52
68
|
*
|
|
53
|
-
* const { record } = await social.records.
|
|
69
|
+
* const { record } = await social.records.create('friend', {
|
|
54
70
|
* data: { did: 'did:example:alice', alias: 'Alice' },
|
|
55
71
|
* });
|
|
72
|
+
* const data = await record.data.json(); // FriendData — no cast
|
|
56
73
|
*
|
|
57
74
|
* const { records } = await social.records.query('friend', {
|
|
58
75
|
* filter: { tags: { did: 'did:example:alice' } },
|
|
59
76
|
* });
|
|
77
|
+
* for (const r of records) {
|
|
78
|
+
* const d = await r.data.json(); // FriendData
|
|
79
|
+
* }
|
|
60
80
|
* ```
|
|
61
81
|
*/
|
|
62
82
|
export class TypedWeb5 {
|
|
63
83
|
constructor(dwn, protocol) {
|
|
84
|
+
this._configured = false;
|
|
64
85
|
this._dwn = dwn;
|
|
65
86
|
this._definition = protocol.definition;
|
|
87
|
+
this._validPaths = collectPaths(this._definition.structure);
|
|
66
88
|
}
|
|
67
89
|
/** The protocol URI. */
|
|
68
90
|
get protocol() {
|
|
@@ -92,50 +114,71 @@ export class TypedWeb5 {
|
|
|
92
114
|
if (protocols.length > 0) {
|
|
93
115
|
const existing = protocols[0];
|
|
94
116
|
if (definitionsEqual(existing.definition, this._definition)) {
|
|
117
|
+
this._configured = true;
|
|
95
118
|
return { status: { code: 200, detail: 'OK' }, protocol: existing };
|
|
96
119
|
}
|
|
97
120
|
}
|
|
98
121
|
// Not installed or definition has changed — configure the new version.
|
|
99
|
-
|
|
122
|
+
const result = yield this._dwn.protocols.configure({
|
|
100
123
|
definition: this._definition,
|
|
101
124
|
encryption: options === null || options === void 0 ? void 0 : options.encryption,
|
|
102
125
|
});
|
|
126
|
+
if (result.status.code === 202) {
|
|
127
|
+
this._configured = true;
|
|
128
|
+
}
|
|
129
|
+
return result;
|
|
103
130
|
});
|
|
104
131
|
}
|
|
132
|
+
/** Whether the protocol has been configured (installed) on the local DWN. */
|
|
133
|
+
get isConfigured() {
|
|
134
|
+
return this._configured;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Validates that the protocol has been configured and that the path is
|
|
138
|
+
* recognized. Throws a descriptive error if either check fails.
|
|
139
|
+
*/
|
|
140
|
+
_assertReady(path) {
|
|
141
|
+
if (!this._configured) {
|
|
142
|
+
throw new Error(`TypedWeb5: protocol '${this._definition.protocol}' has not been configured. ` +
|
|
143
|
+
'Call configure() before performing record operations.');
|
|
144
|
+
}
|
|
145
|
+
if (!this._validPaths.has(path)) {
|
|
146
|
+
throw new Error(`TypedWeb5: invalid protocol path '${path}'. ` +
|
|
147
|
+
`Valid paths are: ${[...this._validPaths].join(', ')}.`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
105
150
|
/**
|
|
106
151
|
* Protocol-scoped record operations.
|
|
107
152
|
*
|
|
108
153
|
* Every method auto-injects the protocol URI, protocolPath, and schema
|
|
109
154
|
* from the protocol definition. Path parameters provide compile-time
|
|
110
155
|
* autocompletion via `ProtocolPaths<D>`.
|
|
156
|
+
*
|
|
157
|
+
* All methods return {@link TypedRecord} or {@link TypedLiveQuery} instances
|
|
158
|
+
* that carry the resolved data type from the schema map.
|
|
111
159
|
*/
|
|
112
160
|
get records() {
|
|
113
|
-
|
|
161
|
+
if (this._records !== undefined) {
|
|
162
|
+
return this._records;
|
|
163
|
+
}
|
|
164
|
+
const cached = {
|
|
114
165
|
/**
|
|
115
|
-
*
|
|
166
|
+
* Create a new record at the given protocol path.
|
|
116
167
|
*
|
|
117
168
|
* @param path - The protocol path (e.g. `'friend'`, `'group/member'`).
|
|
118
|
-
* @param request -
|
|
169
|
+
* @param request - Create options including typed `data`.
|
|
119
170
|
*/
|
|
120
|
-
|
|
171
|
+
create: (path, request) => __awaiter(this, void 0, void 0, function* () {
|
|
121
172
|
var _a, _b;
|
|
122
|
-
const
|
|
173
|
+
const normalizedPath = normalizePath(path);
|
|
174
|
+
this._assertReady(normalizedPath);
|
|
175
|
+
const typeName = lastSegment(normalizedPath);
|
|
123
176
|
const typeEntry = this._definition.types[typeName];
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
published: request.published,
|
|
130
|
-
datePublished: request.datePublished,
|
|
131
|
-
recipient: request.recipient,
|
|
132
|
-
protocolRole: request.protocolRole,
|
|
133
|
-
tags: request.tags,
|
|
134
|
-
protocol: this._definition.protocol,
|
|
135
|
-
protocolPath: path,
|
|
136
|
-
schema: typeEntry === null || typeEntry === void 0 ? void 0 : typeEntry.schema,
|
|
137
|
-
dataFormat: (_a = request.dataFormat) !== null && _a !== void 0 ? _a : (_b = typeEntry === null || typeEntry === void 0 ? void 0 : typeEntry.dataFormats) === null || _b === void 0 ? void 0 : _b[0],
|
|
138
|
-
});
|
|
177
|
+
const { status, record } = yield this._dwn.records.write(Object.assign(Object.assign({ data: request.data, store: request.store, encryption: request.encryption, parentContextId: request.parentContextId, published: request.published, datePublished: request.datePublished, recipient: request.recipient, protocolRole: request.protocolRole, tags: request.tags, protocol: this._definition.protocol, protocolPath: normalizedPath }, ((typeEntry === null || typeEntry === void 0 ? void 0 : typeEntry.schema) !== undefined ? { schema: typeEntry.schema } : {})), { dataFormat: (_a = request.dataFormat) !== null && _a !== void 0 ? _a : (_b = typeEntry === null || typeEntry === void 0 ? void 0 : typeEntry.dataFormats) === null || _b === void 0 ? void 0 : _b[0] }));
|
|
178
|
+
return {
|
|
179
|
+
status,
|
|
180
|
+
record: new TypedRecord(record),
|
|
181
|
+
};
|
|
139
182
|
}),
|
|
140
183
|
/**
|
|
141
184
|
* Query records at the given protocol path.
|
|
@@ -144,16 +187,23 @@ export class TypedWeb5 {
|
|
|
144
187
|
* @param request - Optional filter, sort, and pagination.
|
|
145
188
|
*/
|
|
146
189
|
query: (path, request) => __awaiter(this, void 0, void 0, function* () {
|
|
147
|
-
const
|
|
190
|
+
const normalizedPath = normalizePath(path);
|
|
191
|
+
this._assertReady(normalizedPath);
|
|
192
|
+
const typeName = lastSegment(normalizedPath);
|
|
148
193
|
const typeEntry = this._definition.types[typeName];
|
|
149
|
-
|
|
194
|
+
const { status, records, cursor } = yield this._dwn.records.query({
|
|
150
195
|
from: request === null || request === void 0 ? void 0 : request.from,
|
|
151
196
|
encryption: request === null || request === void 0 ? void 0 : request.encryption,
|
|
152
|
-
filter: Object.assign(Object.assign({}, request === null || request === void 0 ? void 0 : request.filter), { protocol: this._definition.protocol, protocolPath:
|
|
197
|
+
filter: Object.assign(Object.assign(Object.assign({}, request === null || request === void 0 ? void 0 : request.filter), { protocol: this._definition.protocol, protocolPath: normalizedPath }), ((typeEntry === null || typeEntry === void 0 ? void 0 : typeEntry.schema) !== undefined ? { schema: typeEntry.schema } : {})),
|
|
153
198
|
dateSort: request === null || request === void 0 ? void 0 : request.dateSort,
|
|
154
199
|
pagination: request === null || request === void 0 ? void 0 : request.pagination,
|
|
155
200
|
protocolRole: request === null || request === void 0 ? void 0 : request.protocolRole,
|
|
156
201
|
});
|
|
202
|
+
return {
|
|
203
|
+
status,
|
|
204
|
+
records: records.map((r) => new TypedRecord(r)),
|
|
205
|
+
cursor,
|
|
206
|
+
};
|
|
157
207
|
}),
|
|
158
208
|
/**
|
|
159
209
|
* Read a single record at the given protocol path.
|
|
@@ -162,14 +212,20 @@ export class TypedWeb5 {
|
|
|
162
212
|
* @param request - Read options including a filter to identify the record.
|
|
163
213
|
*/
|
|
164
214
|
read: (path, request) => __awaiter(this, void 0, void 0, function* () {
|
|
165
|
-
const
|
|
215
|
+
const normalizedPath = normalizePath(path);
|
|
216
|
+
this._assertReady(normalizedPath);
|
|
217
|
+
const typeName = lastSegment(normalizedPath);
|
|
166
218
|
const typeEntry = this._definition.types[typeName];
|
|
167
|
-
|
|
219
|
+
const { status, record } = yield this._dwn.records.read({
|
|
168
220
|
from: request.from,
|
|
169
221
|
encryption: request.encryption,
|
|
170
222
|
protocol: this._definition.protocol,
|
|
171
|
-
filter: Object.assign(Object.assign({}, request.filter), { protocol: this._definition.protocol, protocolPath:
|
|
223
|
+
filter: Object.assign(Object.assign(Object.assign({}, request.filter), { protocol: this._definition.protocol, protocolPath: normalizedPath }), ((typeEntry === null || typeEntry === void 0 ? void 0 : typeEntry.schema) !== undefined ? { schema: typeEntry.schema } : {})),
|
|
172
224
|
});
|
|
225
|
+
return {
|
|
226
|
+
status,
|
|
227
|
+
record: new TypedRecord(record),
|
|
228
|
+
};
|
|
173
229
|
}),
|
|
174
230
|
/**
|
|
175
231
|
* Delete a record at the given protocol path.
|
|
@@ -178,6 +234,7 @@ export class TypedWeb5 {
|
|
|
178
234
|
* @param request - Delete options including the `recordId`.
|
|
179
235
|
*/
|
|
180
236
|
delete: (_path, request) => __awaiter(this, void 0, void 0, function* () {
|
|
237
|
+
this._assertReady(normalizePath(_path));
|
|
181
238
|
return this._dwn.records.delete({
|
|
182
239
|
from: request.from,
|
|
183
240
|
protocol: this._definition.protocol,
|
|
@@ -187,22 +244,31 @@ export class TypedWeb5 {
|
|
|
187
244
|
/**
|
|
188
245
|
* Subscribe to records at the given protocol path.
|
|
189
246
|
*
|
|
190
|
-
* Returns a {@link
|
|
191
|
-
* and a real-time stream of deduplicated change events
|
|
247
|
+
* Returns a {@link TypedLiveQuery} that atomically provides an initial
|
|
248
|
+
* snapshot and a real-time stream of deduplicated change events, with
|
|
249
|
+
* all records typed as `TypedRecord<T>`.
|
|
192
250
|
*
|
|
193
251
|
* @param path - The protocol path to subscribe to.
|
|
194
252
|
* @param request - Optional filter and role.
|
|
195
253
|
*/
|
|
196
254
|
subscribe: (path, request) => __awaiter(this, void 0, void 0, function* () {
|
|
197
|
-
const
|
|
255
|
+
const normalizedPath = normalizePath(path);
|
|
256
|
+
this._assertReady(normalizedPath);
|
|
257
|
+
const typeName = lastSegment(normalizedPath);
|
|
198
258
|
const typeEntry = this._definition.types[typeName];
|
|
199
|
-
|
|
259
|
+
const { status, liveQuery } = yield this._dwn.records.subscribe({
|
|
200
260
|
from: request === null || request === void 0 ? void 0 : request.from,
|
|
201
|
-
filter: Object.assign(Object.assign({}, request === null || request === void 0 ? void 0 : request.filter), { protocol: this._definition.protocol, protocolPath:
|
|
261
|
+
filter: Object.assign(Object.assign(Object.assign({}, request === null || request === void 0 ? void 0 : request.filter), { protocol: this._definition.protocol, protocolPath: normalizedPath }), ((typeEntry === null || typeEntry === void 0 ? void 0 : typeEntry.schema) !== undefined ? { schema: typeEntry.schema } : {})),
|
|
202
262
|
protocolRole: request === null || request === void 0 ? void 0 : request.protocolRole,
|
|
203
263
|
});
|
|
264
|
+
return {
|
|
265
|
+
status,
|
|
266
|
+
liveQuery: liveQuery ? new TypedLiveQuery(liveQuery) : undefined,
|
|
267
|
+
};
|
|
204
268
|
}),
|
|
205
269
|
};
|
|
270
|
+
this._records = cached;
|
|
271
|
+
return cached;
|
|
206
272
|
}
|
|
207
273
|
}
|
|
208
274
|
// ---------------------------------------------------------------------------
|
|
@@ -218,6 +284,14 @@ export class TypedWeb5 {
|
|
|
218
284
|
function definitionsEqual(a, b) {
|
|
219
285
|
return stableStringify(a) === stableStringify(b);
|
|
220
286
|
}
|
|
287
|
+
/**
|
|
288
|
+
* Strips leading and trailing slashes from a path.
|
|
289
|
+
*
|
|
290
|
+
* `'friend/'` → `'friend'`, `'/group/member/'` → `'group/member'`.
|
|
291
|
+
*/
|
|
292
|
+
function normalizePath(path) {
|
|
293
|
+
return path.replace(/^\/+|\/+$/g, '');
|
|
294
|
+
}
|
|
221
295
|
/**
|
|
222
296
|
* Returns the last segment of a slash-delimited path.
|
|
223
297
|
*/
|
|
@@ -225,6 +299,29 @@ function lastSegment(path) {
|
|
|
225
299
|
const parts = path.split('/');
|
|
226
300
|
return parts[parts.length - 1];
|
|
227
301
|
}
|
|
302
|
+
/**
|
|
303
|
+
* Recursively collects all valid protocol path strings from a structure object.
|
|
304
|
+
*
|
|
305
|
+
* Given `{ foo: { bar: { $actions: [...] } } }`, returns `Set(['foo', 'foo/bar'])`.
|
|
306
|
+
* Keys starting with `$` are skipped.
|
|
307
|
+
*/
|
|
308
|
+
function collectPaths(structure, prefix = '') {
|
|
309
|
+
const paths = new Set();
|
|
310
|
+
for (const key of Object.keys(structure)) {
|
|
311
|
+
if (key.startsWith('$')) {
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
const fullPath = prefix ? `${prefix}/${key}` : key;
|
|
315
|
+
paths.add(fullPath);
|
|
316
|
+
const child = structure[key];
|
|
317
|
+
if (child !== null && typeof child === 'object') {
|
|
318
|
+
for (const nested of collectPaths(child, fullPath)) {
|
|
319
|
+
paths.add(nested);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return paths;
|
|
324
|
+
}
|
|
228
325
|
/**
|
|
229
326
|
* Deterministic JSON serialization with sorted keys.
|
|
230
327
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typed-web5.js","sourceRoot":"","sources":["../../src/typed-web5.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"typed-web5.js","sourceRoot":"","sources":["../../src/typed-web5.ts"],"names":[],"mappings":"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"}
|