@interop/was-client 0.8.0 → 0.9.1
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 +59 -88
- package/dist/Collection.d.ts +17 -4
- package/dist/Collection.d.ts.map +1 -1
- package/dist/Collection.js +26 -10
- package/dist/Collection.js.map +1 -1
- package/dist/Resource.d.ts +12 -3
- package/dist/Resource.d.ts.map +1 -1
- package/dist/Resource.js +19 -3
- package/dist/Resource.js.map +1 -1
- package/dist/Space.d.ts +6 -1
- package/dist/Space.d.ts.map +1 -1
- package/dist/Space.js +14 -2
- package/dist/Space.js.map +1 -1
- package/dist/WasClient.d.ts +7 -3
- package/dist/WasClient.d.ts.map +1 -1
- package/dist/WasClient.js +7 -3
- package/dist/WasClient.js.map +1 -1
- package/dist/codec.d.ts +34 -13
- package/dist/codec.d.ts.map +1 -1
- package/dist/edv/EdvCodec.d.ts +21 -11
- package/dist/edv/EdvCodec.d.ts.map +1 -1
- package/dist/edv/EdvCodec.js +28 -13
- package/dist/edv/EdvCodec.js.map +1 -1
- package/dist/edv/index.d.ts +5 -4
- package/dist/edv/index.d.ts.map +1 -1
- package/dist/edv/index.js +4 -4
- package/dist/edv/index.js.map +1 -1
- package/dist/errors.d.ts +12 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +16 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/codec.d.ts +14 -5
- package/dist/internal/codec.d.ts.map +1 -1
- package/dist/internal/codec.js +70 -9
- package/dist/internal/codec.js.map +1 -1
- package/dist/internal/content.d.ts.map +1 -1
- package/dist/internal/content.js +17 -1
- package/dist/internal/content.js.map +1 -1
- package/dist/internal/describe.d.ts +27 -0
- package/dist/internal/describe.d.ts.map +1 -0
- package/dist/internal/describe.js +23 -0
- package/dist/internal/describe.js.map +1 -0
- package/dist/types.d.ts +26 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/internal/codec.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { prepareBody, parseResource } from './content.js';
|
|
2
|
+
import { EncryptionError } from '../errors.js';
|
|
2
3
|
/**
|
|
3
4
|
* The default codec: passes plaintext through unchanged. `encode` echoes the
|
|
4
5
|
* caller's `id` (so `put(id, ...)` is a `PUT` and `add(...)`, with no id, stays
|
|
@@ -22,23 +23,83 @@ export const identityCodec = {
|
|
|
22
23
|
}
|
|
23
24
|
};
|
|
24
25
|
/**
|
|
25
|
-
* Resolves the codec for a collection
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
26
|
+
* Resolves the codec for a collection by deciding policy (override > marker >
|
|
27
|
+
* plaintext) and then, when encrypted, building the encrypting codec from the
|
|
28
|
+
* keystore. Fails closed: a collection declared encrypted (by override or
|
|
29
|
+
* marker) for which no codec can be built throws {@link EncryptionError} rather
|
|
30
|
+
* than falling back to {@link identityCodec}.
|
|
29
31
|
*
|
|
30
32
|
* @param context {ClientContext}
|
|
31
33
|
* @param options {object}
|
|
32
34
|
* @param options.spaceId {string}
|
|
33
35
|
* @param options.collectionId {string}
|
|
36
|
+
* @param [options.override] {EncryptionOverride} per-handle override; wins
|
|
37
|
+
* over the marker and skips the marker read
|
|
38
|
+
* @param options.readMarker {function} lazily reads the Collection's declared
|
|
39
|
+
* `encryption` marker (resolves `undefined` for plaintext / missing); called
|
|
40
|
+
* only when there is no override and the client has a keystore
|
|
34
41
|
* @returns {Promise<ResourceCodec>}
|
|
35
42
|
*/
|
|
36
|
-
export async function resolveCodec(context, { spaceId, collectionId }) {
|
|
37
|
-
|
|
38
|
-
if (
|
|
43
|
+
export async function resolveCodec(context, { spaceId, collectionId, override, readMarker }) {
|
|
44
|
+
// 1. A per-handle override wins and skips the marker read.
|
|
45
|
+
if (override !== undefined) {
|
|
46
|
+
if (override === 'plaintext') {
|
|
47
|
+
return identityCodec;
|
|
48
|
+
}
|
|
49
|
+
return buildEncryptingCodec(context, {
|
|
50
|
+
spaceId,
|
|
51
|
+
collectionId,
|
|
52
|
+
scheme: override.scheme,
|
|
53
|
+
keys: override.keys
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
// 2. A plaintext-only client (no keystore) never encrypts; no round-trip.
|
|
57
|
+
if (!context.encryption) {
|
|
58
|
+
return identityCodec;
|
|
59
|
+
}
|
|
60
|
+
// 3. Otherwise the Collection's declared marker decides.
|
|
61
|
+
const marker = await readMarker();
|
|
62
|
+
if (!marker) {
|
|
39
63
|
return identityCodec;
|
|
40
64
|
}
|
|
41
|
-
|
|
42
|
-
|
|
65
|
+
return buildEncryptingCodec(context, {
|
|
66
|
+
spaceId,
|
|
67
|
+
collectionId,
|
|
68
|
+
scheme: marker.scheme
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Builds the encrypting codec for a collection known to be encrypted, failing
|
|
73
|
+
* closed: throws {@link EncryptionError} when no keystore is configured or it
|
|
74
|
+
* returns no codec (no keys / unhandled scheme), so an encrypted collection is
|
|
75
|
+
* never silently read/written as plaintext.
|
|
76
|
+
*
|
|
77
|
+
* @param context {ClientContext}
|
|
78
|
+
* @param options {object}
|
|
79
|
+
* @param options.spaceId {string}
|
|
80
|
+
* @param options.collectionId {string}
|
|
81
|
+
* @param options.scheme {string}
|
|
82
|
+
* @param [options.keys] {unknown} override-supplied key material
|
|
83
|
+
* @returns {Promise<ResourceCodec>}
|
|
84
|
+
*/
|
|
85
|
+
async function buildEncryptingCodec(context, { spaceId, collectionId, scheme, keys }) {
|
|
86
|
+
const where = `${spaceId}/${collectionId}`;
|
|
87
|
+
if (!context.encryption) {
|
|
88
|
+
throw new EncryptionError(`Collection ${where} is encrypted (scheme "${scheme}") but this client ` +
|
|
89
|
+
'has no encryption provider. Construct the WasClient with an ' +
|
|
90
|
+
'`encryption` provider (see @interop/was-client/edv).');
|
|
91
|
+
}
|
|
92
|
+
const codec = await context.encryption.codecFor({
|
|
93
|
+
spaceId,
|
|
94
|
+
collectionId,
|
|
95
|
+
scheme,
|
|
96
|
+
keys
|
|
97
|
+
});
|
|
98
|
+
if (!codec) {
|
|
99
|
+
throw new EncryptionError(`Collection ${where} is encrypted (scheme "${scheme}") but this client ` +
|
|
100
|
+
'holds no keys for it (or does not handle the scheme). Supply keys via ' +
|
|
101
|
+
'your keystore (resolveKeys) or a per-handle encryption override.');
|
|
102
|
+
}
|
|
103
|
+
return codec;
|
|
43
104
|
}
|
|
44
105
|
//# sourceMappingURL=codec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/internal/codec.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/internal/codec.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAO9C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C,oBAAoB,EAAE,IAAI;IAE1B,KAAK,CAAC,MAAM,CAAC,EACX,EAAE,EACF,IAAI,EACJ,WAAW,EAKZ;QACC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;QACjE,OAAO;YACL,EAAE;YACF,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;SAClC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAsB;QACjC,OAAO,CAAC,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAgB,CAAA;IACvD,CAAC;CACF,CAAA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAsB,EACtB,EACE,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,UAAU,EAMX;IAED,2DAA2D;IAC3D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;YAC7B,OAAO,aAAa,CAAA;QACtB,CAAC;QACD,OAAO,oBAAoB,CAAC,OAAO,EAAE;YACnC,OAAO;YACP,YAAY;YACZ,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;SACpB,CAAC,CAAA;IACJ,CAAC;IACD,0EAA0E;IAC1E,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,aAAa,CAAA;IACtB,CAAC;IACD,yDAAyD;IACzD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;IACjC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,aAAa,CAAA;IACtB,CAAC;IACD,OAAO,oBAAoB,CAAC,OAAO,EAAE;QACnC,OAAO;QACP,YAAY;QACZ,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,KAAK,UAAU,oBAAoB,CACjC,OAAsB,EACtB,EACE,OAAO,EACP,YAAY,EACZ,MAAM,EACN,IAAI,EACsE;IAE5E,MAAM,KAAK,GAAG,GAAG,OAAO,IAAI,YAAY,EAAE,CAAA;IAC1C,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,eAAe,CACvB,cAAc,KAAK,0BAA0B,MAAM,qBAAqB;YACtE,8DAA8D;YAC9D,sDAAsD,CACzD,CAAA;IACH,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC9C,OAAO;QACP,YAAY;QACZ,MAAM;QACN,IAAI;KACL,CAAC,CAAA;IACF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,eAAe,CACvB,cAAc,KAAK,0BAA0B,MAAM,qBAAqB;YACtE,wEAAwE;YACxE,kEAAkE,CACrE,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/internal/content.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAExD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/internal/content.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAExD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAgDvC;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOrE;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAoBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,UAAU,EAC9B,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD,YAAY,CA4Bd;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAE3E;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,YAAY,GAAG,IAAI,GAC5B,OAAO,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAS7B"}
|
package/dist/internal/content.js
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
import { ValidationError } from '../errors.js';
|
|
2
2
|
const OCTET_STREAM = 'application/octet-stream';
|
|
3
|
+
/**
|
|
4
|
+
* Whether a content-type denotes JSON -- `application/json` or any
|
|
5
|
+
* `application/<prefix>+json` structured-suffix variant (e.g.
|
|
6
|
+
* `application/ld+json`, `application/edv+json`), each optionally followed by
|
|
7
|
+
* parameters (`; charset=utf-8`). The `json` token is anchored to the end of the
|
|
8
|
+
* media type, so a non-JSON type that merely contains the substring `json` --
|
|
9
|
+
* `application/jsonl`, `application/json-seq`, `application/json5` -- is NOT
|
|
10
|
+
* treated as JSON and is read back as binary (a `Blob`) instead of being
|
|
11
|
+
* JSON-parsed.
|
|
12
|
+
*
|
|
13
|
+
* @param contentType {string}
|
|
14
|
+
* @returns {boolean}
|
|
15
|
+
*/
|
|
16
|
+
function isJsonContentType(contentType) {
|
|
17
|
+
return /^application\/([^+\s;]+\+)?json\s*(;.*)?$/i.test(contentType);
|
|
18
|
+
}
|
|
3
19
|
/**
|
|
4
20
|
* Extension-to-content-type fallbacks for the common static-web file types --
|
|
5
21
|
* the only case where guessing a content-type from a resource id pays off
|
|
@@ -123,7 +139,7 @@ export async function parseResource(response) {
|
|
|
123
139
|
return null;
|
|
124
140
|
}
|
|
125
141
|
const contentType = response.headers.get('content-type') ?? '';
|
|
126
|
-
if (contentType
|
|
142
|
+
if (isJsonContentType(contentType)) {
|
|
127
143
|
return (await readJsonData(response));
|
|
128
144
|
}
|
|
129
145
|
return response.blob();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/internal/content.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/internal/content.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2026 Interop Alliance. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Reads a Collection Description with a single GET. Shared by
|
|
6
|
+
* `Collection.describe()` and the standalone-resource codec's marker discovery
|
|
7
|
+
* so the request shape (path, capability, null-unwrap) lives in one place.
|
|
8
|
+
*/
|
|
9
|
+
import type { ClientContext } from './request.js';
|
|
10
|
+
import type { CollectionDescription, IZcap } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Reads the Collection Description. Returns `null` if the collection is missing
|
|
13
|
+
* or not visible to you (WAS returns 404 for both not-found and unauthorized).
|
|
14
|
+
*
|
|
15
|
+
* @param context {ClientContext}
|
|
16
|
+
* @param options {object}
|
|
17
|
+
* @param options.spaceId {string}
|
|
18
|
+
* @param options.collectionId {string}
|
|
19
|
+
* @param [options.capability] {IZcap} capability attached to the request
|
|
20
|
+
* @returns {Promise<CollectionDescription | null>}
|
|
21
|
+
*/
|
|
22
|
+
export declare function describeCollection(context: ClientContext, { spaceId, collectionId, capability }: {
|
|
23
|
+
spaceId: string;
|
|
24
|
+
collectionId: string;
|
|
25
|
+
capability?: IZcap;
|
|
26
|
+
}): Promise<CollectionDescription | null>;
|
|
27
|
+
//# sourceMappingURL=describe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.d.ts","sourceRoot":"","sources":["../../src/internal/describe.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;GAIG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAGjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAE/D;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,aAAa,EACtB,EACE,OAAO,EACP,YAAY,EACZ,UAAU,EACX,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,CAAA;CAAE,GAC/D,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAQvC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { send } from './request.js';
|
|
2
|
+
import { collectionPath } from './paths.js';
|
|
3
|
+
/**
|
|
4
|
+
* Reads the Collection Description. Returns `null` if the collection is missing
|
|
5
|
+
* or not visible to you (WAS returns 404 for both not-found and unauthorized).
|
|
6
|
+
*
|
|
7
|
+
* @param context {ClientContext}
|
|
8
|
+
* @param options {object}
|
|
9
|
+
* @param options.spaceId {string}
|
|
10
|
+
* @param options.collectionId {string}
|
|
11
|
+
* @param [options.capability] {IZcap} capability attached to the request
|
|
12
|
+
* @returns {Promise<CollectionDescription | null>}
|
|
13
|
+
*/
|
|
14
|
+
export async function describeCollection(context, { spaceId, collectionId, capability }) {
|
|
15
|
+
const response = await send(context, {
|
|
16
|
+
path: collectionPath(spaceId, collectionId),
|
|
17
|
+
method: 'GET',
|
|
18
|
+
capability,
|
|
19
|
+
read: true
|
|
20
|
+
});
|
|
21
|
+
return response === null ? null : response.data;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=describe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.js","sourceRoot":"","sources":["../../src/internal/describe.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAG3C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAsB,EACtB,EACE,OAAO,EACP,YAAY,EACZ,UAAU,EACoD;IAEhE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE;QACnC,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC;QAC3C,MAAM,EAAE,KAAK;QACb,UAAU;QACV,IAAI,EAAE,IAAI;KACX,CAAC,CAAA;IACF,OAAO,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,QAAQ,CAAC,IAA8B,CAAA;AAC5E,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ import type { IZcap, IDelegatedZcap } from '@interop/data-integrity-core/zcap';
|
|
|
16
16
|
import type { ISigner } from '@interop/data-integrity-core';
|
|
17
17
|
import type { ActionInput } from '@interop/storage-core';
|
|
18
18
|
export type { IZcap, IDelegatedZcap, ISigner };
|
|
19
|
-
export type { Action, ActionInput, SpaceDescription, CollectionDescription, PolicyDocument, LinkSet, LinkSetEntry, CollectionSummary, CollectionsList, SpaceSummary, SpaceListing, ResourceSummary, CollectionResourcesList, ResourceMetadata, ResourceMetadataCustom, ImportStats, BackendReference, BackendDescriptor, BackendRegistration, BackendConnectionInput, BackendConnectionPublic, StorageLimit, CollectionUsage, BackendUsage, SpaceQuotaReport } from '@interop/storage-core';
|
|
19
|
+
export type { Action, ActionInput, SpaceDescription, CollectionDescription, CollectionEncryption, PolicyDocument, LinkSet, LinkSetEntry, CollectionSummary, CollectionsList, SpaceSummary, SpaceListing, ResourceSummary, CollectionResourcesList, ResourceMetadata, ResourceMetadataCustom, ImportStats, BackendReference, BackendDescriptor, BackendRegistration, BackendConnectionInput, BackendConnectionPublic, StorageLimit, CollectionUsage, BackendUsage, SpaceQuotaReport } from '@interop/storage-core';
|
|
20
20
|
/**
|
|
21
21
|
* A JSON-serializable value, the shape stored for JSON resources and
|
|
22
22
|
* descriptions.
|
|
@@ -41,6 +41,26 @@ export interface AddResult {
|
|
|
41
41
|
*/
|
|
42
42
|
etag?: string;
|
|
43
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* A per-handle client-side encryption override -- the escape hatch / bootstrap
|
|
46
|
+
* path that takes precedence over the Collection's declared `encryption` marker
|
|
47
|
+
* AND skips the marker-discovery round-trip:
|
|
48
|
+
*
|
|
49
|
+
* - `{ scheme }` -- treat the collection as encrypted under `scheme`, pulling
|
|
50
|
+
* keys from the client's keystore. Use right after `createCollection` (before
|
|
51
|
+
* the marker is readable), or to avoid the `describe()` round-trip.
|
|
52
|
+
* - `{ scheme, keys }` -- additionally supply the key material inline (opaque to
|
|
53
|
+
* core; the encryption provider interprets it per `scheme`) instead of the
|
|
54
|
+
* keystore.
|
|
55
|
+
* - `'plaintext'` -- force plaintext even if a marker / keystore would encrypt.
|
|
56
|
+
*
|
|
57
|
+
* The non-`'plaintext'` forms require the `WasClient` to be constructed with an
|
|
58
|
+
* `encryption` provider (which turns a scheme + keys into a codec).
|
|
59
|
+
*/
|
|
60
|
+
export type EncryptionOverride = {
|
|
61
|
+
scheme: string;
|
|
62
|
+
keys?: unknown;
|
|
63
|
+
} | 'plaintext';
|
|
44
64
|
/**
|
|
45
65
|
* Options accepted by every handle factory (`space()`, `collection()`,
|
|
46
66
|
* `resource()`). A bound `capability` is attached to every request the handle
|
|
@@ -48,6 +68,11 @@ export interface AddResult {
|
|
|
48
68
|
*/
|
|
49
69
|
export interface HandleOptions {
|
|
50
70
|
capability?: IZcap;
|
|
71
|
+
/**
|
|
72
|
+
* Per-handle client-side encryption override (see {@link EncryptionOverride}).
|
|
73
|
+
* Omit to let the Collection's declared `encryption` marker decide.
|
|
74
|
+
*/
|
|
75
|
+
encryption?: EncryptionOverride;
|
|
51
76
|
}
|
|
52
77
|
/**
|
|
53
78
|
* Options for the general delegation primitive (`was.grant()`) and the
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AAE3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAExD,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,CAAA;AAM9C,YAAY,EACV,MAAM,EACN,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,sBAAsB,EACtB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,gBAAgB,EACjB,MAAM,uBAAuB,CAAA;AAE9B;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;AAC5D,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB;AACD,MAAM,MAAM,SAAS,GAAG,IAAI,EAAE,CAAA;AAC9B,MAAM,MAAM,IAAI,GAAG,aAAa,GAAG,UAAU,GAAG,SAAS,CAAA;AAEzD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AAE3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAExD,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,CAAA;AAM9C,YAAY,EACV,MAAM,EACN,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,sBAAsB,EACtB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,gBAAgB,EACjB,MAAM,uBAAuB,CAAA;AAE9B;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;AAC5D,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB;AACD,MAAM,MAAM,SAAS,GAAG,IAAI,EAAE,CAAA;AAC9B,MAAM,MAAM,IAAI,GAAG,aAAa,GAAG,UAAU,GAAG,SAAS,CAAA;AAEzD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,kBAAkB,GAC1B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAClC,WAAW,CAAA;AAEf;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,KAAK,CAAA;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,kBAAkB,CAAA;CAChC;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,WAAW,EAAE,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,KAAK,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,IAAI,GAAG,UAAU,CAAA;IACxB,UAAU,CAAC,EAAE,KAAK,CAAA;CACnB"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@interop/was-client",
|
|
3
3
|
"description": "A developer-friendly client for Wallet Attached Storage (WAS) servers.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.9.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"build": "pnpm run clear && tsc",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"@interop/edv-client": "^17.2.0",
|
|
48
48
|
"@interop/ezcap": "^7.3.0",
|
|
49
49
|
"@interop/http-client": "^1.0.3",
|
|
50
|
-
"@interop/storage-core": "^0.
|
|
50
|
+
"@interop/storage-core": "^0.3.0"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@eslint/js": "^10.0.1",
|