@interop/was-client 0.10.0 → 0.11.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 -3
- package/dist/Resource.d.ts +28 -7
- package/dist/Resource.d.ts.map +1 -1
- package/dist/Resource.js +37 -16
- package/dist/Resource.js.map +1 -1
- package/dist/codec.d.ts +38 -6
- package/dist/codec.d.ts.map +1 -1
- package/dist/edv/EdvCodec.d.ts +33 -5
- package/dist/edv/EdvCodec.d.ts.map +1 -1
- package/dist/edv/EdvCodec.js +51 -4
- package/dist/edv/EdvCodec.js.map +1 -1
- package/dist/internal/codec.d.ts +2 -1
- package/dist/internal/codec.d.ts.map +1 -1
- package/dist/internal/codec.js +9 -2
- package/dist/internal/codec.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -606,9 +606,11 @@ scope for now):
|
|
|
606
606
|
as the WAS resource id). `put(id, ...)` accepts only an EDV-format id; a
|
|
607
607
|
human-readable id is rejected (it would leak onto the URL) -- carry a
|
|
608
608
|
human-readable label inside the encrypted content instead.
|
|
609
|
-
- **Metadata.** `resource.setName()` / `setTags()`
|
|
610
|
-
collection
|
|
611
|
-
the
|
|
609
|
+
- **Metadata.** `resource.setName()` / `setTags()` / `setMeta()` work on an
|
|
610
|
+
encrypted collection: the user-writable `custom` (`name` / `tags`) is encrypted
|
|
611
|
+
into an envelope before it is sent, so the server never sees the plaintext, and
|
|
612
|
+
`meta()` decrypts it back for a keyed reader. The `/meta` endpoint has its own
|
|
613
|
+
ETag (`metaVersion`), independent of the content ETag.
|
|
612
614
|
- **Binary.** A small `Blob`/`Uint8Array` is encrypted as a single document;
|
|
613
615
|
larger binaries are rejected until chunked encrypted blobs land.
|
|
614
616
|
- **Raw reads.** `get()` decrypts; the `getText()` / `getBytes()` escape hatches
|
package/dist/Resource.d.ts
CHANGED
|
@@ -132,9 +132,14 @@ export declare class Resource {
|
|
|
132
132
|
* resource is missing or not visible to you (404 conflation caveat). A server
|
|
133
133
|
* without metadata support surfaces its 501 as `NotImplementedError`.
|
|
134
134
|
*
|
|
135
|
+
* On an encrypted collection the stored `custom` is an opaque envelope; this
|
|
136
|
+
* decodes it (decrypts, via the codec) so a caller always sees plaintext
|
|
137
|
+
* `{ name, tags }`. A resource with no user metadata reports `custom` as `{}`.
|
|
138
|
+
*
|
|
135
139
|
* Against a backend with the `conditional-writes` feature the result also
|
|
136
|
-
* carries the
|
|
137
|
-
* `
|
|
140
|
+
* carries the metadata's current `etag` (the `/meta` `metaVersion` validator)
|
|
141
|
+
* -- pass it as `setMeta(meta, { ifMatch })` for a lost-update-safe metadata
|
|
142
|
+
* update.
|
|
138
143
|
*
|
|
139
144
|
* @returns {Promise<(ResourceMetadata & { etag?: string }) | null>}
|
|
140
145
|
*/
|
|
@@ -148,17 +153,33 @@ export declare class Resource {
|
|
|
148
153
|
* metadata of a nonexistent resource throws `NotFoundError`. Servers without
|
|
149
154
|
* metadata support surface their 501 as `NotImplementedError`.
|
|
150
155
|
*
|
|
151
|
-
* On an encrypted collection
|
|
152
|
-
*
|
|
153
|
-
*
|
|
156
|
+
* On an encrypted collection `custom` is encrypted into an opaque envelope by
|
|
157
|
+
* the codec before it is sent, so `name` / `tags` are never stored as
|
|
158
|
+
* server-visible plaintext -- transparently, the same call works on plaintext
|
|
159
|
+
* and encrypted collections alike.
|
|
160
|
+
*
|
|
161
|
+
* Conditional metadata writes (the backend's `conditional-writes` feature):
|
|
162
|
+
* pass `ifMatch` (the `etag` from a prior `meta()`) for an
|
|
163
|
+
* update-if-unchanged, or `ifNoneMatch: true` for a write-only-if-no-metadata.
|
|
164
|
+
* A failed precondition throws `PreconditionFailedError` (412). The `/meta`
|
|
165
|
+
* ETag (`metaVersion`) is independent of the content ETag. Returns the new
|
|
166
|
+
* `etag`.
|
|
154
167
|
*
|
|
155
168
|
* @param meta {object}
|
|
156
169
|
* @param [meta.custom] {ResourceMetadataCustom} the user-writable properties
|
|
157
|
-
* @
|
|
170
|
+
* @param options {object}
|
|
171
|
+
* @param [options.ifMatch] {string} update only if the `/meta` ETag matches
|
|
172
|
+
* @param [options.ifNoneMatch] {boolean} write only if no metadata is set
|
|
173
|
+
* @returns {Promise<{ etag?: string }>} the metadata's new ETag
|
|
158
174
|
*/
|
|
159
175
|
setMeta(meta?: {
|
|
160
176
|
custom?: ResourceMetadataCustom;
|
|
161
|
-
}
|
|
177
|
+
}, options?: {
|
|
178
|
+
ifMatch?: string;
|
|
179
|
+
ifNoneMatch?: boolean;
|
|
180
|
+
}): Promise<{
|
|
181
|
+
etag?: string;
|
|
182
|
+
}>;
|
|
162
183
|
/**
|
|
163
184
|
* Sets the resource's human-readable `name` (the value surfaced in collection
|
|
164
185
|
* listings), preserving any existing `tags`. Convenience over `setMeta()`.
|
package/dist/Resource.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Resource.d.ts","sourceRoot":"","sources":["../src/Resource.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAU1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"Resource.d.ts","sourceRoot":"","sources":["../src/Resource.ts"],"names":[],"mappings":"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"}
|
package/dist/Resource.js
CHANGED
|
@@ -5,7 +5,6 @@ import { CodecHolder, resolveCodec, readCollectionMarker } from './internal/code
|
|
|
5
5
|
import { writeHeaders, readEtag } from './internal/conditional.js';
|
|
6
6
|
import { sendEncodedWrite } from './internal/write.js';
|
|
7
7
|
import { readPolicy, writePolicy, deletePolicy } from './internal/policy.js';
|
|
8
|
-
import { ValidationError } from './errors.js';
|
|
9
8
|
export class Resource {
|
|
10
9
|
spaceId;
|
|
11
10
|
collectionId;
|
|
@@ -228,13 +227,19 @@ export class Resource {
|
|
|
228
227
|
* resource is missing or not visible to you (404 conflation caveat). A server
|
|
229
228
|
* without metadata support surfaces its 501 as `NotImplementedError`.
|
|
230
229
|
*
|
|
230
|
+
* On an encrypted collection the stored `custom` is an opaque envelope; this
|
|
231
|
+
* decodes it (decrypts, via the codec) so a caller always sees plaintext
|
|
232
|
+
* `{ name, tags }`. A resource with no user metadata reports `custom` as `{}`.
|
|
233
|
+
*
|
|
231
234
|
* Against a backend with the `conditional-writes` feature the result also
|
|
232
|
-
* carries the
|
|
233
|
-
* `
|
|
235
|
+
* carries the metadata's current `etag` (the `/meta` `metaVersion` validator)
|
|
236
|
+
* -- pass it as `setMeta(meta, { ifMatch })` for a lost-update-safe metadata
|
|
237
|
+
* update.
|
|
234
238
|
*
|
|
235
239
|
* @returns {Promise<(ResourceMetadata & { etag?: string }) | null>}
|
|
236
240
|
*/
|
|
237
241
|
async meta() {
|
|
242
|
+
const codec = await this._codec();
|
|
238
243
|
const response = await send(this._context, {
|
|
239
244
|
path: this._metaPath,
|
|
240
245
|
method: 'GET',
|
|
@@ -245,8 +250,12 @@ export class Resource {
|
|
|
245
250
|
return null;
|
|
246
251
|
}
|
|
247
252
|
const metadata = response.data;
|
|
253
|
+
// Decode the user-writable `custom` (decrypting it on an encrypted
|
|
254
|
+
// collection) so callers uniformly see plaintext `{ name, tags }`.
|
|
255
|
+
const custom = await codec.decodeMeta({ custom: metadata.custom });
|
|
256
|
+
const decoded = { ...metadata, custom };
|
|
248
257
|
const etag = readEtag(response);
|
|
249
|
-
return etag !== undefined ? { ...
|
|
258
|
+
return etag !== undefined ? { ...decoded, etag } : decoded;
|
|
250
259
|
}
|
|
251
260
|
/**
|
|
252
261
|
* Replaces the resource's user-writable metadata (`custom`). This is a full
|
|
@@ -255,27 +264,39 @@ export class Resource {
|
|
|
255
264
|
* metadata of a nonexistent resource throws `NotFoundError`. Servers without
|
|
256
265
|
* metadata support surface their 501 as `NotImplementedError`.
|
|
257
266
|
*
|
|
258
|
-
* On an encrypted collection
|
|
259
|
-
*
|
|
260
|
-
*
|
|
267
|
+
* On an encrypted collection `custom` is encrypted into an opaque envelope by
|
|
268
|
+
* the codec before it is sent, so `name` / `tags` are never stored as
|
|
269
|
+
* server-visible plaintext -- transparently, the same call works on plaintext
|
|
270
|
+
* and encrypted collections alike.
|
|
271
|
+
*
|
|
272
|
+
* Conditional metadata writes (the backend's `conditional-writes` feature):
|
|
273
|
+
* pass `ifMatch` (the `etag` from a prior `meta()`) for an
|
|
274
|
+
* update-if-unchanged, or `ifNoneMatch: true` for a write-only-if-no-metadata.
|
|
275
|
+
* A failed precondition throws `PreconditionFailedError` (412). The `/meta`
|
|
276
|
+
* ETag (`metaVersion`) is independent of the content ETag. Returns the new
|
|
277
|
+
* `etag`.
|
|
261
278
|
*
|
|
262
279
|
* @param meta {object}
|
|
263
280
|
* @param [meta.custom] {ResourceMetadataCustom} the user-writable properties
|
|
264
|
-
* @
|
|
281
|
+
* @param options {object}
|
|
282
|
+
* @param [options.ifMatch] {string} update only if the `/meta` ETag matches
|
|
283
|
+
* @param [options.ifNoneMatch] {boolean} write only if no metadata is set
|
|
284
|
+
* @returns {Promise<{ etag?: string }>} the metadata's new ETag
|
|
265
285
|
*/
|
|
266
|
-
async setMeta(meta = {}) {
|
|
286
|
+
async setMeta(meta = {}, options = {}) {
|
|
267
287
|
const codec = await this._codec();
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
'collection -- it would be stored as plaintext. Carry these values ' +
|
|
271
|
-
'inside the encrypted content instead.');
|
|
272
|
-
}
|
|
273
|
-
await send(this._context, {
|
|
288
|
+
const { custom } = await codec.encodeMeta({ custom: meta.custom ?? {} });
|
|
289
|
+
const response = await send(this._context, {
|
|
274
290
|
path: this._metaPath,
|
|
275
291
|
method: 'PUT',
|
|
276
292
|
capability: this._capability,
|
|
277
|
-
json: { custom
|
|
293
|
+
json: { custom },
|
|
294
|
+
headers: writeHeaders(undefined, {
|
|
295
|
+
ifMatch: options.ifMatch,
|
|
296
|
+
ifNoneMatch: options.ifNoneMatch
|
|
297
|
+
})
|
|
278
298
|
});
|
|
299
|
+
return { etag: readEtag(response) };
|
|
279
300
|
}
|
|
280
301
|
/**
|
|
281
302
|
* Sets the resource's human-readable `name` (the value surfaced in collection
|
package/dist/Resource.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Resource.js","sourceRoot":"","sources":["../src/Resource.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE1D,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAC5C,OAAO,EACL,WAAW,EACX,YAAY,EACZ,oBAAoB,EACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"Resource.js","sourceRoot":"","sources":["../src/Resource.ts"],"names":[],"mappings":"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"}
|
package/dist/codec.d.ts
CHANGED
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
* silently writing plaintext.
|
|
32
32
|
*/
|
|
33
33
|
import type { HttpResponse } from '@interop/http-client';
|
|
34
|
-
import type { Json, ResourceData } from './types.js';
|
|
34
|
+
import type { Json, ResourceData, ResourceMetadataCustom } from './types.js';
|
|
35
35
|
/**
|
|
36
36
|
* The result of {@link ResourceCodec.encode}: the stored representation of a
|
|
37
37
|
* write, plus the id to store it under.
|
|
@@ -72,12 +72,15 @@ export interface EncodedWrite {
|
|
|
72
72
|
*/
|
|
73
73
|
export interface ResourceCodec {
|
|
74
74
|
/**
|
|
75
|
-
*
|
|
76
|
-
* `
|
|
77
|
-
*
|
|
78
|
-
*
|
|
75
|
+
* How this codec stores a Resource's user-writable metadata (`custom`:
|
|
76
|
+
* `name` / `tags`, set via `resource.setName` / `setTags` / `setMeta`). The
|
|
77
|
+
* identity codec stores it as server-visible plaintext (`'plaintext'`); an
|
|
78
|
+
* encrypting codec stores it as an opaque envelope (`'encrypted'`) -- the same
|
|
79
|
+
* way it stores content -- so `name` / `tags` never reach the server in the
|
|
80
|
+
* clear. A mode rather than a boolean so a future scheme that stores metadata
|
|
81
|
+
* differently can extend the union.
|
|
79
82
|
*/
|
|
80
|
-
readonly
|
|
83
|
+
readonly metadataMode: 'plaintext' | 'encrypted';
|
|
81
84
|
/**
|
|
82
85
|
* Whether this codec drives optimistic-concurrency (conditional) writes. When
|
|
83
86
|
* `true`, the write path pre-reads the current stored resource and passes it
|
|
@@ -117,6 +120,35 @@ export interface ResourceCodec {
|
|
|
117
120
|
* @returns {Promise<Json | Blob>}
|
|
118
121
|
*/
|
|
119
122
|
decode(response: HttpResponse): Promise<Json | Blob>;
|
|
123
|
+
/**
|
|
124
|
+
* Transforms a caller's user-writable metadata (`custom`) into the value to
|
|
125
|
+
* store under `custom` on a `PUT .../meta` write. The identity codec returns
|
|
126
|
+
* `custom` unchanged (server-visible plaintext `{ name, tags }`); an
|
|
127
|
+
* encrypting codec returns an opaque encryption envelope, so `name` / `tags`
|
|
128
|
+
* are never server-visible.
|
|
129
|
+
*
|
|
130
|
+
* @param input {object}
|
|
131
|
+
* @param input.custom {ResourceMetadataCustom} the plaintext user metadata
|
|
132
|
+
* @returns {Promise<{ custom: object }>} the value to store under `custom`
|
|
133
|
+
*/
|
|
134
|
+
encodeMeta(input: {
|
|
135
|
+
custom: ResourceMetadataCustom;
|
|
136
|
+
}): Promise<{
|
|
137
|
+
custom: object;
|
|
138
|
+
}>;
|
|
139
|
+
/**
|
|
140
|
+
* Inverts {@link encodeMeta}: transforms the stored `custom` value read from
|
|
141
|
+
* `.../meta` back into the caller's plaintext `{ name, tags }`. The identity
|
|
142
|
+
* codec returns `stored.custom ?? {}` unchanged; an encrypting codec decrypts
|
|
143
|
+
* the envelope. An absent `custom` (no metadata written) decodes to `{}`.
|
|
144
|
+
*
|
|
145
|
+
* @param stored {object}
|
|
146
|
+
* @param [stored.custom] {unknown} the stored `custom` value from `/meta`
|
|
147
|
+
* @returns {Promise<ResourceMetadataCustom>}
|
|
148
|
+
*/
|
|
149
|
+
decodeMeta(stored: {
|
|
150
|
+
custom?: unknown;
|
|
151
|
+
}): Promise<ResourceMetadataCustom>;
|
|
120
152
|
}
|
|
121
153
|
/**
|
|
122
154
|
* The keystore + codec factory for encrypted collections. Injected into
|
package/dist/codec.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAE5E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;;;OAQG;IACH,QAAQ,CAAC,YAAY,EAAE,WAAW,GAAG,WAAW,CAAA;IAEhD;;;;;;;;OAQG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAEpC;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,KAAK,EAAE;QACZ,EAAE,CAAC,EAAE,MAAM,CAAA;QACX,IAAI,EAAE,YAAY,CAAA;QAClB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAA;KAC9B,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IAEzB;;;;;;;OAOG;IACH,MAAM,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;IAEpD;;;;;;;;;;OAUG;IACH,UAAU,CAAC,KAAK,EAAE;QAChB,MAAM,EAAE,sBAAsB,CAAA;KAC/B,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAE/B;;;;;;;;;OASG;IACH,UAAU,CAAC,MAAM,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAA;CAC1E;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,KAAK,EAAE;QACd,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;QACpB,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,OAAO,CAAA;KACf,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;CAClC"}
|
package/dist/edv/EdvCodec.d.ts
CHANGED
|
@@ -38,22 +38,25 @@
|
|
|
38
38
|
* surfaces as a `PreconditionFailedError` (412) -- the lost-update guard --
|
|
39
39
|
* rather than the old advisory last-writer-wins. Against a backend that does
|
|
40
40
|
* not advertise `conditional-writes` (no ETag) it degrades to advisory.
|
|
41
|
-
* - **
|
|
42
|
-
* `
|
|
43
|
-
*
|
|
41
|
+
* - **Encrypted metadata.** `metadataMode` is `'encrypted'`, so a Resource's
|
|
42
|
+
* user-writable `custom` (`name`/`tags`, via `setName`/`setTags`/`setMeta`) is
|
|
43
|
+
* encrypted into an EDV Document envelope with the same `documentCipher` used
|
|
44
|
+
* for content and stored opaquely under `/meta`; the server never sees
|
|
45
|
+
* plaintext `name`/`tags`. A reader with the keys decrypts it back
|
|
46
|
+
* transparently via `meta()`.
|
|
44
47
|
*/
|
|
45
48
|
import { EdvClientCore } from '@interop/edv-client';
|
|
46
49
|
import type { HttpResponse } from '@interop/http-client';
|
|
47
50
|
import type { IKeyAgreementKey, IKeyResolver } from '@interop/data-integrity-core';
|
|
48
51
|
import type { EncodedWrite, EncryptionProvider, ResourceCodec } from '../codec.js';
|
|
49
|
-
import type { Json, ResourceData } from '../types.js';
|
|
52
|
+
import type { Json, ResourceData, ResourceMetadataCustom } from '../types.js';
|
|
50
53
|
/**
|
|
51
54
|
* A {@link ResourceCodec} that encrypts on write and decrypts on read using an
|
|
52
55
|
* `EdvClientCore`'s public `documentCipher`. One instance is bound per encrypted
|
|
53
56
|
* collection handle.
|
|
54
57
|
*/
|
|
55
58
|
export declare class EdvCodec implements ResourceCodec {
|
|
56
|
-
readonly
|
|
59
|
+
readonly metadataMode: "encrypted";
|
|
57
60
|
readonly conditionalWrites = true;
|
|
58
61
|
private readonly _edv;
|
|
59
62
|
private readonly _keyAgreementKey;
|
|
@@ -88,6 +91,31 @@ export declare class EdvCodec implements ResourceCodec {
|
|
|
88
91
|
data?: unknown;
|
|
89
92
|
json(): Promise<unknown>;
|
|
90
93
|
}): Promise<Json | Blob>;
|
|
94
|
+
/**
|
|
95
|
+
* @inheritdoc
|
|
96
|
+
*
|
|
97
|
+
* Encrypts the user-writable `custom` into an EDV Document envelope
|
|
98
|
+
* (`{ jwe, ... }`) with the same `documentCipher.encrypt` used for content --
|
|
99
|
+
* `custom` becomes the document `content`. The envelope's own `sequence` is
|
|
100
|
+
* inert (metadata concurrency is the server's plaintext `metaVersion`, not the
|
|
101
|
+
* envelope), so each write re-encrypts fresh with no `update`.
|
|
102
|
+
*/
|
|
103
|
+
encodeMeta({ custom }: {
|
|
104
|
+
custom: ResourceMetadataCustom;
|
|
105
|
+
}): Promise<{
|
|
106
|
+
custom: object;
|
|
107
|
+
}>;
|
|
108
|
+
/**
|
|
109
|
+
* @inheritdoc
|
|
110
|
+
*
|
|
111
|
+
* Decrypts the stored `custom` envelope back to plaintext `{ name, tags }`. An
|
|
112
|
+
* absent `custom` (no metadata written yet, or cleared) decodes to `{}`; a
|
|
113
|
+
* present value must be an EDV envelope (else {@link EncryptionError}, the
|
|
114
|
+
* `_assertEnvelope` guard), so a foreign plaintext `custom` fails closed.
|
|
115
|
+
*/
|
|
116
|
+
decodeMeta({ custom }: {
|
|
117
|
+
custom?: unknown;
|
|
118
|
+
}): Promise<ResourceMetadataCustom>;
|
|
91
119
|
/**
|
|
92
120
|
* Asserts that a document read from an encrypted collection is an EDV envelope
|
|
93
121
|
* (`{ jwe, ... }`) before it is handed to the cipher. A plaintext or foreign
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EdvCodec.d.ts","sourceRoot":"","sources":["../../src/edv/EdvCodec.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"EdvCodec.d.ts","sourceRoot":"","sources":["../../src/edv/EdvCodec.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAEV,gBAAgB,EAChB,YAAY,EACb,MAAM,8BAA8B,CAAA;AACrC,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACd,MAAM,aAAa,CAAA;AAQpB,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AA0D7E;;;;GAIG;AACH,qBAAa,QAAS,YAAW,aAAa;IAC5C,QAAQ,CAAC,YAAY,EAAG,WAAW,CAAS;IAC5C,QAAQ,CAAC,iBAAiB,QAAO;IAEjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IAEtC;;;;;;OAMG;gBACS,EACV,GAAG,EACH,eAAe,EACf,WAAW,EACX,YAAY,EACb,EAAE;QACD,GAAG,EAAE,aAAa,CAAA;QAClB,eAAe,EAAE,gBAAgB,CAAA;QACjC,WAAW,EAAE,MAAM,CAAA;QACnB,YAAY,EAAE,MAAM,CAAA;KACrB;IAOD;;OAEG;IACG,MAAM,CAAC,EACX,EAAE,EACF,IAAI,EACJ,WAAW,EACX,OAAO,EACR,EAAE;QACD,EAAE,CAAC,EAAE,MAAM,CAAA;QACX,IAAI,EAAE,YAAY,CAAA;QAClB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAA;KAC9B,GAAG,OAAO,CAAC,YAAY,CAAC;IAiEzB;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE;QACrB,IAAI,CAAC,EAAE,OAAO,CAAA;QACd,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;KACzB,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAYxB;;;;;;;;OAQG;IACG,UAAU,CAAC,EACf,MAAM,EACP,EAAE;QACD,MAAM,EAAE,sBAAsB,CAAA;KAC/B,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAmB/B;;;;;;;OAOG;IACG,UAAU,CAAC,EACf,MAAM,EACP,EAAE;QACD,MAAM,CAAC,EAAE,OAAO,CAAA;KACjB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAYnC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,eAAe;IAkBvB;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;YACW,WAAW;IAoEzB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,aAAa;CA+BtB;AAsBD;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,eAAe,EAAE,gBAAgB,CAAA;IACjC,WAAW,EAAE,YAAY,CAAA;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,WAAW,EACX,WAAkC,EAClC,YAAqC,EACtC,EAAE;IACD,WAAW,EAAE,CAAC,GAAG,EAAE;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,YAAY,EAAE,MAAM,CAAA;KACrB,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,GAAG,kBAAkB,CAyBrB"}
|
package/dist/edv/EdvCodec.js
CHANGED
|
@@ -38,9 +38,12 @@
|
|
|
38
38
|
* surfaces as a `PreconditionFailedError` (412) -- the lost-update guard --
|
|
39
39
|
* rather than the old advisory last-writer-wins. Against a backend that does
|
|
40
40
|
* not advertise `conditional-writes` (no ETag) it degrades to advisory.
|
|
41
|
-
* - **
|
|
42
|
-
* `
|
|
43
|
-
*
|
|
41
|
+
* - **Encrypted metadata.** `metadataMode` is `'encrypted'`, so a Resource's
|
|
42
|
+
* user-writable `custom` (`name`/`tags`, via `setName`/`setTags`/`setMeta`) is
|
|
43
|
+
* encrypted into an EDV Document envelope with the same `documentCipher` used
|
|
44
|
+
* for content and stored opaquely under `/meta`; the server never sees
|
|
45
|
+
* plaintext `name`/`tags`. A reader with the keys decrypts it back
|
|
46
|
+
* transparently via `meta()`.
|
|
44
47
|
*/
|
|
45
48
|
import { EdvClientCore } from '@interop/edv-client';
|
|
46
49
|
import { EncryptionError, ValidationError } from '../errors.js';
|
|
@@ -102,7 +105,7 @@ function base64ToBytes(base64) {
|
|
|
102
105
|
* collection handle.
|
|
103
106
|
*/
|
|
104
107
|
export class EdvCodec {
|
|
105
|
-
|
|
108
|
+
metadataMode = 'encrypted';
|
|
106
109
|
conditionalWrites = true;
|
|
107
110
|
_edv;
|
|
108
111
|
_keyAgreementKey;
|
|
@@ -192,6 +195,50 @@ export class EdvCodec {
|
|
|
192
195
|
});
|
|
193
196
|
return this._fromDocument(decrypted.content, decrypted.meta);
|
|
194
197
|
}
|
|
198
|
+
/**
|
|
199
|
+
* @inheritdoc
|
|
200
|
+
*
|
|
201
|
+
* Encrypts the user-writable `custom` into an EDV Document envelope
|
|
202
|
+
* (`{ jwe, ... }`) with the same `documentCipher.encrypt` used for content --
|
|
203
|
+
* `custom` becomes the document `content`. The envelope's own `sequence` is
|
|
204
|
+
* inert (metadata concurrency is the server's plaintext `metaVersion`, not the
|
|
205
|
+
* envelope), so each write re-encrypts fresh with no `update`.
|
|
206
|
+
*/
|
|
207
|
+
async encodeMeta({ custom }) {
|
|
208
|
+
const { documentCipher } = this._edv;
|
|
209
|
+
const recipients = documentCipher.createDefaultRecipients(this._keyAgreementKey);
|
|
210
|
+
// The document needs an EDV id (the cipher asserts one on decrypt). It is
|
|
211
|
+
// opaque to the server -- carried inside the un-decryptable envelope -- and
|
|
212
|
+
// minted fresh each write, since the metadata envelope is never updated in
|
|
213
|
+
// place (concurrency is the server's plaintext `metaVersion`, Decision 3).
|
|
214
|
+
const id = (await this._edv.generateId());
|
|
215
|
+
const encrypted = await documentCipher.encrypt({
|
|
216
|
+
doc: { id, content: custom },
|
|
217
|
+
recipients,
|
|
218
|
+
keyResolver: this._edv.keyResolver,
|
|
219
|
+
hmac: undefined
|
|
220
|
+
});
|
|
221
|
+
return { custom: encrypted };
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* @inheritdoc
|
|
225
|
+
*
|
|
226
|
+
* Decrypts the stored `custom` envelope back to plaintext `{ name, tags }`. An
|
|
227
|
+
* absent `custom` (no metadata written yet, or cleared) decodes to `{}`; a
|
|
228
|
+
* present value must be an EDV envelope (else {@link EncryptionError}, the
|
|
229
|
+
* `_assertEnvelope` guard), so a foreign plaintext `custom` fails closed.
|
|
230
|
+
*/
|
|
231
|
+
async decodeMeta({ custom }) {
|
|
232
|
+
if (custom === undefined || custom === null) {
|
|
233
|
+
return {};
|
|
234
|
+
}
|
|
235
|
+
this._assertEnvelope(custom, 'read');
|
|
236
|
+
const decrypted = await this._edv.documentCipher.decrypt({
|
|
237
|
+
encryptedDoc: custom,
|
|
238
|
+
keyAgreementKey: this._keyAgreementKey
|
|
239
|
+
});
|
|
240
|
+
return (decrypted.content ?? {});
|
|
241
|
+
}
|
|
195
242
|
/**
|
|
196
243
|
* Asserts that a document read from an encrypted collection is an EDV envelope
|
|
197
244
|
* (`{ jwe, ... }`) before it is handed to the cipher. A plaintext or foreign
|
package/dist/edv/EdvCodec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EdvCodec.js","sourceRoot":"","sources":["../../src/edv/EdvCodec.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"EdvCodec.js","sourceRoot":"","sources":["../../src/edv/EdvCodec.ts"],"names":[],"mappings":"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"}
|
package/dist/internal/codec.d.ts
CHANGED
|
@@ -70,7 +70,8 @@ export declare class CodecHolder {
|
|
|
70
70
|
* caller's `id` (so `put(id, ...)` is a `PUT` and `add(...)`, with no id, stays
|
|
71
71
|
* a server-minting `POST`) and reuses `prepareBody` -- including the
|
|
72
72
|
* filename-extension content-type guess when an id is present. `decode` reuses
|
|
73
|
-
* `parseResource`.
|
|
73
|
+
* `parseResource`. `encodeMeta` / `decodeMeta` are the identity transform, so
|
|
74
|
+
* metadata round-trips as server-visible plaintext byte-for-byte.
|
|
74
75
|
*/
|
|
75
76
|
export declare const identityCodec: ResourceCodec;
|
|
76
77
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/internal/codec.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAIjD,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/internal/codec.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAIjD,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,EAIN,MAAM,aAAa,CAAA;AAEpB;;;;;;;;;;GAUG;AACH,MAAM,MAAM,gBAAgB,GAC1B;IAAE,QAAQ,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,oBAAoB,CAAA;CAAE,CAAA;AAE7E;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CACxC,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,gBAAgB,CAAC,CAS3B;AAED;;;;;;GAMG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,CAAwB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IAEvD;;;OAGG;gBACS,OAAO,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC;IAIjD;;;;OAIG;IACH,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC;IAiB7B;;;;OAIG;IACH,KAAK,IAAI,IAAI;CAGd;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,EAAE,aAoC3B,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,aAAa,EACtB,EACE,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,UAAU,EACX,EAAE;IACD,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,UAAU,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAA;CAC5C,GACA,OAAO,CAAC,aAAa,CAAC,CA4CxB"}
|
package/dist/internal/codec.js
CHANGED
|
@@ -77,10 +77,11 @@ export class CodecHolder {
|
|
|
77
77
|
* caller's `id` (so `put(id, ...)` is a `PUT` and `add(...)`, with no id, stays
|
|
78
78
|
* a server-minting `POST`) and reuses `prepareBody` -- including the
|
|
79
79
|
* filename-extension content-type guess when an id is present. `decode` reuses
|
|
80
|
-
* `parseResource`.
|
|
80
|
+
* `parseResource`. `encodeMeta` / `decodeMeta` are the identity transform, so
|
|
81
|
+
* metadata round-trips as server-visible plaintext byte-for-byte.
|
|
81
82
|
*/
|
|
82
83
|
export const identityCodec = {
|
|
83
|
-
|
|
84
|
+
metadataMode: 'plaintext',
|
|
84
85
|
async encode({ id, data, contentType }) {
|
|
85
86
|
const prepared = prepareBody(data, { contentType, filename: id });
|
|
86
87
|
return {
|
|
@@ -92,6 +93,12 @@ export const identityCodec = {
|
|
|
92
93
|
},
|
|
93
94
|
async decode(response) {
|
|
94
95
|
return (await parseResource(response));
|
|
96
|
+
},
|
|
97
|
+
async encodeMeta({ custom }) {
|
|
98
|
+
return { custom };
|
|
99
|
+
},
|
|
100
|
+
async decodeMeta(stored) {
|
|
101
|
+
return (stored.custom ?? {});
|
|
95
102
|
}
|
|
96
103
|
};
|
|
97
104
|
/**
|
|
@@ -1 +1 @@
|
|
|
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,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/internal/codec.ts"],"names":[],"mappings":"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"}
|
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.11.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"build": "pnpm run clear && tsc",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"@interop/edv-client": "^17.3.1",
|
|
48
48
|
"@interop/ezcap": "^7.3.2",
|
|
49
49
|
"@interop/http-client": "^1.0.4",
|
|
50
|
-
"@interop/storage-core": "^0.3.
|
|
50
|
+
"@interop/storage-core": "^0.3.1"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@eslint/js": "^10.0.1",
|