@interop/was-client 0.52.0 → 0.54.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 +54 -12
- package/dist/Collection.d.ts +11 -7
- package/dist/Collection.d.ts.map +1 -1
- package/dist/Collection.js +21 -23
- package/dist/Collection.js.map +1 -1
- package/dist/Resource.d.ts +15 -0
- package/dist/Resource.d.ts.map +1 -1
- package/dist/Resource.js +4 -15
- package/dist/Resource.js.map +1 -1
- package/dist/Space.d.ts +54 -0
- package/dist/Space.d.ts.map +1 -1
- package/dist/Space.js +89 -7
- package/dist/Space.js.map +1 -1
- package/dist/edv/acquire.d.ts +98 -0
- package/dist/edv/acquire.d.ts.map +1 -0
- package/dist/edv/acquire.js +130 -0
- package/dist/edv/acquire.js.map +1 -0
- package/dist/edv/index.d.ts +35 -2
- package/dist/edv/index.d.ts.map +1 -1
- package/dist/edv/index.js +34 -2
- package/dist/edv/index.js.map +1 -1
- package/dist/edv/logGovernedDescriptorStore.d.ts.map +1 -1
- package/dist/edv/logGovernedDescriptorStore.js +4 -3
- package/dist/edv/logGovernedDescriptorStore.js.map +1 -1
- package/dist/edv/refresh.d.ts +62 -0
- package/dist/edv/refresh.d.ts.map +1 -0
- package/dist/edv/refresh.js +69 -0
- package/dist/edv/refresh.js.map +1 -0
- package/dist/edv/refreshingDocCipher.d.ts +70 -0
- package/dist/edv/refreshingDocCipher.d.ts.map +1 -0
- package/dist/edv/refreshingDocCipher.js +110 -0
- package/dist/edv/refreshingDocCipher.js.map +1 -0
- package/dist/errors.d.ts +4 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +4 -3
- package/dist/errors.js.map +1 -1
- package/dist/internal/content.d.ts +13 -0
- package/dist/internal/content.d.ts.map +1 -1
- package/dist/internal/content.js +16 -0
- package/dist/internal/content.js.map +1 -1
- package/dist/internal/describe.d.ts +16 -21
- package/dist/internal/describe.d.ts.map +1 -1
- package/dist/internal/describe.js +17 -25
- package/dist/internal/describe.js.map +1 -1
- package/dist/internal/request.d.ts +19 -0
- package/dist/internal/request.d.ts.map +1 -1
- package/dist/internal/request.js +26 -0
- package/dist/internal/request.js.map +1 -1
- package/dist/log/logStore.d.ts.map +1 -1
- package/dist/log/logStore.js +8 -20
- package/dist/log/logStore.js.map +1 -1
- package/dist/sync/index.d.ts +1 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -1
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/port.d.ts +5 -1
- package/dist/sync/port.d.ts.map +1 -1
- package/dist/sync/port.js +27 -11
- package/dist/sync/port.js.map +1 -1
- package/dist/sync/predicates.d.ts +21 -4
- package/dist/sync/predicates.d.ts.map +1 -1
- package/dist/sync/predicates.js +23 -4
- package/dist/sync/predicates.js.map +1 -1
- package/dist/sync/provisioning.d.ts +54 -18
- package/dist/sync/provisioning.d.ts.map +1 -1
- package/dist/sync/provisioning.js +123 -43
- package/dist/sync/provisioning.js.map +1 -1
- package/dist/sync/types.d.ts +23 -14
- package/dist/sync/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -96,4 +96,23 @@ export declare function readData<T>(context: ClientContext, { path, capability }
|
|
|
96
96
|
path: string;
|
|
97
97
|
capability?: IZcap;
|
|
98
98
|
}): Promise<T | null>;
|
|
99
|
+
/**
|
|
100
|
+
* {@link readData} keeping the response's `ETag` validator beside the body:
|
|
101
|
+
* the read-with-validator shape a description compare-and-swap starts from.
|
|
102
|
+
* `null` on the same conditions as `readData`; `etag` is absent against a
|
|
103
|
+
* server that does not version the target.
|
|
104
|
+
*
|
|
105
|
+
* @param context {ClientContext}
|
|
106
|
+
* @param options {object}
|
|
107
|
+
* @param options.path {string} the path to read
|
|
108
|
+
* @param [options.capability] {IZcap} capability attached to the request
|
|
109
|
+
* @returns {Promise<{ data: T; etag?: string } | null>}
|
|
110
|
+
*/
|
|
111
|
+
export declare function readDataWithEtag<T>(context: ClientContext, { path, capability }: {
|
|
112
|
+
path: string;
|
|
113
|
+
capability?: IZcap;
|
|
114
|
+
}): Promise<{
|
|
115
|
+
data: T;
|
|
116
|
+
etag?: string;
|
|
117
|
+
} | null>;
|
|
99
118
|
//# sourceMappingURL=request.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/internal/request.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/internal/request.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAKxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAEtD;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,kBAAkB,CAAA;CAChC;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAU,SAAQ,YAAY;IAC7C;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IACd;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAYD;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,YAAY,CAAC,CAavB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAC3C,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,OAAO,CAAA;CACf,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAiC/B;AAED;;;;;;;;GAQG;AACH,wBAAsB,IAAI,CACxB,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAS9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,OAAO,EAAE,aAAa,EACtB,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,CAAA;CAAE,GACzD,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAQnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,OAAO,EAAE,aAAa,EACtB,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,CAAA;CAAE,GACzD,OAAO,CAAC;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAY5C"}
|
package/dist/internal/request.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { mapError, httpStatus } from '../errors.js';
|
|
2
2
|
import { toUrl } from './paths.js';
|
|
3
3
|
import { dataOrNull } from './content.js';
|
|
4
|
+
import { readEtag } from './conditional.js';
|
|
4
5
|
function resolveRequestUrl(context, input) {
|
|
5
6
|
if (input.url !== undefined) {
|
|
6
7
|
return input.url;
|
|
@@ -122,4 +123,29 @@ export async function readData(context, { path, capability }) {
|
|
|
122
123
|
});
|
|
123
124
|
return dataOrNull(response);
|
|
124
125
|
}
|
|
126
|
+
/**
|
|
127
|
+
* {@link readData} keeping the response's `ETag` validator beside the body:
|
|
128
|
+
* the read-with-validator shape a description compare-and-swap starts from.
|
|
129
|
+
* `null` on the same conditions as `readData`; `etag` is absent against a
|
|
130
|
+
* server that does not version the target.
|
|
131
|
+
*
|
|
132
|
+
* @param context {ClientContext}
|
|
133
|
+
* @param options {object}
|
|
134
|
+
* @param options.path {string} the path to read
|
|
135
|
+
* @param [options.capability] {IZcap} capability attached to the request
|
|
136
|
+
* @returns {Promise<{ data: T; etag?: string } | null>}
|
|
137
|
+
*/
|
|
138
|
+
export async function readDataWithEtag(context, { path, capability }) {
|
|
139
|
+
const response = await send(context, {
|
|
140
|
+
path,
|
|
141
|
+
method: 'GET',
|
|
142
|
+
capability,
|
|
143
|
+
read: true
|
|
144
|
+
});
|
|
145
|
+
const data = dataOrNull(response);
|
|
146
|
+
if (data === null) {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
return { data, etag: readEtag(response) };
|
|
150
|
+
}
|
|
125
151
|
//# sourceMappingURL=request.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/internal/request.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/internal/request.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAkC3C,SAAS,iBAAiB,CAAC,OAAsB,EAAE,KAAgB;IACjE,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,GAAG,CAAA;IAClB,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,SAAS,CAAC,qCAAqC,CAAC,CAAA;IAC5D,CAAC;IACD,OAAO,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;AAClE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAsB,EACtB,KAAgB;IAEhB,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAA;IACpC,OAAO,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;QAChC,GAAG;QACH,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,MAAM;QACN,2EAA2E;QAC3E,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,MAAM;QAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAKrC;IACC,IAAI,QAAkB,CAAA;IACtB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK;YAC7B,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAA;IACrB,CAAC;IACD,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,QAAwB,CAAA;IACjC,CAAC;IACD,6EAA6E;IAC7E,0EAA0E;IAC1E,kEAAkE;IAClE,4DAA4D;IAC5D,IACE,KAAK,CAAC,IAAI;QACV,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG;YACtB,QAAQ,CAAC,MAAM,KAAK,GAAG;YACvB,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,EAC1B,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,0EAA0E;IAC1E,IAAI,IAAa,CAAA;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;AAC1E,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,OAAsB,EACtB,KAAgB;IAEhB,IAAI,CAAC;QACH,OAAO,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;YAChE,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAA;IACrB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,OAAsB,EACtB,EAAE,IAAI,EAAE,UAAU,EAAwC;IAE1D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE;QACnC,IAAI;QACJ,MAAM,EAAE,KAAK;QACb,UAAU;QACV,IAAI,EAAE,IAAI;KACX,CAAC,CAAA;IACF,OAAO,UAAU,CAAI,QAAQ,CAAC,CAAA;AAChC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAsB,EACtB,EAAE,IAAI,EAAE,UAAU,EAAwC;IAE1D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE;QACnC,IAAI;QACJ,MAAM,EAAE,KAAK;QACb,UAAU;QACV,IAAI,EAAE,IAAI;KACX,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,UAAU,CAAI,QAAQ,CAAC,CAAA;IACpC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAA;AAC3C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logStore.d.ts","sourceRoot":"","sources":["../../src/log/logStore.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"logStore.d.ts","sourceRoot":"","sources":["../../src/log/logStore.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C,OAAO,EAAW,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAElE,OAAO,EAAE,gBAAgB,EAAE,CAAA;AAwD3B;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EACH;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,UAAU,CAAC,EAAE,SAAS,CAAA;CAAE,GAC9C;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,GACnD,gBAAgB,CA0FlB"}
|
package/dist/log/logStore.js
CHANGED
|
@@ -31,14 +31,12 @@
|
|
|
31
31
|
*/
|
|
32
32
|
import { ResourceLogConflictError, parseResourceLog, serializeResourceLog, serializeResourceLogEntry } from '@interop/vh-resource-log';
|
|
33
33
|
import { PreconditionFailedError, ValidationError } from '../errors.js';
|
|
34
|
-
import {
|
|
35
|
-
import { ENCODER, LOG_CONTENT_TYPE, isBlob } from '../internal/content.js';
|
|
34
|
+
import { ENCODER, LOG_CONTENT_TYPE } from '../internal/content.js';
|
|
36
35
|
export { LOG_CONTENT_TYPE };
|
|
37
36
|
/**
|
|
38
|
-
* The Resource host: `getWithEtag` (so the codec runs and
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* `text()`; `blobText` falls back to `FileReader`).
|
|
37
|
+
* The Resource host: `getWithEtag({ as: 'text' })` (so the codec runs and
|
|
38
|
+
* the content layer projects the decoded body to text) and `put` with the
|
|
39
|
+
* log content type.
|
|
42
40
|
*
|
|
43
41
|
* @param resource {Resource}
|
|
44
42
|
* @returns {LogTarget}
|
|
@@ -46,20 +44,10 @@ export { LOG_CONTENT_TYPE };
|
|
|
46
44
|
function resourceTarget(resource) {
|
|
47
45
|
return {
|
|
48
46
|
async read() {
|
|
49
|
-
const current = await resource.getWithEtag();
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const body = isBlob(current.data)
|
|
54
|
-
? await blobText(current.data)
|
|
55
|
-
: typeof current.data === 'string'
|
|
56
|
-
? current.data
|
|
57
|
-
: undefined;
|
|
58
|
-
if (body === undefined) {
|
|
59
|
-
throw new ValidationError(`Cannot read resource log: the resource "${resource.id}" does not ` +
|
|
60
|
-
'hold a text body (is it stored as JSON instead of JSON Lines?).');
|
|
61
|
-
}
|
|
62
|
-
return { body, etag: current.etag };
|
|
47
|
+
const current = await resource.getWithEtag({ as: 'text' });
|
|
48
|
+
return current === null
|
|
49
|
+
? null
|
|
50
|
+
: { body: current.data, etag: current.etag };
|
|
63
51
|
},
|
|
64
52
|
async put(body, precondition) {
|
|
65
53
|
await resource.put(ENCODER.encode(body), {
|
package/dist/log/logStore.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logStore.js","sourceRoot":"","sources":["../../src/log/logStore.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,yBAAyB,EAE1B,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACvE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"logStore.js","sourceRoot":"","sources":["../../src/log/logStore.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/index.d.ts
CHANGED
|
@@ -45,7 +45,7 @@ export { contentCid, cidFrom, deriveSpaceId } from './cid.js';
|
|
|
45
45
|
export { isEncryptedEnvelope } from './envelope.js';
|
|
46
46
|
export { createPlaintextDocCipher } from './plaintextCipher.js';
|
|
47
47
|
export { ensureSpace, ensureSpaceAndCollection } from './provisioning.js';
|
|
48
|
-
export { isSyncAuthError, isSyncConflictError, isSyncNotFoundError, isUnknownEpochError } from './predicates.js';
|
|
48
|
+
export { isSyncAuthError, isSyncConflictError, isSyncNotFoundError, isKeyUnwrapError, isUnknownEpochError } from './predicates.js';
|
|
49
49
|
export { EncryptionError, KeyUnwrapError, UnknownEpochError, WasSyncAuthError, WasSyncConflictError, WasSyncNotFoundError } from '../errors.js';
|
|
50
50
|
export type { Json, SyncCheckpoint, WireDoc, SyncPage, MasterState, WriteAck, SyncStatus, WasSyncPort, DocCipher } from './types.js';
|
|
51
51
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/sync/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAI1E,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,cAAc,CAAA;AAErB,YAAY,EACV,IAAI,EACJ,cAAc,EACd,OAAO,EACP,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,UAAU,EACV,WAAW,EACX,SAAS,EACV,MAAM,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAI1E,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,cAAc,CAAA;AAErB,YAAY,EACV,IAAI,EACJ,cAAc,EACd,OAAO,EACP,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,UAAU,EACV,WAAW,EACX,SAAS,EACV,MAAM,YAAY,CAAA"}
|
package/dist/sync/index.js
CHANGED
|
@@ -48,6 +48,6 @@ export { contentCid, cidFrom, deriveSpaceId } from './cid.js';
|
|
|
48
48
|
export { isEncryptedEnvelope } from './envelope.js';
|
|
49
49
|
export { createPlaintextDocCipher } from './plaintextCipher.js';
|
|
50
50
|
export { ensureSpace, ensureSpaceAndCollection } from './provisioning.js';
|
|
51
|
-
export { isSyncAuthError, isSyncConflictError, isSyncNotFoundError, isUnknownEpochError } from './predicates.js';
|
|
51
|
+
export { isSyncAuthError, isSyncConflictError, isSyncNotFoundError, isKeyUnwrapError, isUnknownEpochError } from './predicates.js';
|
|
52
52
|
export { EncryptionError, KeyUnwrapError, UnknownEpochError, WasSyncAuthError, WasSyncConflictError, WasSyncNotFoundError } from '../errors.js';
|
|
53
53
|
//# sourceMappingURL=index.js.map
|
package/dist/sync/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAC1E,sEAAsE;AACtE,6EAA6E;AAC7E,SAAS;AACT,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,cAAc,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAC1E,sEAAsE;AACtE,6EAA6E;AAC7E,SAAS;AACT,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,cAAc,CAAA"}
|
package/dist/sync/port.d.ts
CHANGED
|
@@ -81,7 +81,11 @@ export declare function parseEtag(etag: string | null | undefined): number | und
|
|
|
81
81
|
* `404` is a modeled outcome rather than an anomaly: `deleteContent` resolves
|
|
82
82
|
* (the tombstone's goal state already holds -- an idempotent delete), and `get`
|
|
83
83
|
* resolves `null` (absent or tombstoned -- the deletion-wins input its callers
|
|
84
|
-
* depend on).
|
|
84
|
+
* depend on). A `putMeta` `404` is ambiguous by design: it is either the
|
|
85
|
+
* masked authorization failure or a delete race (the resource was deleted by
|
|
86
|
+
* another replica after this one read it), and the option maps it to a
|
|
87
|
+
* {@link WasSyncAuthError} whose `status` a push loop can corroborate against
|
|
88
|
+
* a re-read. Revoked access still surfaces within one poll on `query` and on
|
|
85
89
|
* the content/metadata writes.
|
|
86
90
|
*
|
|
87
91
|
* @param options {object}
|
package/dist/sync/port.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../src/sync/port.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEhD,OAAO,EACL,gBAAgB,EAGjB,MAAM,4BAA4B,CAAA;AAWnC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../src/sync/port.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEhD,OAAO,EACL,gBAAgB,EAGjB,MAAM,4BAA4B,CAAA;AAWnC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,EAIV,WAAW,EAEZ,MAAM,YAAY,CAAA;AAEnB;;;;;GAKG;AACH,OAAO,EAAE,gBAAgB,EAAE,CAAA;AAyG3B;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAW7E;AAwBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,OAAO,EACP,YAAY,EACZ,UAAU,EACV,aAAqB,EACtB,EAAE;IACD,GAAG,EAAE,SAAS,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,KAAK,CAAA;IAClB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,GAAG,WAAW,CA6Nd"}
|
package/dist/sync/port.js
CHANGED
|
@@ -66,12 +66,13 @@ function isPortSignal(mapped) {
|
|
|
66
66
|
* (so a status outside this list -- a `500`, a `507` quota-exceeded -- still
|
|
67
67
|
* leaves the sync subpath typed and carrying the server's problem details).
|
|
68
68
|
* A rejected precondition becomes a {@link WasSyncConflictError} for every
|
|
69
|
-
* write. `notFound` opts in to the not-found mapping, which
|
|
70
|
-
* `
|
|
71
|
-
* delete
|
|
69
|
+
* write. `notFound` opts in to the not-found mapping, which `deleteContent`
|
|
70
|
+
* and `putMeta` perform on the default port (an already-gone target is a
|
|
71
|
+
* settled outcome for a delete and a delete race for a metadata write, but a
|
|
72
|
+
* hard error for a content write). `authErrors` is
|
|
72
73
|
* the port's `mapAuthErrors` option: it maps `401` / `403` / the masked `404`
|
|
73
74
|
* to a {@link WasSyncAuthError}. `notFound` is checked first, so a port that
|
|
74
|
-
* asked for both still gets the
|
|
75
|
+
* asked for both still gets the not-found signal.
|
|
75
76
|
*
|
|
76
77
|
* @param err {unknown} the caught error
|
|
77
78
|
* @param [options] {object}
|
|
@@ -161,7 +162,11 @@ function versionedEtag(response) {
|
|
|
161
162
|
* `404` is a modeled outcome rather than an anomaly: `deleteContent` resolves
|
|
162
163
|
* (the tombstone's goal state already holds -- an idempotent delete), and `get`
|
|
163
164
|
* resolves `null` (absent or tombstoned -- the deletion-wins input its callers
|
|
164
|
-
* depend on).
|
|
165
|
+
* depend on). A `putMeta` `404` is ambiguous by design: it is either the
|
|
166
|
+
* masked authorization failure or a delete race (the resource was deleted by
|
|
167
|
+
* another replica after this one read it), and the option maps it to a
|
|
168
|
+
* {@link WasSyncAuthError} whose `status` a push loop can corroborate against
|
|
169
|
+
* a re-read. Revoked access still surfaces within one poll on `query` and on
|
|
165
170
|
* the content/metadata writes.
|
|
166
171
|
*
|
|
167
172
|
* @param options {object}
|
|
@@ -228,10 +233,19 @@ export function createWasSyncPort({ was, spaceId, collectionId, capability, mapA
|
|
|
228
233
|
const { etag, version } = versionedEtag(response);
|
|
229
234
|
return { version: version ?? 0, etag };
|
|
230
235
|
};
|
|
236
|
+
// The signals `deleteContent` and `putMeta` ask `mapWriteError` for: the
|
|
237
|
+
// not-found mapping on the default port, the auth mapping under
|
|
238
|
+
// `mapAuthErrors`.
|
|
239
|
+
const writeSignals = { notFound: !mapAuthErrors, authErrors: mapAuthErrors };
|
|
231
240
|
return {
|
|
232
241
|
async query({ checkpoint, limit }) {
|
|
233
242
|
try {
|
|
234
|
-
|
|
243
|
+
// The feed's bodies are parsed JSON, so the shared page's `unknown`
|
|
244
|
+
// bodies narrow to the `Json` the port contract promises.
|
|
245
|
+
return (await changesCollection.changes({
|
|
246
|
+
checkpoint,
|
|
247
|
+
limit
|
|
248
|
+
}));
|
|
235
249
|
}
|
|
236
250
|
catch (err) {
|
|
237
251
|
// The pull path is where revoked access surfaces reliably: unlike a
|
|
@@ -283,10 +297,7 @@ export function createWasSyncPort({ was, spaceId, collectionId, capability, mapA
|
|
|
283
297
|
if (mapAuthErrors && mapped instanceof NotFoundError) {
|
|
284
298
|
return undefined;
|
|
285
299
|
}
|
|
286
|
-
mapWriteError(mapped,
|
|
287
|
-
notFound: !mapAuthErrors,
|
|
288
|
-
authErrors: mapAuthErrors
|
|
289
|
-
});
|
|
300
|
+
mapWriteError(mapped, writeSignals);
|
|
290
301
|
}
|
|
291
302
|
},
|
|
292
303
|
async putMeta({ id, custom, ifMatch, ifNoneMatch }) {
|
|
@@ -307,7 +318,12 @@ export function createWasSyncPort({ was, spaceId, collectionId, capability, mapA
|
|
|
307
318
|
return etag !== undefined ? { version: version ?? 0, etag } : undefined;
|
|
308
319
|
}
|
|
309
320
|
catch (err) {
|
|
310
|
-
|
|
321
|
+
// A `/meta` write against a nonexistent resource legitimately `404`s
|
|
322
|
+
// (the resource was deleted by another replica after this one read
|
|
323
|
+
// it), so the default port raises the not-found signal a push loop
|
|
324
|
+
// can corroborate. Under `mapAuthErrors` the masked `404` stays the
|
|
325
|
+
// auth signal, `status` telling the two apart.
|
|
326
|
+
mapWriteError(err, writeSignals);
|
|
311
327
|
}
|
|
312
328
|
},
|
|
313
329
|
async get({ id }) {
|
package/dist/sync/port.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"port.js","sourceRoot":"","sources":["../../src/sync/port.ts"],"names":[],"mappings":"AAuCA,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACb,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,EACL,QAAQ,EACR,aAAa,EACb,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"port.js","sourceRoot":"","sources":["../../src/sync/port.ts"],"names":[],"mappings":"AAuCA,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACb,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,EACL,QAAQ,EACR,aAAa,EACb,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,cAAc,CAAA;AAWrB;;;;;GAKG;AACH,OAAO,EAAE,gBAAgB,EAAE,CAAA;AAE3B;;;;;;GAMG;AACH,MAAM,kBAAkB,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;AAEpD;;;;;;;GAOG;AACH,SAAS,YAAY,CAAC,MAA0B;IAC9C,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAA;AAC3D,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,aAAa,CAAC,MAAgB;IACrC,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM;KAC9B,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,YAAY,CAAC,MAAgB;IACpC,OAAO,CACL,MAAM,YAAY,oBAAoB;QACtC,MAAM,YAAY,oBAAoB;QACtC,MAAM,YAAY,gBAAgB,CACnC,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAS,aAAa,CACpB,GAAY,EACZ,EACE,QAAQ,GAAG,KAAK,EAChB,UAAU,GAAG,KAAK,KAC8B,EAAE;IAEpD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;IAC5B,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,MAAM,CAAA;IACd,CAAC;IACD,IAAI,QAAQ,IAAI,MAAM,YAAY,aAAa,EAAE,CAAC;QAChD,MAAM,IAAI,oBAAoB,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;IACvE,CAAC;IACD,IAAI,MAAM,YAAY,uBAAuB,EAAE,CAAC;QAC9C,MAAM,IAAI,oBAAoB,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;IACvE,CAAC;IACD,IAAI,UAAU,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;IAClE,CAAC;IACD,MAAM,MAAM,CAAA;AACd,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,SAAS,CAAC,IAA+B;IACvD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IACzC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;QACnB,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAA;IAC/C,OAAO,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACpE,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,aAAa,CAAC,QAAsB;IAI3C,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAC/B,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC/B,OAAO;QACL,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC;QACnC,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,CAAC;KAC1C,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAChC,GAAG,EACH,OAAO,EACP,YAAY,EACZ,UAAU,EACV,aAAa,GAAG,KAAK,EAOtB;IACC,wEAAwE;IACxE,sEAAsE;IACtE,MAAM,WAAW,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,CAAA;IAC3E,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,CAAA;IAExE,0EAA0E;IAC1E,sEAAsE;IACtE,uDAAuD;IACvD,MAAM,iBAAiB,GAAG,GAAG;SAC1B,KAAK,CAAC,OAAO,CAAC;SACd,UAAU,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;IAE3C,iFAAiF;IACjF,MAAM,WAAW,GAAG,KAAK,EAAE,EAAU,EAA+B,EAAE;QACpE,IAAI,QAAsB,CAAA;QAC1B,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC;gBAC3B,UAAU;gBACV,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;gBACrB,MAAM,EAAE,KAAK;aACd,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;YAC5B,yDAAyD;YACzD,yEAAyE;YACzE,oBAAoB;YACpB,IAAI,MAAM,YAAY,aAAa,EAAE,CAAC;gBACpC,OAAO,IAAI,CAAA;YACb,CAAC;YACD,IAAI,aAAa,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjD,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;YAClE,CAAC;YACD,MAAM,MAAM,CAAA;QACd,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;QACjD,OAAO;YACL,OAAO,EAAE,OAAO,IAAI,CAAC;YACrB,IAAI;YACJ,SAAS,EAAE,kBAAkB;YAC7B,IAAI,EAAE,QAAQ,CAAC,IAAY;SAC5B,CAAA;IACH,CAAC,CAAA;IAED;;;;;;OAMG;IACH,MAAM,QAAQ,GAAG,CAAC,QAAsB,EAAY,EAAE;QACpD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;QACjD,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,CAAA;IACxC,CAAC,CAAA;IAED,yEAAyE;IACzE,gEAAgE;IAChE,mBAAmB;IACnB,MAAM,YAAY,GAAG,EAAE,QAAQ,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,CAAA;IAE5E,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE;YAC/B,IAAI,CAAC;gBACH,oEAAoE;gBACpE,0DAA0D;gBAC1D,OAAO,CAAC,MAAM,iBAAiB,CAAC,OAAO,CAAC;oBACtC,UAAU;oBACV,KAAK;iBACN,CAAC,CAAa,CAAA;YACjB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,oEAAoE;gBACpE,uEAAuE;gBACvE,2DAA2D;gBAC3D,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;gBAC5B,IAAI,aAAa,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;oBACjD,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;gBAClE,CAAC;gBACD,MAAM,MAAM,CAAA;YACd,CAAC;QACH,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE;YACxD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC;oBACjC,UAAU;oBACV,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;oBACrB,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,IAAc;oBACpB,OAAO,EAAE,YAAY,CAAC;wBACpB,YAAY,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE;wBACtC,KAAK;qBACN,CAAC;iBACH,CAAC,CAAA;gBACF,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAC3B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,aAAa,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAA;YACnD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE;YACjC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC;oBACjC,UAAU;oBACV,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;oBACrB,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE,YAAY,CAAC,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;iBACrD,CAAC,CAAA;gBACF,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAC3B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,uEAAuE;gBACvE,uEAAuE;gBACvE,sEAAsE;gBACtE,4DAA4D;gBAC5D,mEAAmE;gBACnE,mEAAmE;gBACnE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;gBAC5B,IAAI,aAAa,IAAI,MAAM,YAAY,aAAa,EAAE,CAAC;oBACrD,OAAO,SAAS,CAAA;gBAClB,CAAC;gBACD,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;YACrC,CAAC;QACH,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE;YAChD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC;oBACjC,UAAU;oBACV,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;oBAClB,MAAM,EAAE,KAAK;oBACb,qEAAqE;oBACrE,+DAA+D;oBAC/D,+DAA+D;oBAC/D,oEAAoE;oBACpE,4DAA4D;oBAC5D,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE;oBAC5C,OAAO,EAAE,YAAY,CAAC,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC;iBAClE,CAAC,CAAA;gBACF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;gBACjD,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;YACzE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,qEAAqE;gBACrE,mEAAmE;gBACnE,mEAAmE;gBACnE,oEAAoE;gBACpE,+CAA+C;gBAC/C,aAAa,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;YAClC,CAAC;QACH,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE;YACd,wEAAwE;YACxE,0EAA0E;YAC1E,0EAA0E;YAC1E,4CAA4C;YAC5C,MAAM,QAAQ,GAAG,GAAG;iBACjB,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;iBAC1D,IAAI,CACH,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAa,EAAE,QAAQ,EAAE,CAAC,EAC7C,CAAC,GAAY,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAc,EAAE,GAAG,EAAE,CAAC,CAChD,CAAA;YAEH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAA;YACpC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,OAAO,IAAI,CAAA,CAAC,uDAAuD;YACrE,CAAC;YAED,sEAAsE;YACtE,wEAAwE;YACxE,wEAAwE;YACxE,2DAA2D;YAC3D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAA;YAC3B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACb,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACjC,oEAAoE;gBACpE,qEAAqE;gBACrE,aAAa;gBACb,IAAI,MAAM,YAAY,aAAa,EAAE,CAAC;oBACpC,OAAO,MAAM,CAAA;gBACf,CAAC;gBACD,IAAI,aAAa,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;oBACjD,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;gBAClE,CAAC;gBACD,MAAM,MAAM,CAAA;YACd,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAOlB,CAAA;YACb,IAAI,QAAQ,EAAE,SAAS,EAAE,CAAC;gBACxB,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAA;YACvC,CAAC;YACD,IAAI,QAAQ,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;gBACtC,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAA;YACvC,CAAC;YACD,IAAI,QAAQ,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;gBAClC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;YAC/B,CAAC;YACD,IAAI,QAAQ,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;gBACnC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA;YACjC,CAAC;YACD,iEAAiE;YACjE,yEAAyE;YACzE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,aAAa,CAC5D,IAAI,CAAC,QAAQ,CACd,CAAA;YACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAA;YAC5B,CAAC;YACD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,CAAC,WAAW,GAAG,WAAW,CAAA;YAClC,CAAC;YAED,OAAO,MAAM,CAAA;QACf,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
* The `err.name` predicates that classify the errors a replication path can
|
|
6
6
|
* meet: the port's two wire signals (`WasSyncConflictError` /
|
|
7
7
|
* `WasSyncNotFoundError`), its opt-in revoked-access signal
|
|
8
|
-
* (`WasSyncAuthError`), and the cipher's
|
|
9
|
-
* (`UnknownEpochError`)
|
|
8
|
+
* (`WasSyncAuthError`), and the cipher's two no-key signals: the
|
|
9
|
+
* stale-descriptor one (`UnknownEpochError`) and the not-a-recipient one
|
|
10
|
+
* (`KeyUnwrapError`).
|
|
10
11
|
*
|
|
11
12
|
* They live beside the classes that assign the names they match (`errors.ts`)
|
|
12
13
|
* because every one of those errors is raised inside a seam the consuming app
|
|
@@ -36,8 +37,10 @@
|
|
|
36
37
|
export declare function isSyncConflictError(err: unknown): boolean;
|
|
37
38
|
/**
|
|
38
39
|
* Whether an error is the replication port's absent-target signal
|
|
39
|
-
* (`WasSyncNotFoundError`, HTTP 404)
|
|
40
|
-
*
|
|
40
|
+
* (`WasSyncNotFoundError`, HTTP 404), raised by the default port's
|
|
41
|
+
* `deleteContent` and `putMeta`. On a delete that is a settled outcome --
|
|
42
|
+
* already gone, or the write never reached the server -- not a conflict. On a
|
|
43
|
+
* metadata write it marks a race with a remote delete.
|
|
41
44
|
*
|
|
42
45
|
* @param err {unknown}
|
|
43
46
|
* @returns {boolean}
|
|
@@ -64,4 +67,18 @@ export declare function isSyncAuthError(err: unknown): boolean;
|
|
|
64
67
|
* @returns {boolean}
|
|
65
68
|
*/
|
|
66
69
|
export declare function isUnknownEpochError(err: unknown): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Whether an error is the cipher's not-a-recipient signal (`KeyUnwrapError`):
|
|
72
|
+
* the envelope's epoch IS on the descriptor this reader holds, but the reader
|
|
73
|
+
* has no key for it -- never a recipient of that epoch, or removed and the
|
|
74
|
+
* epoch rotated since. Real data, unreadable by this reader, and never
|
|
75
|
+
* garbage: a caller scanning rows skips such a row and leaves it in place,
|
|
76
|
+
* where a scan that missed the class would drop it into an undecryptable
|
|
77
|
+
* bucket a host is entitled to purge. Re-reading the descriptor cannot help,
|
|
78
|
+
* which is what tells it from `isUnknownEpochError`.
|
|
79
|
+
*
|
|
80
|
+
* @param err {unknown} the caught error
|
|
81
|
+
* @returns {boolean}
|
|
82
|
+
*/
|
|
83
|
+
export declare function isKeyUnwrapError(err: unknown): boolean;
|
|
67
84
|
//# sourceMappingURL=predicates.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"predicates.d.ts","sourceRoot":"","sources":["../../src/sync/predicates.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"predicates.d.ts","sourceRoot":"","sources":["../../src/sync/predicates.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAaH;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAErD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEzD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEtD"}
|
package/dist/sync/predicates.js
CHANGED
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
* The `err.name` predicates that classify the errors a replication path can
|
|
6
6
|
* meet: the port's two wire signals (`WasSyncConflictError` /
|
|
7
7
|
* `WasSyncNotFoundError`), its opt-in revoked-access signal
|
|
8
|
-
* (`WasSyncAuthError`), and the cipher's
|
|
9
|
-
* (`UnknownEpochError`)
|
|
8
|
+
* (`WasSyncAuthError`), and the cipher's two no-key signals: the
|
|
9
|
+
* stale-descriptor one (`UnknownEpochError`) and the not-a-recipient one
|
|
10
|
+
* (`KeyUnwrapError`).
|
|
10
11
|
*
|
|
11
12
|
* They live beside the classes that assign the names they match (`errors.ts`)
|
|
12
13
|
* because every one of those errors is raised inside a seam the consuming app
|
|
@@ -48,8 +49,10 @@ export function isSyncConflictError(err) {
|
|
|
48
49
|
}
|
|
49
50
|
/**
|
|
50
51
|
* Whether an error is the replication port's absent-target signal
|
|
51
|
-
* (`WasSyncNotFoundError`, HTTP 404)
|
|
52
|
-
*
|
|
52
|
+
* (`WasSyncNotFoundError`, HTTP 404), raised by the default port's
|
|
53
|
+
* `deleteContent` and `putMeta`. On a delete that is a settled outcome --
|
|
54
|
+
* already gone, or the write never reached the server -- not a conflict. On a
|
|
55
|
+
* metadata write it marks a race with a remote delete.
|
|
53
56
|
*
|
|
54
57
|
* @param err {unknown}
|
|
55
58
|
* @returns {boolean}
|
|
@@ -82,4 +85,20 @@ export function isSyncAuthError(err) {
|
|
|
82
85
|
export function isUnknownEpochError(err) {
|
|
83
86
|
return nameOf(err) === 'UnknownEpochError';
|
|
84
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Whether an error is the cipher's not-a-recipient signal (`KeyUnwrapError`):
|
|
90
|
+
* the envelope's epoch IS on the descriptor this reader holds, but the reader
|
|
91
|
+
* has no key for it -- never a recipient of that epoch, or removed and the
|
|
92
|
+
* epoch rotated since. Real data, unreadable by this reader, and never
|
|
93
|
+
* garbage: a caller scanning rows skips such a row and leaves it in place,
|
|
94
|
+
* where a scan that missed the class would drop it into an undecryptable
|
|
95
|
+
* bucket a host is entitled to purge. Re-reading the descriptor cannot help,
|
|
96
|
+
* which is what tells it from `isUnknownEpochError`.
|
|
97
|
+
*
|
|
98
|
+
* @param err {unknown} the caught error
|
|
99
|
+
* @returns {boolean}
|
|
100
|
+
*/
|
|
101
|
+
export function isKeyUnwrapError(err) {
|
|
102
|
+
return nameOf(err) === 'KeyUnwrapError';
|
|
103
|
+
}
|
|
85
104
|
//# sourceMappingURL=predicates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"predicates.js","sourceRoot":"","sources":["../../src/sync/predicates.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"predicates.js","sourceRoot":"","sources":["../../src/sync/predicates.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;;;;;GAMG;AACH,SAAS,MAAM,CAAC,GAAY;IAC1B,OAAQ,GAAiC,EAAE,IAAI,CAAA;AACjD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,sBAAsB,CAAA;AAC/C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,sBAAsB,CAAA;AAC/C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,kBAAkB,CAAA;AAC3C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,mBAAmB,CAAA;AAC5C,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,gBAAgB,CAAA;AACzC,CAAC"}
|
|
@@ -15,13 +15,19 @@
|
|
|
15
15
|
* every encrypted collection must carry before any read or write routes
|
|
16
16
|
* (epoch-from-birth) -- is installed by the EDV-bearing second step,
|
|
17
17
|
* `ensureFirstEpoch` in `@interop/was-client/edv`.
|
|
18
|
+
*
|
|
19
|
+
* Three collection modes: `'edv'` (the client-written encryption descriptor),
|
|
20
|
+
* `'plaintext'` (no descriptor), and `'governed'` (a Collection whose
|
|
21
|
+
* `encryption` member the server derives from its history log). A `'governed'`
|
|
22
|
+
* collection is created descriptor-less here and declared governed afterwards,
|
|
23
|
+
* by the caller's guarded create of the log.
|
|
18
24
|
*/
|
|
19
|
-
import type { SpaceDescription } from '../types.js';
|
|
25
|
+
import type { IZcap, SpaceDescription } from '../types.js';
|
|
20
26
|
import type { WasClient } from '../WasClient.js';
|
|
21
27
|
/**
|
|
22
28
|
* Ensures the controller's Space exists and one synced collection is
|
|
23
29
|
* configured, without overwriting anything already there. The Space is
|
|
24
|
-
* described first and
|
|
30
|
+
* described first and created only when absent -- an existing Space keeps
|
|
25
31
|
* its name AND its controller, so `controllerDid` is used only at creation
|
|
26
32
|
* (a joined client re-running this never rewrites the description). The
|
|
27
33
|
* collection likewise: when absent, an `'edv'` collection is created with the
|
|
@@ -29,16 +35,29 @@ import type { WasClient } from '../WasClient.js';
|
|
|
29
35
|
* the server stores only ciphertext it can never decrypt and validates every
|
|
30
36
|
* write against the declared envelope wire format -- the same version the
|
|
31
37
|
* cipher binds into each envelope's AEAD-protected header, so descriptor and
|
|
32
|
-
* envelopes cannot drift; a `'plaintext'` collection is created
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
38
|
+
* envelopes cannot drift; a `'plaintext'` or `'governed'` collection is created
|
|
39
|
+
* without one. Both creates are guarded (`If-None-Match: *`), so two clients
|
|
40
|
+
* booting at once cannot both create, and the loser adopts the winner's
|
|
41
|
+
* description instead of failing. Against a server that ignores the
|
|
42
|
+
* precondition the create is an unconditional upsert, and the loser of a race
|
|
43
|
+
* can overwrite the winner's display name; the server merges the rest of the
|
|
44
|
+
* winner's description forward.
|
|
45
|
+
*
|
|
46
|
+
* An existing collection that lacks the descriptor an `'edv'` spec calls for
|
|
36
47
|
* gets the late in-place declaration (set-once on the server); one that
|
|
37
48
|
* already carries a descriptor -- possibly with appended key epochs -- is
|
|
38
|
-
* left untouched, epochs and display name included.
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
49
|
+
* left untouched, epochs and display name included. An existing `'governed'`
|
|
50
|
+
* collection is never written to: the server refuses to govern a Description
|
|
51
|
+
* that carries a client-written descriptor (`encryption-immutable`), and a
|
|
52
|
+
* governed Collection's served `encryption` is the derived member, which a
|
|
53
|
+
* Description PUT may not carry (`encryption-history-log-governed`). So an
|
|
54
|
+
* existing collection whose descriptor is client-written (no `history`
|
|
55
|
+
* member) cannot become governed, and a `'governed'` spec over it throws
|
|
56
|
+
* `ValidationError` here rather than letting the caller's log create fail
|
|
57
|
+
* with the server's 409. A public collection gets the collection-level
|
|
58
|
+
* world-read grant (`setPublic`, what makes a resource URL in it resolve for
|
|
59
|
+
* anyone) only when its policy does not already say so. Every request invokes
|
|
60
|
+
* the root capability, or `capability` when the caller holds a delegated one.
|
|
42
61
|
*
|
|
43
62
|
* @param options {object}
|
|
44
63
|
* @param options.was {WasClient}
|
|
@@ -46,7 +65,14 @@ import type { WasClient } from '../WasClient.js';
|
|
|
46
65
|
* @param options.controllerDid {string} the Space controller (e.g. `did:key`);
|
|
47
66
|
* used only when the Space does not exist yet
|
|
48
67
|
* @param options.collectionId {string} the WAS collection id
|
|
49
|
-
* @param [options.encryption] {'edv' | 'plaintext'
|
|
68
|
+
* @param [options.encryption] {'edv' | 'plaintext' | 'governed'} how the
|
|
69
|
+
* collection's `encryption` member is settled; defaults to `'edv'`.
|
|
70
|
+
* `'edv'` declares the descriptor here, `'plaintext'` declares none, and
|
|
71
|
+
* `'governed'` leaves the member to the server, which derives it from the
|
|
72
|
+
* collection's history log. Declaring that governance is the caller's next
|
|
73
|
+
* step, through the log's guarded create --
|
|
74
|
+
* `logGovernedDescriptorStore(...).create` or
|
|
75
|
+
* `resourceLogStore({ collection }).create`
|
|
50
76
|
* @param [options.isPublic] {boolean} grant collection-level world read
|
|
51
77
|
* @param [options.spaceName] {string} the Space display name, applied only at
|
|
52
78
|
* Space creation; defaults to `'WAS Space'`
|
|
@@ -60,29 +86,36 @@ import type { WasClient } from '../WasClient.js';
|
|
|
60
86
|
* be `spaceId` -- a description of some other Space throws
|
|
61
87
|
* `ValidationError`, since skipping the ensure would leave that Space
|
|
62
88
|
* unprovisioned
|
|
89
|
+
* @param [options.capability] {IZcap} an invocation capability every
|
|
90
|
+
* request rides (a delegated Space-subtree zcap, say); the root capability
|
|
91
|
+
* is invoked otherwise. A capability scoped below the bare Space URL cannot
|
|
92
|
+
* reach the Space half, so a caller holding one supplies `spaceDescription`
|
|
63
93
|
* @returns {Promise<void>}
|
|
64
94
|
*/
|
|
65
|
-
export declare function ensureSpaceAndCollection({ was, spaceId, controllerDid, collectionId, encryption, isPublic, spaceName, collectionName, spaceDescription }: {
|
|
95
|
+
export declare function ensureSpaceAndCollection({ was, spaceId, controllerDid, collectionId, encryption, isPublic, spaceName, collectionName, spaceDescription, capability }: {
|
|
66
96
|
was: WasClient;
|
|
67
97
|
spaceId: string;
|
|
68
98
|
controllerDid: string;
|
|
69
99
|
collectionId: string;
|
|
70
|
-
encryption?: 'edv' | 'plaintext';
|
|
100
|
+
encryption?: 'edv' | 'plaintext' | 'governed';
|
|
71
101
|
isPublic?: boolean;
|
|
72
102
|
spaceName?: string;
|
|
73
103
|
collectionName?: string;
|
|
74
104
|
spaceDescription?: SpaceDescription;
|
|
105
|
+
capability?: IZcap;
|
|
75
106
|
}): Promise<void>;
|
|
76
107
|
/**
|
|
77
108
|
* Ensures the controller's Space exists, without overwriting anything already
|
|
78
109
|
* there -- the Space half of {@link ensureSpaceAndCollection}, split out so a
|
|
79
110
|
* caller provisioning SEVERAL collections into one Space pays for it once
|
|
80
111
|
* rather than once per collection. An existing Space keeps its name AND its
|
|
81
|
-
* controller, so `controllerDid` is used only at creation.
|
|
112
|
+
* controller, so `controllerDid` is used only at creation. The create is
|
|
113
|
+
* guarded (`If-None-Match: *`), so a Space created concurrently keeps its
|
|
114
|
+
* `type` array (accepted at creation only) and is adopted by the loser.
|
|
82
115
|
*
|
|
83
|
-
* Costs one `GET` on a settled Space, and one `GET` plus one `PUT`
|
|
84
|
-
*
|
|
85
|
-
*
|
|
116
|
+
* Costs one `GET` on a settled Space, and one `GET` plus one guarded `PUT`
|
|
117
|
+
* (`If-None-Match: *`) on a fresh one; a lost create race costs one more `GET`
|
|
118
|
+
* to adopt the winner.
|
|
86
119
|
*
|
|
87
120
|
* @param options {object}
|
|
88
121
|
* @param options.was {WasClient}
|
|
@@ -91,14 +124,17 @@ export declare function ensureSpaceAndCollection({ was, spaceId, controllerDid,
|
|
|
91
124
|
* `did:key`); used only when the Space does not exist yet
|
|
92
125
|
* @param [options.spaceName] {string} the Space display name, applied only at
|
|
93
126
|
* Space creation; defaults to `'WAS Space'`
|
|
127
|
+
* @param [options.capability] {IZcap} an invocation capability both
|
|
128
|
+
* requests ride; the root capability is invoked otherwise
|
|
94
129
|
* @returns {Promise<SpaceDescription>} the Space's description, existing or
|
|
95
130
|
* just written -- pass it to {@link ensureSpaceAndCollection} as
|
|
96
131
|
* `spaceDescription` so each collection skips the Space ensure
|
|
97
132
|
*/
|
|
98
|
-
export declare function ensureSpace({ was, spaceId, controllerDid, spaceName }: {
|
|
133
|
+
export declare function ensureSpace({ was, spaceId, controllerDid, spaceName, capability }: {
|
|
99
134
|
was: WasClient;
|
|
100
135
|
spaceId: string;
|
|
101
136
|
controllerDid: string;
|
|
102
137
|
spaceName?: string;
|
|
138
|
+
capability?: IZcap;
|
|
103
139
|
}): Promise<SpaceDescription>;
|
|
104
140
|
//# sourceMappingURL=provisioning.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provisioning.d.ts","sourceRoot":"","sources":["../../src/sync/provisioning.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"provisioning.d.ts","sourceRoot":"","sources":["../../src/sync/provisioning.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAEV,KAAK,EACL,gBAAgB,EACjB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAkGhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AACH,wBAAsB,wBAAwB,CAAC,EAC7C,GAAG,EACH,OAAO,EACP,aAAa,EACb,YAAY,EACZ,UAAkB,EAClB,QAAgB,EAChB,SAA8B,EAC9B,cAA6B,EAC7B,gBAAgB,EAChB,UAAU,EACX,EAAE;IACD,GAAG,EAAE,SAAS,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,UAAU,CAAA;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,UAAU,CAAC,EAAE,KAAK,CAAA;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuGhB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,WAAW,CAAC,EAChC,GAAG,EACH,OAAO,EACP,aAAa,EACb,SAA8B,EAC9B,UAAU,EACX,EAAE;IACD,GAAG,EAAE,SAAS,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,KAAK,CAAA;CACnB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqB5B"}
|