@atcute/did-plc 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -5
- package/dist/client.d.ts +68 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +127 -0
- package/dist/client.js.map +1 -0
- package/dist/data.d.ts +9 -9
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +3 -5
- package/dist/data.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/typedefs.d.ts +2 -0
- package/dist/typedefs.d.ts.map +1 -1
- package/dist/typedefs.js +13 -0
- package/dist/typedefs.js.map +1 -1
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +22 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +36 -1
- package/dist/utils.js.map +1 -1
- package/lib/client.ts +195 -0
- package/lib/data.ts +3 -6
- package/lib/index.ts +1 -0
- package/lib/typedefs.ts +15 -0
- package/lib/types.ts +23 -0
- package/lib/utils.ts +44 -1
- package/package.json +14 -9
package/README.md
CHANGED
|
@@ -1,15 +1,93 @@
|
|
|
1
1
|
# @atcute/did-plc
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
validate, sign, and interact with did:plc operations.
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
npm install @atcute/did-plc
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
did:plc is a self-certifying DID method where the audit log serves as the source of truth. this
|
|
10
|
+
package validates that operations are properly signed and chained, and provides utilities for
|
|
11
|
+
creating and submitting new operations.
|
|
12
|
+
|
|
13
|
+
## usage
|
|
14
|
+
|
|
15
|
+
### using the client
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import { PlcClient } from '@atcute/did-plc';
|
|
19
|
+
|
|
20
|
+
const client = new PlcClient();
|
|
21
|
+
|
|
22
|
+
// fetch DID document
|
|
23
|
+
const doc = await client.getDocument('did:plc:ragtjsm2j2vknwkz3zp4oxrd');
|
|
24
|
+
|
|
25
|
+
// fetch current identity state
|
|
26
|
+
const state = await client.getState('did:plc:ragtjsm2j2vknwkz3zp4oxrd');
|
|
27
|
+
|
|
28
|
+
// fetch operation log
|
|
29
|
+
const log = await client.getOperationLog('did:plc:ragtjsm2j2vknwkz3zp4oxrd');
|
|
30
|
+
|
|
31
|
+
// fetch last operation
|
|
32
|
+
const lastOp = await client.getLastOperation('did:plc:ragtjsm2j2vknwkz3zp4oxrd');
|
|
33
|
+
|
|
34
|
+
// submit a signed operation
|
|
35
|
+
await client.submitOperation('did:plc:ragtjsm2j2vknwkz3zp4oxrd', signedOperation);
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### signing operations
|
|
4
39
|
|
|
5
40
|
```ts
|
|
6
|
-
import {
|
|
41
|
+
import { signOperation, signTombstone, deriveDidFromGenesisOp } from '@atcute/did-plc';
|
|
42
|
+
|
|
43
|
+
// sign an unsigned operation
|
|
44
|
+
const signedOp = await signOperation(unsignedOp, rotationKey);
|
|
7
45
|
|
|
8
|
-
|
|
46
|
+
// sign a tombstone
|
|
47
|
+
const signedTombstone = await signTombstone(unsignedTombstone, rotationKey);
|
|
48
|
+
|
|
49
|
+
// derive did:plc from genesis operation
|
|
50
|
+
const did = await deriveDidFromGenesisOp(signedGenesisOp);
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### validating audit logs
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
import { defs, processIndexedEntryLog } from '@atcute/did-plc';
|
|
57
|
+
|
|
58
|
+
const did = 'did:plc:ragtjsm2j2vknwkz3zp4oxrd';
|
|
9
59
|
|
|
10
60
|
const response = await fetch(`https://plc.directory/${did}/log/audit`);
|
|
11
61
|
const json = await response.json();
|
|
12
62
|
|
|
13
|
-
const logs = defs.
|
|
14
|
-
await
|
|
63
|
+
const logs = defs.indexedEntryLog.parse(json);
|
|
64
|
+
const { canonical, nullified } = await processIndexedEntryLog(did, logs);
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### validating new operations
|
|
68
|
+
|
|
69
|
+
before submitting a new operation to plc.directory:
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
import { validateIncomingOp } from '@atcute/did-plc';
|
|
73
|
+
|
|
74
|
+
// throws if operation exceeds size limits or has invalid structure
|
|
75
|
+
validateIncomingOp(operation);
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### checking dispute windows
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
import { isDisputePeriodActive, getDisputeCandidates } from '@atcute/did-plc';
|
|
82
|
+
|
|
83
|
+
// assuming `canonical` from processIndexedEntryLog result above
|
|
84
|
+
|
|
85
|
+
// find operations that a rotation key can dispute
|
|
86
|
+
const candidates = getDisputeCandidates(canonical, 'did:key:z...');
|
|
87
|
+
|
|
88
|
+
// check if a specific operation can still be disputed (72-hour window)
|
|
89
|
+
const entry = canonical.at(-1);
|
|
90
|
+
if (entry && isDisputePeriodActive(entry)) {
|
|
91
|
+
// entry is still within the dispute window
|
|
92
|
+
}
|
|
15
93
|
```
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { DidDocument } from '@atcute/identity';
|
|
2
|
+
import * as t from './types.js';
|
|
3
|
+
export interface PlcClientOptions {
|
|
4
|
+
/** plc directory URL, defaults to https://plc.directory */
|
|
5
|
+
serviceUrl?: string;
|
|
6
|
+
/** custom fetch function */
|
|
7
|
+
fetch?: typeof globalThis.fetch;
|
|
8
|
+
}
|
|
9
|
+
export interface PlcRequestOptions {
|
|
10
|
+
signal?: AbortSignal;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* client for interacting with plc.directory
|
|
14
|
+
*/
|
|
15
|
+
export declare class PlcClient {
|
|
16
|
+
#private;
|
|
17
|
+
readonly serviceUrl: string;
|
|
18
|
+
constructor({ serviceUrl, fetch: fetchFn }?: PlcClientOptions);
|
|
19
|
+
/**
|
|
20
|
+
* fetches the DID document for a did:plc
|
|
21
|
+
* @param did the did:plc identifier
|
|
22
|
+
* @param options request options
|
|
23
|
+
* @returns the DID document
|
|
24
|
+
*/
|
|
25
|
+
getDocument(did: t.DidPlcString, options?: PlcRequestOptions): Promise<DidDocument>;
|
|
26
|
+
/**
|
|
27
|
+
* fetches the current identity state for a did:plc
|
|
28
|
+
* @param did the did:plc identifier
|
|
29
|
+
* @param options request options
|
|
30
|
+
* @returns the current plc state
|
|
31
|
+
*/
|
|
32
|
+
getState(did: t.DidPlcString, options?: PlcRequestOptions): Promise<t.PlcState>;
|
|
33
|
+
/**
|
|
34
|
+
* fetches the operation log for a did:plc
|
|
35
|
+
* @param did the did:plc identifier
|
|
36
|
+
* @param options request options
|
|
37
|
+
* @returns the operation log
|
|
38
|
+
*/
|
|
39
|
+
getOperationLog(did: t.DidPlcString, options?: PlcRequestOptions): Promise<t.OperationLog>;
|
|
40
|
+
/**
|
|
41
|
+
* fetches the auditable log for a did:plc (includes CIDs and timestamps)
|
|
42
|
+
* @param did the did:plc identifier
|
|
43
|
+
* @param options request options
|
|
44
|
+
* @returns the indexed entry log
|
|
45
|
+
*/
|
|
46
|
+
getAuditLog(did: t.DidPlcString, options?: PlcRequestOptions): Promise<t.IndexedEntryLog>;
|
|
47
|
+
/**
|
|
48
|
+
* fetches the last operation for a did:plc
|
|
49
|
+
* @param did the did:plc identifier
|
|
50
|
+
* @param options request options
|
|
51
|
+
* @returns the last operation or tombstone
|
|
52
|
+
*/
|
|
53
|
+
getLastOperation(did: t.DidPlcString, options?: PlcRequestOptions): Promise<t.CompatibleOperationOrTombstone>;
|
|
54
|
+
/**
|
|
55
|
+
* submits a signed operation to plc.directory
|
|
56
|
+
* @param did the did:plc identifier
|
|
57
|
+
* @param operation the signed operation to submit
|
|
58
|
+
* @param options request options
|
|
59
|
+
*/
|
|
60
|
+
submitOperation(did: t.DidPlcString, operation: t.OperationOrTombstone, options?: PlcRequestOptions): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* checks if the plc directory is reachable
|
|
63
|
+
* @param options request options
|
|
64
|
+
* @returns true if reachable
|
|
65
|
+
*/
|
|
66
|
+
ping(options?: PlcRequestOptions): Promise<boolean>;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../lib/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAKpD,OAAO,KAAK,CAAC,MAAM,YAAY,CAAC;AAkChC,MAAM,WAAW,gBAAgB;IAChC,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,SAAS;;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAG5B,YAAY,EAAE,UAAoC,EAAE,KAAK,EAAE,OAAe,EAAE,GAAE,gBAAqB,EAGlG;IAED;;;;;OAKG;IACG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAUxF;IAED;;;;;OAKG;IACG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAUpF;IAED;;;;;OAKG;IACG,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAU/F;IAED;;;;;OAKG;IACG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAU9F;IAED;;;;;OAKG;IACG,gBAAgB,CACrB,GAAG,EAAE,CAAC,CAAC,YAAY,EACnB,OAAO,CAAC,EAAE,iBAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAU3C;IAED;;;;;OAKG;IACG,eAAe,CACpB,GAAG,EAAE,CAAC,CAAC,YAAY,EACnB,SAAS,EAAE,CAAC,CAAC,oBAAoB,EACjC,OAAO,CAAC,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAaf;IAED;;;;OAIG;IACG,IAAI,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAQxD;CACD"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { defs as identityDefs } from '@atcute/identity';
|
|
2
|
+
import { FailedResponseError, isResponseOk, parseResponseAsJson, pipe, validateJsonWith } from '@atcute/util-fetch';
|
|
3
|
+
import * as defs from './typedefs.js';
|
|
4
|
+
import * as t from './types.js';
|
|
5
|
+
const MAX_RESPONSE_SIZE = 64 * 1024;
|
|
6
|
+
const handleDocument = pipe(isResponseOk, parseResponseAsJson(/^application\/(did\+ld\+)?json$/, MAX_RESPONSE_SIZE), validateJsonWith(identityDefs.didDocument, { mode: 'passthrough' }));
|
|
7
|
+
const handlePlcState = pipe(isResponseOk, parseResponseAsJson(/^application\/json$/, MAX_RESPONSE_SIZE), validateJsonWith(defs.plcState, { mode: 'passthrough' }));
|
|
8
|
+
const handleOperationLog = pipe(isResponseOk, parseResponseAsJson(/^application\/json$/, MAX_RESPONSE_SIZE), validateJsonWith(defs.operationLog, { mode: 'passthrough' }));
|
|
9
|
+
const handleIndexedEntryLog = pipe(isResponseOk, parseResponseAsJson(/^application\/json$/, MAX_RESPONSE_SIZE), validateJsonWith(defs.indexedEntryLog, { mode: 'passthrough' }));
|
|
10
|
+
const handleLastOperation = pipe(isResponseOk, parseResponseAsJson(/^application\/json$/, MAX_RESPONSE_SIZE), validateJsonWith(defs.compatibleOperationOrTombstone, { mode: 'passthrough' }));
|
|
11
|
+
/**
|
|
12
|
+
* client for interacting with plc.directory
|
|
13
|
+
*/
|
|
14
|
+
export class PlcClient {
|
|
15
|
+
serviceUrl;
|
|
16
|
+
#fetch;
|
|
17
|
+
constructor({ serviceUrl = 'https://plc.directory', fetch: fetchFn = fetch } = {}) {
|
|
18
|
+
this.serviceUrl = serviceUrl;
|
|
19
|
+
this.#fetch = fetchFn;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* fetches the DID document for a did:plc
|
|
23
|
+
* @param did the did:plc identifier
|
|
24
|
+
* @param options request options
|
|
25
|
+
* @returns the DID document
|
|
26
|
+
*/
|
|
27
|
+
async getDocument(did, options) {
|
|
28
|
+
const url = new URL(`/${encodeURIComponent(did)}`, this.serviceUrl);
|
|
29
|
+
const response = await this.#fetch(url, {
|
|
30
|
+
signal: options?.signal,
|
|
31
|
+
headers: { accept: 'application/did+ld+json,application/json' },
|
|
32
|
+
});
|
|
33
|
+
const { json } = await handleDocument(response);
|
|
34
|
+
return json;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* fetches the current identity state for a did:plc
|
|
38
|
+
* @param did the did:plc identifier
|
|
39
|
+
* @param options request options
|
|
40
|
+
* @returns the current plc state
|
|
41
|
+
*/
|
|
42
|
+
async getState(did, options) {
|
|
43
|
+
const url = new URL(`/${encodeURIComponent(did)}/data`, this.serviceUrl);
|
|
44
|
+
const response = await this.#fetch(url, {
|
|
45
|
+
signal: options?.signal,
|
|
46
|
+
headers: { accept: 'application/json' },
|
|
47
|
+
});
|
|
48
|
+
const { json } = await handlePlcState(response);
|
|
49
|
+
return json;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* fetches the operation log for a did:plc
|
|
53
|
+
* @param did the did:plc identifier
|
|
54
|
+
* @param options request options
|
|
55
|
+
* @returns the operation log
|
|
56
|
+
*/
|
|
57
|
+
async getOperationLog(did, options) {
|
|
58
|
+
const url = new URL(`/${encodeURIComponent(did)}/log`, this.serviceUrl);
|
|
59
|
+
const response = await this.#fetch(url, {
|
|
60
|
+
signal: options?.signal,
|
|
61
|
+
headers: { accept: 'application/json' },
|
|
62
|
+
});
|
|
63
|
+
const { json } = await handleOperationLog(response);
|
|
64
|
+
return json;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* fetches the auditable log for a did:plc (includes CIDs and timestamps)
|
|
68
|
+
* @param did the did:plc identifier
|
|
69
|
+
* @param options request options
|
|
70
|
+
* @returns the indexed entry log
|
|
71
|
+
*/
|
|
72
|
+
async getAuditLog(did, options) {
|
|
73
|
+
const url = new URL(`/${encodeURIComponent(did)}/log/audit`, this.serviceUrl);
|
|
74
|
+
const response = await this.#fetch(url, {
|
|
75
|
+
signal: options?.signal,
|
|
76
|
+
headers: { accept: 'application/json' },
|
|
77
|
+
});
|
|
78
|
+
const { json } = await handleIndexedEntryLog(response);
|
|
79
|
+
return json;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* fetches the last operation for a did:plc
|
|
83
|
+
* @param did the did:plc identifier
|
|
84
|
+
* @param options request options
|
|
85
|
+
* @returns the last operation or tombstone
|
|
86
|
+
*/
|
|
87
|
+
async getLastOperation(did, options) {
|
|
88
|
+
const url = new URL(`/${encodeURIComponent(did)}/log/last`, this.serviceUrl);
|
|
89
|
+
const response = await this.#fetch(url, {
|
|
90
|
+
signal: options?.signal,
|
|
91
|
+
headers: { accept: 'application/json' },
|
|
92
|
+
});
|
|
93
|
+
const { json } = await handleLastOperation(response);
|
|
94
|
+
return json;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* submits a signed operation to plc.directory
|
|
98
|
+
* @param did the did:plc identifier
|
|
99
|
+
* @param operation the signed operation to submit
|
|
100
|
+
* @param options request options
|
|
101
|
+
*/
|
|
102
|
+
async submitOperation(did, operation, options) {
|
|
103
|
+
const url = new URL(`/${encodeURIComponent(did)}`, this.serviceUrl);
|
|
104
|
+
const response = await this.#fetch(url, {
|
|
105
|
+
method: 'POST',
|
|
106
|
+
signal: options?.signal,
|
|
107
|
+
headers: { 'content-type': 'application/json' },
|
|
108
|
+
body: JSON.stringify(operation),
|
|
109
|
+
});
|
|
110
|
+
if (!response.ok) {
|
|
111
|
+
throw new FailedResponseError(response);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* checks if the plc directory is reachable
|
|
116
|
+
* @param options request options
|
|
117
|
+
* @returns true if reachable
|
|
118
|
+
*/
|
|
119
|
+
async ping(options) {
|
|
120
|
+
const url = new URL('/_health', this.serviceUrl);
|
|
121
|
+
const response = await this.#fetch(url, {
|
|
122
|
+
signal: options?.signal,
|
|
123
|
+
});
|
|
124
|
+
return response.ok;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../lib/client.ts"],"names":[],"mappings":"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"}
|
package/dist/data.d.ts
CHANGED
|
@@ -8,26 +8,26 @@ export declare const validateIncomingOp: (op: t.CompatibleOperationOrTombstone)
|
|
|
8
8
|
/**
|
|
9
9
|
* Process an indexed entry by validating it and integrating it into the canonical log.
|
|
10
10
|
*/
|
|
11
|
-
export declare const processIndexedEntry: (did:
|
|
11
|
+
export declare const processIndexedEntry: (did: `did:plc:${string}`, canonical: t.IndexedEntryWithSigner<t.CompatibleOperationOrTombstone>[], proposed: t.IndexedEntry<t.CompatibleOperationOrTombstone>) => Promise<{
|
|
12
12
|
prev: string | null;
|
|
13
|
-
ops: t.IndexedEntryWithSigner[];
|
|
14
|
-
nullified: t.IndexedEntryWithSigner[];
|
|
13
|
+
ops: t.IndexedEntryWithSigner<t.CompatibleOperationOrTombstone>[];
|
|
14
|
+
nullified: t.IndexedEntryWithSigner<t.CompatibleOperationOrTombstone>[];
|
|
15
15
|
}>;
|
|
16
16
|
/**
|
|
17
17
|
* Process an indexed entry log by sequentially processing each operation.
|
|
18
18
|
*/
|
|
19
|
-
export declare const processIndexedEntryLog: (did:
|
|
20
|
-
canonical: t.IndexedEntryWithSigner[];
|
|
21
|
-
nullified: t.IndexedEntryWithSigner[];
|
|
19
|
+
export declare const processIndexedEntryLog: (did: `did:plc:${string}`, ops: t.IndexedEntryLog) => Promise<{
|
|
20
|
+
canonical: t.IndexedEntryWithSigner<t.CompatibleOperationOrTombstone>[];
|
|
21
|
+
nullified: t.IndexedEntryWithSigner<t.CompatibleOperationOrTombstone>[];
|
|
22
22
|
}>;
|
|
23
23
|
/**
|
|
24
24
|
* Check whether an operation can still be disputed
|
|
25
25
|
*/
|
|
26
|
-
export declare const isDisputePeriodActive: (disputed: t.IndexedEntry
|
|
26
|
+
export declare const isDisputePeriodActive: (disputed: t.IndexedEntry<t.CompatibleOperationOrTombstone>, now?: number) => boolean;
|
|
27
27
|
/**
|
|
28
28
|
* Check if a key is authorized to dispute an operation
|
|
29
29
|
*/
|
|
30
|
-
export declare const isAuthorizedForDispute: (base: t.IndexedEntryWithSigner<t.CompatibleOperation>, disputed: t.IndexedEntryWithSigner
|
|
30
|
+
export declare const isAuthorizedForDispute: (base: t.IndexedEntryWithSigner<t.CompatibleOperation>, disputed: t.IndexedEntryWithSigner<t.CompatibleOperationOrTombstone>, key: `did:key:${string}`) => boolean;
|
|
31
31
|
export interface DisputeCandidate {
|
|
32
32
|
base: t.IndexedEntryWithSigner<t.CompatibleOperation>;
|
|
33
33
|
disputed: t.IndexedEntryWithSigner;
|
|
@@ -35,5 +35,5 @@ export interface DisputeCandidate {
|
|
|
35
35
|
/**
|
|
36
36
|
* Finds operations that can be disputed by a given key
|
|
37
37
|
*/
|
|
38
|
-
export declare const getDisputeCandidates: (canonical: t.IndexedEntryWithSigner[], key:
|
|
38
|
+
export declare const getDisputeCandidates: (canonical: t.IndexedEntryWithSigner<t.CompatibleOperationOrTombstone>[], key: `did:key:${string}`) => DisputeCandidate[];
|
|
39
39
|
//# sourceMappingURL=data.d.ts.map
|
package/dist/data.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../lib/data.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../lib/data.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,CAAC,MAAM,YAAY,CAAC;AAehC;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,gDAiG9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;EAsJ/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB;;;EAiBlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,uFAGjC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,oKAelC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACtD,QAAQ,EAAE,CAAC,CAAC,sBAAsB,CAAC;CACnC;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,2HAoBhC,CAAC"}
|
package/dist/data.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import * as CBOR from '@atcute/cbor';
|
|
2
2
|
import * as CID from '@atcute/cid';
|
|
3
3
|
import { isKeyDid } from '@atcute/identity';
|
|
4
|
-
import { toBase32 } from '@atcute/multibase';
|
|
5
|
-
import { toSha256 } from '@atcute/uint8array';
|
|
6
4
|
import { DISPUTE_WINDOW } from './constants.js';
|
|
7
5
|
import * as err from './errors.js';
|
|
8
6
|
import * as t from './types.js';
|
|
9
|
-
import { isSignedOperationValid, normalizeOp } from './utils.js';
|
|
7
|
+
import { deriveDidFromGenesisOp, isSignedOperationValid, normalizeOp } from './utils.js';
|
|
10
8
|
// soft constraint limits for incoming operations
|
|
11
9
|
const MAX_OP_BYTES = 4000;
|
|
12
10
|
const MAX_AKA_ENTRIES = 10;
|
|
@@ -113,11 +111,11 @@ export const processIndexedEntry = async (did, canonical, proposed) => {
|
|
|
113
111
|
}
|
|
114
112
|
// Check if CID and DID matches
|
|
115
113
|
{
|
|
116
|
-
const
|
|
117
|
-
const expectedDid = `did:plc:${toBase32(await toSha256(opBytes)).slice(0, 24)}`;
|
|
114
|
+
const expectedDid = await deriveDidFromGenesisOp(proposed.operation);
|
|
118
115
|
if (expectedDid !== did) {
|
|
119
116
|
throw new err.GenesisHashError(proposed, did);
|
|
120
117
|
}
|
|
118
|
+
const opBytes = CBOR.encode(proposed.operation);
|
|
121
119
|
const expectedCid = CID.toString(await CID.create(CID.CODEC_DCBOR, opBytes));
|
|
122
120
|
if (expectedCid !== proposed.cid) {
|
|
123
121
|
throw new err.InvalidHashError(proposed, expectedCid);
|
package/dist/data.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.js","sourceRoot":"","sources":["../lib/data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,cAAc,CAAC;AACrC,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"data.js","sourceRoot":"","sources":["../lib/data.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,YAAY,CAAC;AAEhC,qBAAa,QAAS,SAAQ,KAAK;IACzB,IAAI,SAAc;CAC3B;AAED,qBAAa,sBAAuB,SAAQ,QAAQ;IAI3C,SAAS,EAAE,CAAC,CAAC,YAAY;IACzB,MAAM,EAAE,MAAM;IAJb,IAAI,SAA4B;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,YAAY,CAAC;AAEhC,qBAAa,QAAS,SAAQ,KAAK;IACzB,IAAI,SAAc;CAC3B;AAED,qBAAa,sBAAuB,SAAQ,QAAQ;IAI3C,SAAS,EAAE,CAAC,CAAC,YAAY;IACzB,MAAM,EAAE,MAAM;IAJb,IAAI,SAA4B;IAEzC,YACQ,SAAS,EAAE,CAAC,CAAC,YAAY,EACzB,MAAM,EAAE,MAAM,EAGrB;CACD;AAED,qBAAa,qBAAsB,SAAQ,QAAQ;IAG/B,SAAS,EAAE,CAAC,CAAC,YAAY;IAFnC,IAAI,SAA2B;IAExC,YAAmB,SAAS,EAAE,CAAC,CAAC,YAAY,EAE3C;CACD;AAED,qBAAa,gBAAiB,SAAQ,QAAQ;IAIrC,SAAS,EAAE,CAAC,CAAC,YAAY;IACzB,QAAQ,EAAE,MAAM;IAJf,IAAI,SAAsB;IAEnC,YACQ,SAAS,EAAE,CAAC,CAAC,YAAY,EACzB,QAAQ,EAAE,MAAM,EAGvB;CACD;AAED,qBAAa,gBAAiB,SAAQ,QAAQ;IAIrC,SAAS,EAAE,CAAC,CAAC,YAAY;IACzB,GAAG,EAAE,CAAC,CAAC,YAAY;IAJlB,IAAI,SAAsB;IAEnC,YACQ,SAAS,EAAE,CAAC,CAAC,YAAY,EACzB,GAAG,EAAE,CAAC,CAAC,YAAY,EAG1B;CACD;AAED,qBAAa,gBAAiB,SAAQ,QAAQ;IAIrC,SAAS,EAAE,CAAC,CAAC,YAAY;IACzB,MAAM,EAAE,MAAM;IAJb,IAAI,SAAsB;IAEnC,YACQ,SAAS,EAAE,CAAC,CAAC,YAAY,EACzB,MAAM,EAAE,MAAM,EAGrB;CACD"}
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,YAAY,CAAC;AAEhC,MAAM,OAAO,QAAS,SAAQ,KAAK;IACzB,IAAI,GAAG,UAAU,CAAC;CAC3B;AAED,MAAM,OAAO,sBAAuB,SAAQ,QAAQ;IAI3C;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,YAAY,CAAC;AAEhC,MAAM,OAAO,QAAS,SAAQ,KAAK;IACzB,IAAI,GAAG,UAAU,CAAC;CAC3B;AAED,MAAM,OAAO,sBAAuB,SAAQ,QAAQ;IAI3C,SAAS;IACT,MAAM;IAJL,IAAI,GAAG,wBAAwB,CAAC;IAEzC,YACQ,SAAyB,EACzB,MAAc,EACpB;QACD,KAAK,CAAC,2BAA2B,SAAS,CAAC,GAAG,YAAY,MAAM,EAAE,CAAC,CAAC;yBAH7D,SAAS;sBACT,MAAM;IAEuD,CACpE;CACD;AAED,MAAM,OAAO,qBAAsB,SAAQ,QAAQ;IAG/B,SAAS;IAFnB,IAAI,GAAG,uBAAuB,CAAC;IAExC,YAAmB,SAAyB,EAAE;QAC7C,KAAK,CAAC,0BAA0B,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;yBAD/B,SAAS;IACsB,CACjD;CACD;AAED,MAAM,OAAO,gBAAiB,SAAQ,QAAQ;IAIrC,SAAS;IACT,QAAQ;IAJP,IAAI,GAAG,kBAAkB,CAAC;IAEnC,YACQ,SAAyB,EACzB,QAAgB,EACtB;QACD,KAAK,CAAC,0BAA0B,QAAQ,SAAS,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;yBAH3D,SAAS;wBACT,QAAQ;IAEmD,CAClE;CACD;AAED,MAAM,OAAO,gBAAiB,SAAQ,QAAQ;IAIrC,SAAS;IACT,GAAG;IAJF,IAAI,GAAG,kBAAkB,CAAC;IAEnC,YACQ,SAAyB,EACzB,GAAmB,EACzB;QACD,KAAK,CAAC,iCAAiC,GAAG,SAAS,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;yBAH7D,SAAS;mBACT,GAAG;IAE0D,CACpE;CACD;AAED,MAAM,OAAO,gBAAiB,SAAQ,QAAQ;IAIrC,SAAS;IACT,MAAM;IAJL,IAAI,GAAG,kBAAkB,CAAC;IAEnC,YACQ,SAAyB,EACzB,MAAc,EACpB;QACD,KAAK,CAAC,oDAAoD,SAAS,CAAC,GAAG,YAAY,MAAM,EAAE,CAAC,CAAC;yBAHtF,SAAS;sBACT,MAAM;IAEgF,CAC7F;CACD"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,cAAc,YAAY,CAAC;AAE3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,cAAc,YAAY,CAAC;AAE3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,cAAc,YAAY,CAAC;AAE3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,cAAc,YAAY,CAAC;AAE3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
package/dist/typedefs.d.ts
CHANGED
|
@@ -16,4 +16,6 @@ export declare const operationOrTombstone: v.Type<t.OperationOrTombstone>;
|
|
|
16
16
|
export declare const operationLog: v.Type<t.OperationLog>;
|
|
17
17
|
export declare const indexedEntry: v.Type<t.IndexedEntry>;
|
|
18
18
|
export declare const indexedEntryLog: v.Type<t.IndexedEntryLog>;
|
|
19
|
+
export declare const plcState: v.Type<t.PlcState>;
|
|
20
|
+
export declare const sequencedEntry: v.Type<t.SequencedEntry>;
|
|
19
21
|
//# sourceMappingURL=typedefs.d.ts.map
|
package/dist/typedefs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typedefs.d.ts","sourceRoot":"","sources":["../lib/typedefs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAMpC,OAAO,KAAK,CAAC,MAAM,YAAY,CAAC;AAGhC,eAAO,MAAM,YAAY,6BAAmD,CAAC;AAE7E,eAAO,MAAM,sBAAsB,6BAAmD,CAAC;AAEvF,eAAO,MAAM,YAAY,6BAYvB,CAAC;AAuBH,eAAO,MAAM,6BAA6B,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,6BAA6B,CACnD,CAAC;AAEhC,eAAO,MAAM,qBAAqB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAEhE,CAAC;AAIH,eAAO,MAAM,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAGpC,CAAC;AAWH,eAAO,MAAM,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAsB,CAAC;AAEjF,eAAO,MAAM,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAExC,CAAC;AASH,eAAO,MAAM,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAsB,CAAC;AAEjF,eAAO,MAAM,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAExC,CAAC;AAIH,eAAO,MAAM,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAA6C,CAAC;AAE5G,eAAO,MAAM,8BAA8B,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,8BAA8B,CAInF,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAiC,CAAC;AAElG,eAAO,MAAM,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAET,CAAC;AAYxC,eAAO,MAAM,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAiB,CAAC;AAElE,eAAO,MAAM,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAEsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"typedefs.d.ts","sourceRoot":"","sources":["../lib/typedefs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAMpC,OAAO,KAAK,CAAC,MAAM,YAAY,CAAC;AAGhC,eAAO,MAAM,YAAY,6BAAmD,CAAC;AAE7E,eAAO,MAAM,sBAAsB,6BAAmD,CAAC;AAEvF,eAAO,MAAM,YAAY,6BAYvB,CAAC;AAuBH,eAAO,MAAM,6BAA6B,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,6BAA6B,CACnD,CAAC;AAEhC,eAAO,MAAM,qBAAqB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAEhE,CAAC;AAIH,eAAO,MAAM,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAGpC,CAAC;AAWH,eAAO,MAAM,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAsB,CAAC;AAEjF,eAAO,MAAM,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAExC,CAAC;AASH,eAAO,MAAM,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAsB,CAAC;AAEjF,eAAO,MAAM,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAExC,CAAC;AAIH,eAAO,MAAM,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAA6C,CAAC;AAE5G,eAAO,MAAM,8BAA8B,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,8BAA8B,CAInF,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAiC,CAAC;AAElG,eAAO,MAAM,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAET,CAAC;AAYxC,eAAO,MAAM,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAiB,CAAC;AAElE,eAAO,MAAM,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAEsB,CAAC;AAI7E,eAAO,MAAM,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAMtC,CAAC;AAEH,eAAO,MAAM,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAGlD,CAAC"}
|
package/dist/typedefs.js
CHANGED
|
@@ -91,4 +91,17 @@ export const indexedEntryLog = v
|
|
|
91
91
|
.tuple([_indexedEntry.extend({ operation: compatibleOperation })])
|
|
92
92
|
.concat(v.array(_indexedEntry.extend({ operation: operationOrTombstone })));
|
|
93
93
|
// #endregion
|
|
94
|
+
// #region Client response schemas
|
|
95
|
+
export const plcState = v.object({
|
|
96
|
+
did: didPlcString,
|
|
97
|
+
rotationKeys: v.array(didKeyString),
|
|
98
|
+
verificationMethods: v.record(permissiveDidKeyString),
|
|
99
|
+
alsoKnownAs: v.array(v.string()),
|
|
100
|
+
services: v.record(service),
|
|
101
|
+
});
|
|
102
|
+
export const sequencedEntry = _indexedEntry.extend({
|
|
103
|
+
type: v.literal('sequenced_op'),
|
|
104
|
+
seq: v.number(),
|
|
105
|
+
});
|
|
106
|
+
// #endregion
|
|
94
107
|
//# sourceMappingURL=typedefs.js.map
|
package/dist/typedefs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typedefs.js","sourceRoot":"","sources":["../lib/typedefs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAEpC,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,KAAK,CAAC,MAAM,YAAY,CAAC;AAEhC,kBAAkB;AAClB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;AAE7E,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;AAEvF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"typedefs.js","sourceRoot":"","sources":["../lib/typedefs.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -53,4 +53,21 @@ export type IndexedEntryLog = [
|
|
|
53
53
|
genesis: IndexedEntry<CompatibleOperation>,
|
|
54
54
|
...IndexedEntry<OperationOrTombstone>[]
|
|
55
55
|
];
|
|
56
|
+
/**
|
|
57
|
+
* current identity state derived from the did:plc operation log
|
|
58
|
+
*/
|
|
59
|
+
export interface PlcState {
|
|
60
|
+
did: DidPlcString;
|
|
61
|
+
rotationKeys: DidKeyString[];
|
|
62
|
+
verificationMethods: Record<string, DidKeyString>;
|
|
63
|
+
alsoKnownAs: string[];
|
|
64
|
+
services: Record<string, Service>;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* operation entry with sequence number from /export endpoint
|
|
68
|
+
*/
|
|
69
|
+
export interface SequencedEntry extends IndexedEntry {
|
|
70
|
+
type: 'sequenced_op';
|
|
71
|
+
seq: number;
|
|
72
|
+
}
|
|
56
73
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAEnD,MAAM,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;AAEtC,MAAM,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;AAEtC,MAAM,WAAW,6BAA6B;IAC7C,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,YAAY,CAAC;IACzB,WAAW,EAAE,YAAY,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAsB,SAAQ,6BAA6B;IAC3E,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,OAAO;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAClD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,SAAU,SAAQ,iBAAiB;IACnD,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,SAAU,SAAQ,iBAAiB;IACnD,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,qBAAqB,CAAC;AAEpE,MAAM,MAAM,8BAA8B,GAAG,mBAAmB,GAAG,SAAS,CAAC;AAE7E,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,SAAS,CAAC;AAEzD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG,oBAAoB,EAAE,CAAC,CAAC;AAErF,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,8BAA8B,GAAG,8BAA8B;IACtG,GAAG,EAAE,YAAY,CAAC;IAClB,SAAS,EAAE,CAAC,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB,CACtC,CAAC,SAAS,8BAA8B,GAAG,8BAA8B,CACxE,SAAQ,YAAY,CAAC,CAAC,CAAC;IACxB,cAAc,EAAE,YAAY,EAAE,CAAC;IAC/B,QAAQ,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,YAAY,CAAC,mBAAmB,CAAC;IAC1C,GAAG,YAAY,CAAC,oBAAoB,CAAC,EAAE;CACvC,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAEnD,MAAM,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;AAEtC,MAAM,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;AAEtC,MAAM,WAAW,6BAA6B;IAC7C,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,YAAY,CAAC;IACzB,WAAW,EAAE,YAAY,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAsB,SAAQ,6BAA6B;IAC3E,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,OAAO;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAClD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,SAAU,SAAQ,iBAAiB;IACnD,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,SAAU,SAAQ,iBAAiB;IACnD,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,qBAAqB,CAAC;AAEpE,MAAM,MAAM,8BAA8B,GAAG,mBAAmB,GAAG,SAAS,CAAC;AAE7E,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,SAAS,CAAC;AAEzD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG,oBAAoB,EAAE,CAAC,CAAC;AAErF,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,8BAA8B,GAAG,8BAA8B;IACtG,GAAG,EAAE,YAAY,CAAC;IAClB,SAAS,EAAE,CAAC,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB,CACtC,CAAC,SAAS,8BAA8B,GAAG,8BAA8B,CACxE,SAAQ,YAAY,CAAC,CAAC,CAAC;IACxB,cAAc,EAAE,YAAY,EAAE,CAAC;IAC/B,QAAQ,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,YAAY,CAAC,mBAAmB,CAAC;IAC1C,GAAG,YAAY,CAAC,oBAAoB,CAAC,EAAE;CACvC,CAAC;AAIF;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB,GAAG,EAAE,YAAY,CAAC;IAClB,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAClD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,YAAY;IACnD,IAAI,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACZ"}
|
package/dist/types.js
CHANGED
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":";AA+FA,aAAa"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,6 +1,27 @@
|
|
|
1
|
+
import type { PrivateKey } from '@atcute/crypto';
|
|
1
2
|
import * as t from './types.js';
|
|
2
3
|
export declare const wrapHttpPrefix: (str: string) => string;
|
|
3
4
|
export declare const wrapAtprotoPrefix: (str: string) => string;
|
|
5
|
+
/**
|
|
6
|
+
* derives the did:plc identifier from a genesis operation
|
|
7
|
+
* @param op signed genesis operation
|
|
8
|
+
* @returns the did:plc string
|
|
9
|
+
*/
|
|
10
|
+
export declare const deriveDidFromGenesisOp: (op: t.CompatibleOperation) => Promise<`did:plc:${string}`>;
|
|
4
11
|
export declare const normalizeOp: (op: t.CompatibleOperation) => t.Operation;
|
|
5
|
-
export declare const isSignedOperationValid: (allowedKeys:
|
|
12
|
+
export declare const isSignedOperationValid: (allowedKeys: `did:key:${string}`[], op: t.CompatibleOperationOrTombstone) => Promise<`did:key:${string}` | null>;
|
|
13
|
+
/**
|
|
14
|
+
* signs an unsigned plc operation
|
|
15
|
+
* @param op unsigned operation to sign
|
|
16
|
+
* @param key private key to sign with (must be one of the rotation keys)
|
|
17
|
+
* @returns signed operation
|
|
18
|
+
*/
|
|
19
|
+
export declare const signOperation: (op: t.UnsignedOperation, key: PrivateKey) => Promise<t.Operation>;
|
|
20
|
+
/**
|
|
21
|
+
* signs an unsigned plc tombstone
|
|
22
|
+
* @param op unsigned tombstone to sign
|
|
23
|
+
* @param key private key to sign with (must be one of the rotation keys)
|
|
24
|
+
* @returns signed tombstone
|
|
25
|
+
*/
|
|
26
|
+
export declare const signTombstone: (op: t.UnsignedTombstone, key: PrivateKey) => Promise<t.Tombstone>;
|
|
6
27
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../lib/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../lib/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKjD,OAAO,KAAK,CAAC,MAAM,YAAY,CAAC;AAEhC,eAAO,MAAM,cAAc,yBAM1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,yBAQ7B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,6DAIlC,CAAC;AAEF,eAAO,MAAM,WAAW,4CAqBvB,CAAC;AAEF,eAAO,MAAM,sBAAsB,mHAkBlC,CAAC;AAIF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,oEAKzB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,oEAKzB,CAAC"}
|
package/dist/utils.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as CBOR from '@atcute/cbor';
|
|
2
2
|
import { verifySigWithDidKey } from '@atcute/crypto';
|
|
3
|
-
import { fromBase64Url } from '@atcute/multibase';
|
|
3
|
+
import { fromBase64Url, toBase32, toBase64Url } from '@atcute/multibase';
|
|
4
|
+
import { toSha256 } from '@atcute/uint8array';
|
|
4
5
|
import * as t from './types.js';
|
|
5
6
|
export const wrapHttpPrefix = (str) => {
|
|
6
7
|
if (str.startsWith('http://') || str.startsWith('https://')) {
|
|
@@ -15,6 +16,16 @@ export const wrapAtprotoPrefix = (str) => {
|
|
|
15
16
|
const stripped = str.replace('http://', '').replace('https://', '');
|
|
16
17
|
return `at://${stripped}`;
|
|
17
18
|
};
|
|
19
|
+
/**
|
|
20
|
+
* derives the did:plc identifier from a genesis operation
|
|
21
|
+
* @param op signed genesis operation
|
|
22
|
+
* @returns the did:plc string
|
|
23
|
+
*/
|
|
24
|
+
export const deriveDidFromGenesisOp = async (op) => {
|
|
25
|
+
const opBytes = CBOR.encode(op);
|
|
26
|
+
const hash = await toSha256(opBytes);
|
|
27
|
+
return `did:plc:${toBase32(hash).slice(0, 24)}`;
|
|
28
|
+
};
|
|
18
29
|
export const normalizeOp = (op) => {
|
|
19
30
|
if (op.type === 'create') {
|
|
20
31
|
return {
|
|
@@ -48,4 +59,28 @@ export const isSignedOperationValid = async (allowedKeys, op) => {
|
|
|
48
59
|
}
|
|
49
60
|
return null;
|
|
50
61
|
};
|
|
62
|
+
// #region signing operations
|
|
63
|
+
/**
|
|
64
|
+
* signs an unsigned plc operation
|
|
65
|
+
* @param op unsigned operation to sign
|
|
66
|
+
* @param key private key to sign with (must be one of the rotation keys)
|
|
67
|
+
* @returns signed operation
|
|
68
|
+
*/
|
|
69
|
+
export const signOperation = async (op, key) => {
|
|
70
|
+
const data = CBOR.encode(op);
|
|
71
|
+
const sig = await key.sign(data);
|
|
72
|
+
return { ...op, sig: toBase64Url(sig) };
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* signs an unsigned plc tombstone
|
|
76
|
+
* @param op unsigned tombstone to sign
|
|
77
|
+
* @param key private key to sign with (must be one of the rotation keys)
|
|
78
|
+
* @returns signed tombstone
|
|
79
|
+
*/
|
|
80
|
+
export const signTombstone = async (op, key) => {
|
|
81
|
+
const data = CBOR.encode(op);
|
|
82
|
+
const sig = await key.sign(data);
|
|
83
|
+
return { ...op, sig: toBase64Url(sig) };
|
|
84
|
+
};
|
|
85
|
+
// #endregion
|
|
51
86
|
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../lib/utils.ts"],"names":[],"mappings":"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"}
|
package/lib/client.ts
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import type { DidDocument } from '@atcute/identity';
|
|
2
|
+
import { defs as identityDefs } from '@atcute/identity';
|
|
3
|
+
import { FailedResponseError, isResponseOk, parseResponseAsJson, pipe, validateJsonWith } from '@atcute/util-fetch';
|
|
4
|
+
|
|
5
|
+
import * as defs from './typedefs.js';
|
|
6
|
+
import * as t from './types.js';
|
|
7
|
+
|
|
8
|
+
const MAX_RESPONSE_SIZE = 64 * 1024;
|
|
9
|
+
|
|
10
|
+
const handleDocument = pipe(
|
|
11
|
+
isResponseOk,
|
|
12
|
+
parseResponseAsJson(/^application\/(did\+ld\+)?json$/, MAX_RESPONSE_SIZE),
|
|
13
|
+
validateJsonWith(identityDefs.didDocument, { mode: 'passthrough' }),
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
const handlePlcState = pipe(
|
|
17
|
+
isResponseOk,
|
|
18
|
+
parseResponseAsJson(/^application\/json$/, MAX_RESPONSE_SIZE),
|
|
19
|
+
validateJsonWith(defs.plcState, { mode: 'passthrough' }),
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
const handleOperationLog = pipe(
|
|
23
|
+
isResponseOk,
|
|
24
|
+
parseResponseAsJson(/^application\/json$/, MAX_RESPONSE_SIZE),
|
|
25
|
+
validateJsonWith(defs.operationLog, { mode: 'passthrough' }),
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
const handleIndexedEntryLog = pipe(
|
|
29
|
+
isResponseOk,
|
|
30
|
+
parseResponseAsJson(/^application\/json$/, MAX_RESPONSE_SIZE),
|
|
31
|
+
validateJsonWith(defs.indexedEntryLog, { mode: 'passthrough' }),
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const handleLastOperation = pipe(
|
|
35
|
+
isResponseOk,
|
|
36
|
+
parseResponseAsJson(/^application\/json$/, MAX_RESPONSE_SIZE),
|
|
37
|
+
validateJsonWith(defs.compatibleOperationOrTombstone, { mode: 'passthrough' }),
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
export interface PlcClientOptions {
|
|
41
|
+
/** plc directory URL, defaults to https://plc.directory */
|
|
42
|
+
serviceUrl?: string;
|
|
43
|
+
/** custom fetch function */
|
|
44
|
+
fetch?: typeof globalThis.fetch;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface PlcRequestOptions {
|
|
48
|
+
signal?: AbortSignal;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* client for interacting with plc.directory
|
|
53
|
+
*/
|
|
54
|
+
export class PlcClient {
|
|
55
|
+
readonly serviceUrl: string;
|
|
56
|
+
#fetch: typeof globalThis.fetch;
|
|
57
|
+
|
|
58
|
+
constructor({ serviceUrl = 'https://plc.directory', fetch: fetchFn = fetch }: PlcClientOptions = {}) {
|
|
59
|
+
this.serviceUrl = serviceUrl;
|
|
60
|
+
this.#fetch = fetchFn;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* fetches the DID document for a did:plc
|
|
65
|
+
* @param did the did:plc identifier
|
|
66
|
+
* @param options request options
|
|
67
|
+
* @returns the DID document
|
|
68
|
+
*/
|
|
69
|
+
async getDocument(did: t.DidPlcString, options?: PlcRequestOptions): Promise<DidDocument> {
|
|
70
|
+
const url = new URL(`/${encodeURIComponent(did)}`, this.serviceUrl);
|
|
71
|
+
|
|
72
|
+
const response = await this.#fetch(url, {
|
|
73
|
+
signal: options?.signal,
|
|
74
|
+
headers: { accept: 'application/did+ld+json,application/json' },
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const { json } = await handleDocument(response);
|
|
78
|
+
return json;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* fetches the current identity state for a did:plc
|
|
83
|
+
* @param did the did:plc identifier
|
|
84
|
+
* @param options request options
|
|
85
|
+
* @returns the current plc state
|
|
86
|
+
*/
|
|
87
|
+
async getState(did: t.DidPlcString, options?: PlcRequestOptions): Promise<t.PlcState> {
|
|
88
|
+
const url = new URL(`/${encodeURIComponent(did)}/data`, this.serviceUrl);
|
|
89
|
+
|
|
90
|
+
const response = await this.#fetch(url, {
|
|
91
|
+
signal: options?.signal,
|
|
92
|
+
headers: { accept: 'application/json' },
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
const { json } = await handlePlcState(response);
|
|
96
|
+
return json;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* fetches the operation log for a did:plc
|
|
101
|
+
* @param did the did:plc identifier
|
|
102
|
+
* @param options request options
|
|
103
|
+
* @returns the operation log
|
|
104
|
+
*/
|
|
105
|
+
async getOperationLog(did: t.DidPlcString, options?: PlcRequestOptions): Promise<t.OperationLog> {
|
|
106
|
+
const url = new URL(`/${encodeURIComponent(did)}/log`, this.serviceUrl);
|
|
107
|
+
|
|
108
|
+
const response = await this.#fetch(url, {
|
|
109
|
+
signal: options?.signal,
|
|
110
|
+
headers: { accept: 'application/json' },
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
const { json } = await handleOperationLog(response);
|
|
114
|
+
return json;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* fetches the auditable log for a did:plc (includes CIDs and timestamps)
|
|
119
|
+
* @param did the did:plc identifier
|
|
120
|
+
* @param options request options
|
|
121
|
+
* @returns the indexed entry log
|
|
122
|
+
*/
|
|
123
|
+
async getAuditLog(did: t.DidPlcString, options?: PlcRequestOptions): Promise<t.IndexedEntryLog> {
|
|
124
|
+
const url = new URL(`/${encodeURIComponent(did)}/log/audit`, this.serviceUrl);
|
|
125
|
+
|
|
126
|
+
const response = await this.#fetch(url, {
|
|
127
|
+
signal: options?.signal,
|
|
128
|
+
headers: { accept: 'application/json' },
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
const { json } = await handleIndexedEntryLog(response);
|
|
132
|
+
return json;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* fetches the last operation for a did:plc
|
|
137
|
+
* @param did the did:plc identifier
|
|
138
|
+
* @param options request options
|
|
139
|
+
* @returns the last operation or tombstone
|
|
140
|
+
*/
|
|
141
|
+
async getLastOperation(
|
|
142
|
+
did: t.DidPlcString,
|
|
143
|
+
options?: PlcRequestOptions,
|
|
144
|
+
): Promise<t.CompatibleOperationOrTombstone> {
|
|
145
|
+
const url = new URL(`/${encodeURIComponent(did)}/log/last`, this.serviceUrl);
|
|
146
|
+
|
|
147
|
+
const response = await this.#fetch(url, {
|
|
148
|
+
signal: options?.signal,
|
|
149
|
+
headers: { accept: 'application/json' },
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
const { json } = await handleLastOperation(response);
|
|
153
|
+
return json;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* submits a signed operation to plc.directory
|
|
158
|
+
* @param did the did:plc identifier
|
|
159
|
+
* @param operation the signed operation to submit
|
|
160
|
+
* @param options request options
|
|
161
|
+
*/
|
|
162
|
+
async submitOperation(
|
|
163
|
+
did: t.DidPlcString,
|
|
164
|
+
operation: t.OperationOrTombstone,
|
|
165
|
+
options?: PlcRequestOptions,
|
|
166
|
+
): Promise<void> {
|
|
167
|
+
const url = new URL(`/${encodeURIComponent(did)}`, this.serviceUrl);
|
|
168
|
+
|
|
169
|
+
const response = await this.#fetch(url, {
|
|
170
|
+
method: 'POST',
|
|
171
|
+
signal: options?.signal,
|
|
172
|
+
headers: { 'content-type': 'application/json' },
|
|
173
|
+
body: JSON.stringify(operation),
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
if (!response.ok) {
|
|
177
|
+
throw new FailedResponseError(response);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* checks if the plc directory is reachable
|
|
183
|
+
* @param options request options
|
|
184
|
+
* @returns true if reachable
|
|
185
|
+
*/
|
|
186
|
+
async ping(options?: PlcRequestOptions): Promise<boolean> {
|
|
187
|
+
const url = new URL('/_health', this.serviceUrl);
|
|
188
|
+
|
|
189
|
+
const response = await this.#fetch(url, {
|
|
190
|
+
signal: options?.signal,
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
return response.ok;
|
|
194
|
+
}
|
|
195
|
+
}
|
package/lib/data.ts
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import * as CBOR from '@atcute/cbor';
|
|
2
2
|
import * as CID from '@atcute/cid';
|
|
3
3
|
import { isKeyDid } from '@atcute/identity';
|
|
4
|
-
import { toBase32 } from '@atcute/multibase';
|
|
5
|
-
import { toSha256 } from '@atcute/uint8array';
|
|
6
4
|
|
|
7
5
|
import { DISPUTE_WINDOW } from './constants.js';
|
|
8
6
|
import * as err from './errors.js';
|
|
9
7
|
import * as t from './types.js';
|
|
10
|
-
import { isSignedOperationValid, normalizeOp } from './utils.js';
|
|
8
|
+
import { deriveDidFromGenesisOp, isSignedOperationValid, normalizeOp } from './utils.js';
|
|
11
9
|
|
|
12
10
|
// soft constraint limits for incoming operations
|
|
13
11
|
const MAX_OP_BYTES = 4000;
|
|
@@ -148,13 +146,12 @@ export const processIndexedEntry = async (
|
|
|
148
146
|
|
|
149
147
|
// Check if CID and DID matches
|
|
150
148
|
{
|
|
151
|
-
const
|
|
152
|
-
|
|
153
|
-
const expectedDid = `did:plc:${toBase32(await toSha256(opBytes)).slice(0, 24)}`;
|
|
149
|
+
const expectedDid = await deriveDidFromGenesisOp(proposed.operation);
|
|
154
150
|
if (expectedDid !== did) {
|
|
155
151
|
throw new err.GenesisHashError(proposed, did);
|
|
156
152
|
}
|
|
157
153
|
|
|
154
|
+
const opBytes = CBOR.encode(proposed.operation);
|
|
158
155
|
const expectedCid = CID.toString(await CID.create(CID.CODEC_DCBOR, opBytes));
|
|
159
156
|
if (expectedCid !== proposed.cid) {
|
|
160
157
|
throw new err.InvalidHashError(proposed, expectedCid);
|
package/lib/index.ts
CHANGED
package/lib/typedefs.ts
CHANGED
|
@@ -120,3 +120,18 @@ export const indexedEntryLog: v.Type<t.IndexedEntryLog> = v
|
|
|
120
120
|
.tuple([_indexedEntry.extend({ operation: compatibleOperation })])
|
|
121
121
|
.concat(v.array(_indexedEntry.extend({ operation: operationOrTombstone })));
|
|
122
122
|
// #endregion
|
|
123
|
+
|
|
124
|
+
// #region Client response schemas
|
|
125
|
+
export const plcState: v.Type<t.PlcState> = v.object({
|
|
126
|
+
did: didPlcString,
|
|
127
|
+
rotationKeys: v.array(didKeyString),
|
|
128
|
+
verificationMethods: v.record(permissiveDidKeyString),
|
|
129
|
+
alsoKnownAs: v.array(v.string()),
|
|
130
|
+
services: v.record(service),
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
export const sequencedEntry: v.Type<t.SequencedEntry> = _indexedEntry.extend({
|
|
134
|
+
type: v.literal('sequenced_op'),
|
|
135
|
+
seq: v.number(),
|
|
136
|
+
});
|
|
137
|
+
// #endregion
|
package/lib/types.ts
CHANGED
|
@@ -71,3 +71,26 @@ export type IndexedEntryLog = [
|
|
|
71
71
|
genesis: IndexedEntry<CompatibleOperation>,
|
|
72
72
|
...IndexedEntry<OperationOrTombstone>[],
|
|
73
73
|
];
|
|
74
|
+
|
|
75
|
+
// #region client response types
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* current identity state derived from the did:plc operation log
|
|
79
|
+
*/
|
|
80
|
+
export interface PlcState {
|
|
81
|
+
did: DidPlcString;
|
|
82
|
+
rotationKeys: DidKeyString[];
|
|
83
|
+
verificationMethods: Record<string, DidKeyString>;
|
|
84
|
+
alsoKnownAs: string[];
|
|
85
|
+
services: Record<string, Service>;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* operation entry with sequence number from /export endpoint
|
|
90
|
+
*/
|
|
91
|
+
export interface SequencedEntry extends IndexedEntry {
|
|
92
|
+
type: 'sequenced_op';
|
|
93
|
+
seq: number;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// #endregion
|
package/lib/utils.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import * as CBOR from '@atcute/cbor';
|
|
2
|
+
import type { PrivateKey } from '@atcute/crypto';
|
|
2
3
|
import { verifySigWithDidKey } from '@atcute/crypto';
|
|
3
|
-
import { fromBase64Url } from '@atcute/multibase';
|
|
4
|
+
import { fromBase64Url, toBase32, toBase64Url } from '@atcute/multibase';
|
|
5
|
+
import { toSha256 } from '@atcute/uint8array';
|
|
4
6
|
|
|
5
7
|
import * as t from './types.js';
|
|
6
8
|
|
|
@@ -22,6 +24,17 @@ export const wrapAtprotoPrefix = (str: string): string => {
|
|
|
22
24
|
return `at://${stripped}`;
|
|
23
25
|
};
|
|
24
26
|
|
|
27
|
+
/**
|
|
28
|
+
* derives the did:plc identifier from a genesis operation
|
|
29
|
+
* @param op signed genesis operation
|
|
30
|
+
* @returns the did:plc string
|
|
31
|
+
*/
|
|
32
|
+
export const deriveDidFromGenesisOp = async (op: t.CompatibleOperation): Promise<t.DidPlcString> => {
|
|
33
|
+
const opBytes = CBOR.encode(op);
|
|
34
|
+
const hash = await toSha256(opBytes);
|
|
35
|
+
return `did:plc:${toBase32(hash).slice(0, 24)}`;
|
|
36
|
+
};
|
|
37
|
+
|
|
25
38
|
export const normalizeOp = (op: t.CompatibleOperation): t.Operation => {
|
|
26
39
|
if (op.type === 'create') {
|
|
27
40
|
return {
|
|
@@ -64,3 +77,33 @@ export const isSignedOperationValid = async (
|
|
|
64
77
|
|
|
65
78
|
return null;
|
|
66
79
|
};
|
|
80
|
+
|
|
81
|
+
// #region signing operations
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* signs an unsigned plc operation
|
|
85
|
+
* @param op unsigned operation to sign
|
|
86
|
+
* @param key private key to sign with (must be one of the rotation keys)
|
|
87
|
+
* @returns signed operation
|
|
88
|
+
*/
|
|
89
|
+
export const signOperation = async (op: t.UnsignedOperation, key: PrivateKey): Promise<t.Operation> => {
|
|
90
|
+
const data = CBOR.encode(op);
|
|
91
|
+
const sig = await key.sign(data);
|
|
92
|
+
|
|
93
|
+
return { ...op, sig: toBase64Url(sig) };
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* signs an unsigned plc tombstone
|
|
98
|
+
* @param op unsigned tombstone to sign
|
|
99
|
+
* @param key private key to sign with (must be one of the rotation keys)
|
|
100
|
+
* @returns signed tombstone
|
|
101
|
+
*/
|
|
102
|
+
export const signTombstone = async (op: t.UnsignedTombstone, key: PrivateKey): Promise<t.Tombstone> => {
|
|
103
|
+
const data = CBOR.encode(op);
|
|
104
|
+
const sig = await key.sign(data);
|
|
105
|
+
|
|
106
|
+
return { ...op, sig: toBase64Url(sig) };
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// #endregion
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@atcute/did-plc",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.0",
|
|
5
5
|
"description": "validations, type definitions and schemas for did:plc operations",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"atproto",
|
|
@@ -13,6 +13,9 @@
|
|
|
13
13
|
"url": "https://github.com/mary-ext/atcute",
|
|
14
14
|
"directory": "packages/identity/did-plc"
|
|
15
15
|
},
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
16
19
|
"files": [
|
|
17
20
|
"dist/",
|
|
18
21
|
"lib/",
|
|
@@ -24,21 +27,23 @@
|
|
|
24
27
|
},
|
|
25
28
|
"sideEffects": false,
|
|
26
29
|
"devDependencies": {
|
|
27
|
-
"@
|
|
30
|
+
"@vitest/coverage-v8": "^4.0.16",
|
|
31
|
+
"vitest": "^4.0.16"
|
|
28
32
|
},
|
|
29
33
|
"dependencies": {
|
|
30
34
|
"@badrap/valita": "^0.4.6",
|
|
31
|
-
"@atcute/cbor": "^2.2.
|
|
35
|
+
"@atcute/cbor": "^2.2.8",
|
|
32
36
|
"@atcute/cid": "^2.2.6",
|
|
33
|
-
"@atcute/crypto": "^2.
|
|
34
|
-
"@atcute/identity": "^1.1.
|
|
35
|
-
"@atcute/lexicons": "^1.2.
|
|
37
|
+
"@atcute/crypto": "^2.3.0",
|
|
38
|
+
"@atcute/identity": "^1.1.3",
|
|
39
|
+
"@atcute/lexicons": "^1.2.6",
|
|
36
40
|
"@atcute/multibase": "^1.1.6",
|
|
37
|
-
"@atcute/uint8array": "^1.0.
|
|
41
|
+
"@atcute/uint8array": "^1.0.6",
|
|
42
|
+
"@atcute/util-fetch": "^1.0.4"
|
|
38
43
|
},
|
|
39
44
|
"scripts": {
|
|
40
|
-
"build": "
|
|
41
|
-
"test": "
|
|
45
|
+
"build": "tsgo --project tsconfig.build.json",
|
|
46
|
+
"test": "vitest",
|
|
42
47
|
"prepublish": "rm -rf dist; pnpm run build"
|
|
43
48
|
}
|
|
44
49
|
}
|