@metalabel/dfos-client 0.50.0 → 0.51.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 +5 -5
- package/dist/api-auth.d.ts +1 -1
- package/dist/api-auth.js +2 -2
- package/dist/index.d.ts +4 -4
- package/dist/index.js +31 -13
- package/dist/{memory-BuTsEPZI.d.ts → memory-Ca1F2EBW.d.ts} +1 -1
- package/dist/siwd.d.ts +6 -6
- package/dist/siwd.js +1 -1
- package/dist/store/index.d.ts +2 -2
- package/dist/{types-BfzEg_gw.d.ts → types-CSKl-wYe.d.ts} +14 -2
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -128,7 +128,7 @@ Three consequences worth knowing before you wire it up:
|
|
|
128
128
|
- **It does not follow redirects** (`redirect: 'manual'`): a 3xx comes back to you as-is, because following it would re-issue the request at coordinates the proof does not cover and carry `X-Credential` to whatever authority the `Location` names.
|
|
129
129
|
- **It buffers the request body before sending.** The proof covers the whole body, so there is nothing to sign until the last octet is in hand — size-bounded requests only. An unbounded or live stream cannot be proof-signed, in any implementation.
|
|
130
130
|
|
|
131
|
-
**A backend that must not proxy uses the decomposed form.** A signing backend fronting a browser describes the one request it is willing to make — never signing coordinates the browser supplies ([
|
|
131
|
+
**A backend that must not proxy uses the decomposed form.** A signing backend fronting a browser describes the one request it is willing to make — never signing coordinates the browser supplies ([INTEGRATIONS § API security notes](https://protocol.dfos.com/integrations#api-security-notes)) — so there is no `Request` for the adapter above to cover:
|
|
132
132
|
|
|
133
133
|
```typescript
|
|
134
134
|
import { buildApiAuthHeaders, signApiRequest } from '@metalabel/dfos-client/api-auth';
|
|
@@ -160,7 +160,7 @@ await verifyApiRequest(client, {
|
|
|
160
160
|
|
|
161
161
|
It throws `ApiRequestVerifyError`, carrying `reason` (`invalid` / `unverifiable` / `config`), `phase`, and the recommended `status` — branch on those, never on message text.
|
|
162
162
|
|
|
163
|
-
`verifyApiIdentityRequest` is the same verifier for the envelope's credential-less sibling, the [identity proof](https://protocol.dfos.com/
|
|
163
|
+
`verifyApiIdentityRequest` is the same verifier for the envelope's credential-less sibling, the [identity proof](https://protocol.dfos.com/integrations#the-identity-proof) — it establishes only which DID is asking, leaving what that DID may do to the resource's own policy.
|
|
164
164
|
|
|
165
165
|
`apiRequestSigningInput(payload)` is the pure byte contract both halves share, and the one place per language the canonical bytes are built.
|
|
166
166
|
|
|
@@ -179,7 +179,7 @@ import {
|
|
|
179
179
|
|
|
180
180
|
Sign In With DFOS. The three verbs above are the relying-party login kit, in the order a login uses them: `createSiwdLoginRequest` mints the challenge and builds the `/authorize` URL to redirect to, `readSiwdCallback` parses what comes back, and `verifySiwd` verifies it — mint → redirect, read → verify. The `expect` object `createSiwdLoginRequest` returns (nonce, domain, and the DID when the challenge is bound to one) is what `verifySiwd` checks against, so the relying party MUST persist it across the redirect: a verifier that takes its expectation from the callback has implemented the check and none of the protection. See [`examples/siwd-demo`](../../examples/siwd-demo) for the reference consumer.
|
|
181
181
|
|
|
182
|
-
The `nonce`/`consumeNonce` pair on the expectation (supply exactly one) maps one field each to the spec's two replay disciplines — which discipline a given scope obliges, and why, is [
|
|
182
|
+
The `nonce`/`consumeNonce` pair on the expectation (supply exactly one) maps one field each to the spec's two replay disciplines — which discipline a given scope obliges, and why, is [INTEGRATIONS § Replay prevention](https://protocol.dfos.com/integrations#replay-prevention)'s argument to make:
|
|
183
183
|
|
|
184
184
|
**`expect.nonce` — flow-bound login.** For a backend granting only a browser session (`scope=identity`), source the expected nonce from state you bound to that browser at mint time — a server-side session, or the nonce sealed under your own key in an `httpOnly` cookie — and compare:
|
|
185
185
|
|
|
@@ -202,7 +202,7 @@ Under either discipline `verifySiwd` checks the nonce at most once, and only aft
|
|
|
202
202
|
|
|
203
203
|
`createSiwdLoginRequest` throws rather than returning an error on the two things that are RP misconfiguration: an `authorizeUrl` or `redirectUri` that is not an absolute URL, and any scope other than `identity` over a loopback redirect that names no client identity.
|
|
204
204
|
|
|
205
|
-
**Loopback redirects** — `http://localhost`, `http://127.0.0.1`, or `http://[::1]`, on any port — come in two shapes: the **anonymous** one (no `client_did`, `scope=identity` only) and the **key-proven** one, the [loopback credential tier](https://protocol.dfos.com/
|
|
205
|
+
**Loopback redirects** — `http://localhost`, `http://127.0.0.1`, or `http://[::1]`, on any port — come in two shapes: the **anonymous** one (no `client_did`, `scope=identity` only) and the **key-proven** one, the [loopback credential tier](https://protocol.dfos.com/integrations#loopback-clients), which is what lets local software receive a credential — the spec defines both. The one integration consequence to know: a credential comes back in the URL **fragment**, which a browser sends to no server — your loopback listener's request line included — so a CLI answers the callback with a small page whose script reads `location.href` and posts the whole URL back, then feeds _that_ to `readSiwdCallback`. A browser relying party just passes `location.href`.
|
|
206
206
|
|
|
207
207
|
```typescript
|
|
208
208
|
import {
|
|
@@ -247,7 +247,7 @@ if (result.kind === 'success') {
|
|
|
247
247
|
}
|
|
248
248
|
```
|
|
249
249
|
|
|
250
|
-
`siwdSigningInput(challenge)` is the pure byte contract both the signer and the verifier share (see [
|
|
250
|
+
`siwdSigningInput(challenge)` is the pure byte contract both the signer and the verifier share (see [INTEGRATIONS.md](../../specs/INTEGRATIONS.md)); `createSiwdChallenge` mints a challenge on its own for a caller building its own redirect; `verifySiwd` is a no-throw verifier that accepts only a current `authKeys` entry of a non-deleted identity.
|
|
251
251
|
|
|
252
252
|
## License
|
|
253
253
|
|
package/dist/api-auth.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { ApiRequestVerifyError, DEFAULT_PROOF_SKEW_SECONDS, DEFAULT_PROOF_WINDOW_SECONDS, DFOS_AUTH_SCHEME, EMPTY_BODY_SHA256, IDENTITY_PROOF_JWS_TYP, IdentityProofPayload, MAX_BODY_BYTES, MAX_PROOF_FRESHNESS_SPAN_SECONDS, MAX_REQUEST_PROOF_SIZE, ProofExtraMembers, REQUEST_PROOF_JWS_TYP, RequestProofFailurePhase, RequestProofFailureReason, RequestProofPayload, SignApiIdentityRequestInput, SignApiRequestInput, apiIdentitySigningInput, apiRequestSigningInput, assertProofVerifierConfig, buildApiAuthHeaders, buildApiIdentityHeaders, parseDfosAuthorization, sha256BodyHash, signApiIdentityRequest, signApiRequest } from '@metalabel/dfos-protocol/credentials';
|
|
2
|
-
import { a as Client } from './types-
|
|
2
|
+
import { a as Client } from './types-CSKl-wYe.js';
|
|
3
3
|
import '@metalabel/dfos-protocol/chain';
|
|
4
4
|
import '@metalabel/dfos-web-relay/peer-client';
|
|
5
5
|
|
package/dist/api-auth.js
CHANGED
|
@@ -132,14 +132,14 @@ var verifyApiRequest = async (client, input) => {
|
|
|
132
132
|
let leaf;
|
|
133
133
|
let chain;
|
|
134
134
|
try {
|
|
135
|
-
leaf = await verifyDFOSCredential(input.credential, { resolveIdentity, now });
|
|
135
|
+
leaf = await verifyDFOSCredential(input.credential, { resolveIdentity, nowUnix: now });
|
|
136
136
|
if (await isRevoked(leaf.iss, leaf.credentialCID)) {
|
|
137
137
|
throw new CredentialVerificationError("credential is revoked");
|
|
138
138
|
}
|
|
139
139
|
const verifiedChain = await verifyDelegationChain(leaf, {
|
|
140
140
|
resolveIdentity,
|
|
141
141
|
rootDID,
|
|
142
|
-
now,
|
|
142
|
+
nowUnix: now,
|
|
143
143
|
isRevoked
|
|
144
144
|
});
|
|
145
145
|
chain = verifiedChain.chain;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { C as ClientConfig, a as Client, b as Callbacks, R as RevChecker } from './types-
|
|
2
|
-
export { c as CallOptions, D as DocumentBlob, G as GlobalLogOptions, d as GlobalLogPage, e as GlobalLogResult, I as IndexCapabilities, f as IndexContentPage, g as IndexContentRow, h as IndexCountersignatureRow, i as IndexCountersignaturesPage, j as IndexCredentialRow, k as IndexCredentialsPage, l as IndexIdentitiesPage, m as IndexIdentityProfile, n as IndexIdentityRow, o as IndexOrder, p as IndexRecencyOrder, L as LogOp, P as Provenance, q as RelayHealth, r as RelayResponse, s as Resolution, t as Resolved, u as ResolvedContent, v as ResolvedCredential, S as Store, T as Trust, U as UnverifiableAxis, V as VerifyResult } from './types-
|
|
3
|
-
export { m as memoryStore } from './memory-
|
|
1
|
+
import { C as ClientConfig, a as Client, b as Callbacks, R as RevChecker } from './types-CSKl-wYe.js';
|
|
2
|
+
export { c as CallOptions, D as DocumentBlob, G as GlobalLogOptions, d as GlobalLogPage, e as GlobalLogResult, I as IndexCapabilities, f as IndexContentPage, g as IndexContentRow, h as IndexCountersignatureRow, i as IndexCountersignaturesPage, j as IndexCredentialRow, k as IndexCredentialsPage, l as IndexIdentitiesPage, m as IndexIdentityProfile, n as IndexIdentityRow, o as IndexOrder, p as IndexRecencyOrder, L as LogOp, P as Provenance, q as RelayHealth, r as RelayResponse, s as Resolution, t as Resolved, u as ResolvedContent, v as ResolvedCredential, S as Store, T as Trust, U as UnverifiableAxis, V as VerifyResult } from './types-CSKl-wYe.js';
|
|
3
|
+
export { m as memoryStore } from './memory-Ca1F2EBW.js';
|
|
4
4
|
import '@metalabel/dfos-protocol/chain';
|
|
5
5
|
import '@metalabel/dfos-protocol/credentials';
|
|
6
6
|
import '@metalabel/dfos-web-relay/peer-client';
|
|
@@ -72,6 +72,6 @@ declare const divergenceErrorFrom: (err: unknown) => DivergenceError | undefined
|
|
|
72
72
|
* verification of history: without it, revoking a credential today would make
|
|
73
73
|
* every already-committed operation it ever authorized fail to verify tomorrow.
|
|
74
74
|
*/
|
|
75
|
-
declare const createRevocationChecker: (relays: string[], fetchImpl: typeof fetch, resolveKey: (kid: string) => Promise<Uint8Array>) => RevChecker;
|
|
75
|
+
declare const createRevocationChecker: (relays: string[], fetchImpl: typeof fetch, resolveKey: (kid: string, basis?: string) => Promise<Uint8Array>) => RevChecker;
|
|
76
76
|
|
|
77
77
|
export { Callbacks, Client, ClientConfig, DivergenceError, RevChecker, createClient, createRevocationChecker, divergenceErrorFrom, resolvers };
|
package/dist/index.js
CHANGED
|
@@ -203,6 +203,7 @@ var createIndexQueries = (relays, fetchImpl) => {
|
|
|
203
203
|
setParam(url, "issuer", params?.issuer);
|
|
204
204
|
setParam(url, "resource", params?.resource);
|
|
205
205
|
setParam(url, "action", params?.action);
|
|
206
|
+
setParam(url, "order", params?.order);
|
|
206
207
|
setParam(url, "after", params?.after);
|
|
207
208
|
setParam(url, "limit", params?.limit);
|
|
208
209
|
return url;
|
|
@@ -276,10 +277,6 @@ var opMeta = (jws) => {
|
|
|
276
277
|
const createdAt = typeof decoded?.payload?.["createdAt"] === "string" ? (decoded?.payload)["createdAt"] : "";
|
|
277
278
|
return { cid, createdAt };
|
|
278
279
|
};
|
|
279
|
-
var provedKeys = (state) => {
|
|
280
|
-
const proved = state.provedKeys ?? state;
|
|
281
|
-
return [...proved.authKeys, ...proved.assertKeys, ...proved.controllerKeys];
|
|
282
|
-
};
|
|
283
280
|
var historicalIdentity = (state) => ({
|
|
284
281
|
...state,
|
|
285
282
|
...state.provedKeys ?? {
|
|
@@ -289,7 +286,9 @@ var historicalIdentity = (state) => ({
|
|
|
289
286
|
}
|
|
290
287
|
});
|
|
291
288
|
var keyBytesFor = (state, keyId) => {
|
|
292
|
-
const key =
|
|
289
|
+
const key = [...state.authKeys, ...state.assertKeys, ...state.controllerKeys].find(
|
|
290
|
+
(k) => k.id === keyId
|
|
291
|
+
);
|
|
293
292
|
return key ? decodeMultikey(key.publicKeyMultibase).keyBytes : null;
|
|
294
293
|
};
|
|
295
294
|
var createResolvers = (deps) => {
|
|
@@ -371,27 +370,42 @@ var createResolvers = (deps) => {
|
|
|
371
370
|
tipUnverified: cached !== void 0 && candidate.log.length === cached.log.length
|
|
372
371
|
};
|
|
373
372
|
};
|
|
374
|
-
const
|
|
373
|
+
const stateAsOf = async (resolution, basis) => {
|
|
374
|
+
const { state, log } = resolution;
|
|
375
|
+
const last = log[log.length - 1];
|
|
376
|
+
if (basis === void 0 || last === void 0 || opMeta(last).createdAt <= basis) return state;
|
|
377
|
+
const asOf = await verifyIdentityChain({ didPrefix: DID_PREFIX, log, asOf: basis });
|
|
378
|
+
return { ...asOf, isDeleted: state.isDeleted };
|
|
379
|
+
};
|
|
380
|
+
const resolveIdentity = async (did, basis) => {
|
|
375
381
|
try {
|
|
376
|
-
|
|
377
|
-
return historicalIdentity(state);
|
|
382
|
+
return await stateAsOf(await getIdentityChain(did), basis);
|
|
378
383
|
} catch {
|
|
379
384
|
return void 0;
|
|
380
385
|
}
|
|
381
386
|
};
|
|
382
|
-
const resolveKey = async (kid) => {
|
|
387
|
+
const resolveKey = async (kid, basis) => {
|
|
383
388
|
const hashIdx = kid.indexOf("#");
|
|
384
389
|
if (hashIdx < 0) throw new Error(`kid must be a DID URL: ${kid}`);
|
|
385
390
|
const did = kid.substring(0, hashIdx);
|
|
386
391
|
const keyId = kid.substring(hashIdx + 1);
|
|
387
|
-
const
|
|
392
|
+
const state = await stateAsOf(await getIdentityChain(did), basis);
|
|
388
393
|
const bytes = keyBytesFor(state, keyId);
|
|
389
394
|
if (!bytes) throw new Error(`unknown key ${keyId} on identity ${did}`);
|
|
390
395
|
return bytes;
|
|
391
396
|
};
|
|
397
|
+
const resolveClaimantIdentity = async (did) => {
|
|
398
|
+
try {
|
|
399
|
+
const { state } = await getIdentityChain(did);
|
|
400
|
+
return historicalIdentity(state);
|
|
401
|
+
} catch {
|
|
402
|
+
return void 0;
|
|
403
|
+
}
|
|
404
|
+
};
|
|
392
405
|
const callbacks = () => ({
|
|
393
406
|
resolveKey,
|
|
394
407
|
resolveIdentity,
|
|
408
|
+
resolveClaimantIdentity,
|
|
395
409
|
isRevoked: deps.isRevoked
|
|
396
410
|
});
|
|
397
411
|
const getContentChain = async (contentId, options) => {
|
|
@@ -574,7 +588,11 @@ var createClient = (config) => {
|
|
|
574
588
|
let isRevokedImpl = async () => false;
|
|
575
589
|
const isRevoked = (issuerDID, credentialCID, asOfUnix) => isRevokedImpl(issuerDID, credentialCID, asOfUnix);
|
|
576
590
|
const resolvers2 = createResolvers({ relays, quorum, store, peerClient, isRevoked });
|
|
577
|
-
isRevokedImpl = config.isRevoked ?? createRevocationChecker(
|
|
591
|
+
isRevokedImpl = config.isRevoked ?? createRevocationChecker(
|
|
592
|
+
relays,
|
|
593
|
+
fetchImpl,
|
|
594
|
+
(kid, basis) => resolvers2.callbacks().resolveKey(kid, basis)
|
|
595
|
+
);
|
|
578
596
|
const relaysFor = (o) => normalizeRelays(o?.relays ?? relays);
|
|
579
597
|
const identity = async (did, options) => {
|
|
580
598
|
const { state, provenance, tipUnverified } = await resolvers2.getIdentityChain(did, options);
|
|
@@ -600,7 +618,7 @@ var createClient = (config) => {
|
|
|
600
618
|
const issuer = await resolvers2.getIdentityChain(iss, options);
|
|
601
619
|
const verified = await verifyDFOSCredential(jws, {
|
|
602
620
|
resolveIdentity: resolvers2.callbacks().resolveIdentity,
|
|
603
|
-
|
|
621
|
+
nowUnix: Math.floor(nowMs() / 1e3)
|
|
604
622
|
});
|
|
605
623
|
const revoked = await isRevoked(verified.iss, verified.credentialCID);
|
|
606
624
|
const axes = [];
|
|
@@ -646,7 +664,7 @@ var createClient = (config) => {
|
|
|
646
664
|
if (typ === "did:dfos:credential") {
|
|
647
665
|
const verified = await verifyDFOSCredential(jws, {
|
|
648
666
|
resolveIdentity: cb.resolveIdentity,
|
|
649
|
-
|
|
667
|
+
nowUnix: Math.floor(nowMs() / 1e3)
|
|
650
668
|
});
|
|
651
669
|
const revoked = await isRevoked(verified.iss, verified.credentialCID);
|
|
652
670
|
if (revoked) return { ok: false, error: "credential revoked", value: verified };
|
package/dist/siwd.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Signer, VerifiedIdentity, VerifiedSignRequest } from '@metalabel/dfos-protocol/chain';
|
|
2
|
-
import { a as Client, V as VerifyResult } from './types-
|
|
2
|
+
import { a as Client, V as VerifyResult } from './types-CSKl-wYe.js';
|
|
3
3
|
import '@metalabel/dfos-protocol/credentials';
|
|
4
4
|
import '@metalabel/dfos-web-relay/peer-client';
|
|
5
5
|
|
|
@@ -89,13 +89,13 @@ interface SiwdLoginRequestInput {
|
|
|
89
89
|
redirectUri: string;
|
|
90
90
|
/**
|
|
91
91
|
* Requested scope: a space-separated SET of scope tokens (the OAuth `scope`
|
|
92
|
-
* convention), each of which must be one specs/
|
|
92
|
+
* convention), each of which must be one specs/INTEGRATIONS.md §Scopes and credentials
|
|
93
93
|
* registers. A request naming an unregistered token is refused WHOLE rather
|
|
94
94
|
* than partially honored — a consent screen that silently dropped a token
|
|
95
95
|
* would describe something other than what was asked for.
|
|
96
96
|
*/
|
|
97
97
|
scope: string;
|
|
98
|
-
/** Consent-screen prose. A host MAY decline to render it; see specs/
|
|
98
|
+
/** Consent-screen prose. A host MAY decline to render it; see specs/INTEGRATIONS.md. */
|
|
99
99
|
statement?: string;
|
|
100
100
|
/**
|
|
101
101
|
* Bind the challenge to ONE identity — "sign in as this DID, or not at all".
|
|
@@ -160,7 +160,7 @@ interface SiwdLoginRequest {
|
|
|
160
160
|
* on a local port used to be refused outright — there is no domain serving a
|
|
161
161
|
* well-known and no registration to check, so nothing backed the DID and a host
|
|
162
162
|
* would not display an identity it could not stand behind. The LOOPBACK
|
|
163
|
-
* CREDENTIAL TIER (specs/
|
|
163
|
+
* CREDENTIAL TIER (specs/INTEGRATIONS.md §Loopback clients) replaces "nothing backs it"
|
|
164
164
|
* with the one thing local software can prove: control of that identity's
|
|
165
165
|
* current keys. So the param now rides through on a loopback redirect instead
|
|
166
166
|
* of being dropped — but it is honored only when the request ALSO carries an
|
|
@@ -171,7 +171,7 @@ interface SiwdLoginRequest {
|
|
|
171
171
|
*
|
|
172
172
|
* The same judgment BOUNDS THE SCOPE. Every scope past `identity` returns a
|
|
173
173
|
* credential issued to a `client_did`, so a loopback request with no client
|
|
174
|
-
* identity at all still has nothing to issue to and specs/
|
|
174
|
+
* identity at all still has nothing to issue to and specs/INTEGRATIONS.md admits it for
|
|
175
175
|
* `scope=identity` only — there is nothing to downgrade, so it throws. With a
|
|
176
176
|
* client identity the tier is open and every scope is available.
|
|
177
177
|
*
|
|
@@ -329,7 +329,7 @@ interface SiwdLoopbackLoginRequestInput {
|
|
|
329
329
|
* a credential to.
|
|
330
330
|
*/
|
|
331
331
|
scope: string;
|
|
332
|
-
/** Consent-screen prose. A host MAY decline to render it; see specs/
|
|
332
|
+
/** Consent-screen prose. A host MAY decline to render it; see specs/INTEGRATIONS.md. */
|
|
333
333
|
statement?: string;
|
|
334
334
|
/** Bind the challenge to ONE subject DID (sign in as this DID or not at all). */
|
|
335
335
|
did?: string;
|
package/dist/siwd.js
CHANGED
|
@@ -135,7 +135,7 @@ var createSiwdLoginRequest = (input) => {
|
|
|
135
135
|
const isLoopback = SIWD_LOOPBACK_HOSTS.has(bareHostname(redirect));
|
|
136
136
|
if (isLoopback && input.scope !== "identity" && input.clientDid === void 0) {
|
|
137
137
|
throw new Error(
|
|
138
|
-
"invalid SIWD login request: loopback redirects support scope=identity only without a client identity \u2014 a credential scope needs a client_did proven under the loopback credential tier (specs/
|
|
138
|
+
"invalid SIWD login request: loopback redirects support scope=identity only without a client identity \u2014 a credential scope needs a client_did proven under the loopback credential tier (specs/INTEGRATIONS.md \xA7Loopback clients)"
|
|
139
139
|
);
|
|
140
140
|
}
|
|
141
141
|
const { challenge, encoded, nonce } = createSiwdChallenge({
|
package/dist/store/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { m as memoryStore } from '../memory-
|
|
2
|
-
import { S as Store } from '../types-
|
|
1
|
+
export { m as memoryStore } from '../memory-Ca1F2EBW.js';
|
|
2
|
+
import { S as Store } from '../types-CSKl-wYe.js';
|
|
3
3
|
import '@metalabel/dfos-protocol/chain';
|
|
4
4
|
import '@metalabel/dfos-protocol/credentials';
|
|
5
5
|
import '@metalabel/dfos-web-relay/peer-client';
|
|
@@ -92,8 +92,19 @@ type RevChecker = (issuerDID: string, credentialCID: string, asOfUnix?: number)
|
|
|
92
92
|
* `verifyDFOSCredential`, or any DFOS verifier. This is the trunk product.
|
|
93
93
|
*/
|
|
94
94
|
interface Callbacks {
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
/**
|
|
96
|
+
* Resolve a kid to key bytes in the signing identity's state as of `basis` —
|
|
97
|
+
* a committed artifact's own `createdAt`, or nothing for an ephemeral
|
|
98
|
+
* presentation, whose basis is now.
|
|
99
|
+
*/
|
|
100
|
+
resolveKey: (kid: string, basis?: string) => Promise<Uint8Array>;
|
|
101
|
+
/** Resolve a DID to its verified identity state as of `basis`. */
|
|
102
|
+
resolveIdentity: (did: string, basis?: string) => Promise<VerifiedIdentity | undefined>;
|
|
103
|
+
/**
|
|
104
|
+
* Resolve a DID to its identity with every key it has ever proved — the
|
|
105
|
+
* credit-claim carve-out, which runs no temporal check and so has no basis.
|
|
106
|
+
*/
|
|
107
|
+
resolveClaimantIdentity: (did: string) => Promise<VerifiedIdentity | undefined>;
|
|
97
108
|
isRevoked: RevChecker;
|
|
98
109
|
}
|
|
99
110
|
/**
|
|
@@ -334,6 +345,7 @@ interface Client {
|
|
|
334
345
|
issuer?: string;
|
|
335
346
|
resource?: string;
|
|
336
347
|
action?: string;
|
|
348
|
+
order?: IndexRecencyOrder;
|
|
337
349
|
after?: string;
|
|
338
350
|
limit?: number;
|
|
339
351
|
}, options?: CallOptions): Promise<IndexCredentialsPage>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metalabel/dfos-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.51.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "DFOS Client — the client-side kit for participating in the protocol: resolve, verify, prove. Fetch, resolve, verify-orchestration and cache over untrusted relays, plus the SIWD and API-AUTH proof surfaces. Holds no keys; all crypto truth comes from @metalabel/dfos-protocol",
|
|
6
6
|
"license": "MIT",
|
|
@@ -47,16 +47,16 @@
|
|
|
47
47
|
"README.md"
|
|
48
48
|
],
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"@metalabel/dfos-protocol": "^0.
|
|
51
|
-
"@metalabel/dfos-web-relay": "^0.
|
|
50
|
+
"@metalabel/dfos-protocol": "^0.51.0",
|
|
51
|
+
"@metalabel/dfos-web-relay": "^0.51.0"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@types/node": "^24.10.4",
|
|
55
55
|
"tsup": "^8.5.1",
|
|
56
56
|
"typescript": "^5.9.3",
|
|
57
57
|
"vitest": "^4.1.8",
|
|
58
|
-
"@metalabel/dfos-
|
|
59
|
-
"@metalabel/dfos-
|
|
58
|
+
"@metalabel/dfos-protocol": "0.51.0",
|
|
59
|
+
"@metalabel/dfos-web-relay": "0.51.0"
|
|
60
60
|
},
|
|
61
61
|
"scripts": {
|
|
62
62
|
"build": "tsup",
|