@interop/was-react 0.8.2 → 0.8.3
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 -0
- package/dist/auth/chapi.d.ts.map +1 -1
- package/dist/auth/chapi.js +11 -1
- package/dist/auth/chapi.js.map +1 -1
- package/dist/auth/loginFlow.d.ts.map +1 -1
- package/dist/auth/loginFlow.js +16 -6
- package/dist/auth/loginFlow.js.map +1 -1
- package/dist/auth/verifyResponse.d.ts.map +1 -1
- package/dist/auth/verifyResponse.js +23 -6
- package/dist/auth/verifyResponse.js.map +1 -1
- package/dist/session/authStore.d.ts.map +1 -1
- package/dist/session/authStore.js +110 -23
- package/dist/session/authStore.js.map +1 -1
- package/dist/storage/localStore.d.ts.map +1 -1
- package/dist/storage/localStore.js +32 -7
- package/dist/storage/localStore.js.map +1 -1
- package/dist/storage/rehydrate.d.ts.map +1 -1
- package/dist/storage/rehydrate.js +20 -4
- package/dist/storage/rehydrate.js.map +1 -1
- package/dist/storage/sharedCollectionReader.d.ts.map +1 -1
- package/dist/storage/sharedCollectionReader.js +18 -1
- package/dist/storage/sharedCollectionReader.js.map +1 -1
- package/dist/storage/syncController.d.ts.map +1 -1
- package/dist/storage/syncController.js +32 -1
- package/dist/storage/syncController.js.map +1 -1
- package/dist/sync/changesQuery.d.ts.map +1 -1
- package/dist/sync/changesQuery.js +3 -0
- package/dist/sync/changesQuery.js.map +1 -1
- package/dist/sync/docCipher.d.ts +6 -1
- package/dist/sync/docCipher.d.ts.map +1 -1
- package/dist/sync/docCipher.js.map +1 -1
- package/dist/sync/feedMasterPort.d.ts.map +1 -1
- package/dist/sync/feedMasterPort.js +3 -0
- package/dist/sync/feedMasterPort.js.map +1 -1
- package/dist/sync/lww.d.ts +12 -4
- package/dist/sync/lww.d.ts.map +1 -1
- package/dist/sync/lww.js +32 -5
- package/dist/sync/lww.js.map +1 -1
- package/dist/sync/lwwConflictHandler.d.ts +12 -4
- package/dist/sync/lwwConflictHandler.d.ts.map +1 -1
- package/dist/sync/lwwConflictHandler.js +35 -14
- package/dist/sync/lwwConflictHandler.js.map +1 -1
- package/dist/sync/pushWrites.d.ts +3 -1
- package/dist/sync/pushWrites.d.ts.map +1 -1
- package/dist/sync/pushWrites.js +101 -40
- package/dist/sync/pushWrites.js.map +1 -1
- package/dist/sync/syncedDocSchema.d.ts.map +1 -1
- package/dist/sync/syncedDocSchema.js +3 -0
- package/dist/sync/syncedDocSchema.js.map +1 -1
- package/dist/sync/types.d.ts +35 -11
- package/dist/sync/types.d.ts.map +1 -1
- package/dist/sync/types.js.map +1 -1
- package/dist/sync/wasSyncPort.d.ts.map +1 -1
- package/dist/sync/wasSyncPort.js +12 -3
- package/dist/sync/wasSyncPort.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lwwConflictHandler.d.ts","sourceRoot":"","sources":["../../src/sync/lwwConflictHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"lwwConflictHandler.d.ts","sourceRoot":"","sources":["../../src/sync/lwwConflictHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAGjD;;GAEG;AACH,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAkDD;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,CAAC,QAAQ,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,EAC1C,WAAW,GAAE,CACX,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,UAAU,KACd,OAA2B;eAQnB,WAAW,CAAC,SAAS,CAAC,KAAK,WAAW,CAAC,SAAS,CAAC,GAAG,OAAO;uEAcnE;QACD,eAAe,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;QACvC,gBAAgB,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;QACxC,kBAAkB,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;KAC5C,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;EAiFtC"}
|
|
@@ -6,24 +6,25 @@ function bodiesEqual(a, b) {
|
|
|
6
6
|
return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
|
-
* Decrypts one side's envelope into its
|
|
10
|
-
* when the side has no decryptable payload (a tombstone, or an absent/corrupt
|
|
11
|
-
* body). `null` means "no comparable timestamp", handled by the caller.
|
|
9
|
+
* Decrypts one side's envelope into its LWW comparability (see {@link LwwSide}).
|
|
12
10
|
*/
|
|
13
11
|
async function lwwFieldsOf(doc, decrypt) {
|
|
14
12
|
if (doc._deleted || doc.data === undefined) {
|
|
15
|
-
return
|
|
13
|
+
return { kind: 'none' };
|
|
16
14
|
}
|
|
17
15
|
try {
|
|
18
16
|
const payload = (await decrypt(doc.data));
|
|
19
17
|
if (typeof payload.updatedAt === 'string' &&
|
|
20
18
|
typeof payload.clientId === 'string') {
|
|
21
|
-
return {
|
|
19
|
+
return {
|
|
20
|
+
kind: 'payload',
|
|
21
|
+
payload: { updatedAt: payload.updatedAt, clientId: payload.clientId }
|
|
22
|
+
};
|
|
22
23
|
}
|
|
23
|
-
return
|
|
24
|
+
return { kind: 'none' };
|
|
24
25
|
}
|
|
25
|
-
catch {
|
|
26
|
-
return
|
|
26
|
+
catch (err) {
|
|
27
|
+
return { kind: 'undecryptable', err };
|
|
27
28
|
}
|
|
28
29
|
}
|
|
29
30
|
/**
|
|
@@ -83,16 +84,36 @@ export function makeLwwConflictHandler(decrypt, payloadWins = remotePayloadWins)
|
|
|
83
84
|
lwwFieldsOf(realMasterState, decrypt),
|
|
84
85
|
lwwFieldsOf(newDocumentState, decrypt)
|
|
85
86
|
]);
|
|
86
|
-
// Rule 3 --
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
// Rule 3 -- an undecryptable side is never scored as the loser: it is
|
|
88
|
+
// presumed newer (typically an envelope under an unseen key epoch), not
|
|
89
|
+
// absent. Logged so it is distinguishable from a genuine tombstone.
|
|
90
|
+
if (remote.kind === 'undecryptable' || local.kind === 'undecryptable') {
|
|
91
|
+
if (remote.kind === 'undecryptable' && local.kind !== 'undecryptable') {
|
|
92
|
+
console.warn('LWW conflict: the remote master did not decrypt; adopting it ' +
|
|
93
|
+
'rather than re-pushing the local payload over it.', remote.err);
|
|
94
|
+
return realMasterState;
|
|
95
|
+
}
|
|
96
|
+
if (local.kind === 'undecryptable' && remote.kind !== 'undecryptable') {
|
|
97
|
+
console.warn('LWW conflict: the local row did not decrypt; re-asserting it ' +
|
|
98
|
+
'rather than dropping the local edit for the master.', local.err);
|
|
99
|
+
return newDocumentState;
|
|
100
|
+
}
|
|
101
|
+
console.warn('LWW conflict: neither side decrypted; adopting the master ' +
|
|
102
|
+
'(deterministic and convergent).', remote.kind === 'undecryptable' ? remote.err : undefined);
|
|
103
|
+
return realMasterState;
|
|
104
|
+
}
|
|
105
|
+
// Rule 4 -- both sides comparable: pure payload LWW.
|
|
106
|
+
if (remote.kind === 'payload' && local.kind === 'payload') {
|
|
107
|
+
return payloadWins(remote.payload, local.payload)
|
|
108
|
+
? realMasterState
|
|
109
|
+
: newDocumentState;
|
|
89
110
|
}
|
|
90
|
-
// Rule
|
|
111
|
+
// Rule 5 -- a live local edit against a remote tombstone (or otherwise
|
|
91
112
|
// incomparable remote): keep the edit (resurrect / re-assert the write).
|
|
92
|
-
if (local &&
|
|
113
|
+
if (local.kind === 'payload' && remote.kind === 'none') {
|
|
93
114
|
return newDocumentState;
|
|
94
115
|
}
|
|
95
|
-
// Rule
|
|
116
|
+
// Rule 6 -- everything else (a local tombstone racing a REAL remote
|
|
96
117
|
// content change, or both incomparable): the master wins, which is
|
|
97
118
|
// deterministic and convergent across replicas (the edit survives the
|
|
98
119
|
// delete on every device).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lwwConflictHandler.js","sourceRoot":"","sources":["../../src/sync/lwwConflictHandler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lwwConflictHandler.js","sourceRoot":"","sources":["../../src/sync/lwwConflictHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
* - content changed -> `PUT /:id` (`If-Match: "<version>"`) or, on create,
|
|
15
15
|
* `PUT /:id` (`If-None-Match: *`); a delete -> `DELETE /:id`.
|
|
16
16
|
* - metadata changed -> `PUT /:id/meta` (`If-Match: "<metaVersion>"`, or
|
|
17
|
-
* `If-None-Match: *` when the resource has no metadata yet)
|
|
17
|
+
* `If-None-Match: *` when the resource has no metadata yet); a metadata
|
|
18
|
+
* CLEAR (the new state carries no `custom`) writes the cleared state rather
|
|
19
|
+
* than being skipped.
|
|
18
20
|
*
|
|
19
21
|
* Content is written before metadata on a create, because the server rejects a
|
|
20
22
|
* `/meta` write to a resource that does not yet exist.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pushWrites.d.ts","sourceRoot":"","sources":["../../src/sync/pushWrites.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"pushWrites.d.ts","sourceRoot":"","sources":["../../src/sync/pushWrites.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAqB,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG3E;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AA+OD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,WAAW,EACjB,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,IAGpD,MAAM,KAAK,CAAC;IACV,gBAAgB,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;IACxC,kBAAkB,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;CAC5C,CAAC,KACD,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,CAoBrC"}
|
package/dist/sync/pushWrites.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { WasSyncConflictError } from './types.js';
|
|
1
|
+
import { WasSyncAuthError, WasSyncConflictError } from './types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Formats a master revision (`version` or `metaVersion`) as the quoted strong
|
|
4
4
|
* ETag the server compares `If-Match` against (revision `3` becomes `"3"`).
|
|
@@ -24,6 +24,30 @@ export function formatEtag(revision) {
|
|
|
24
24
|
function bodiesEqual(left, right) {
|
|
25
25
|
return JSON.stringify(left ?? null) === JSON.stringify(right ?? null);
|
|
26
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Maps a re-read master state into the RxDB conflict entry for one row.
|
|
29
|
+
*/
|
|
30
|
+
function masterToConflict(id, master) {
|
|
31
|
+
const conflict = {
|
|
32
|
+
id,
|
|
33
|
+
updatedAt: master.updatedAt,
|
|
34
|
+
version: master.version,
|
|
35
|
+
_deleted: master.deleted
|
|
36
|
+
};
|
|
37
|
+
if (master.data !== undefined) {
|
|
38
|
+
conflict.data = master.data;
|
|
39
|
+
}
|
|
40
|
+
if (master.metaVersion !== undefined) {
|
|
41
|
+
conflict.metaVersion = master.metaVersion;
|
|
42
|
+
}
|
|
43
|
+
if (master.custom !== undefined) {
|
|
44
|
+
conflict.custom = master.custom;
|
|
45
|
+
}
|
|
46
|
+
if (master.epoch !== undefined) {
|
|
47
|
+
conflict.epoch = master.epoch;
|
|
48
|
+
}
|
|
49
|
+
return conflict;
|
|
50
|
+
}
|
|
27
51
|
/**
|
|
28
52
|
* Builds the RxDB conflict entry (the real current master state) for a row whose
|
|
29
53
|
* conditional write was rejected with `412`. Re-reads the resource; when it is
|
|
@@ -47,28 +71,15 @@ async function assembleConflict({ port, id, fallbackUpdatedAt, fallbackVersion }
|
|
|
47
71
|
_deleted: true
|
|
48
72
|
};
|
|
49
73
|
}
|
|
50
|
-
|
|
51
|
-
id,
|
|
52
|
-
updatedAt: master.updatedAt,
|
|
53
|
-
version: master.version,
|
|
54
|
-
_deleted: master.deleted
|
|
55
|
-
};
|
|
56
|
-
if (master.data !== undefined) {
|
|
57
|
-
conflict.data = master.data;
|
|
58
|
-
}
|
|
59
|
-
if (master.metaVersion !== undefined) {
|
|
60
|
-
conflict.metaVersion = master.metaVersion;
|
|
61
|
-
}
|
|
62
|
-
if (master.custom !== undefined) {
|
|
63
|
-
conflict.custom = master.custom;
|
|
64
|
-
}
|
|
65
|
-
return conflict;
|
|
74
|
+
return masterToConflict(id, master);
|
|
66
75
|
}
|
|
67
76
|
/**
|
|
68
77
|
* Sends one local change to the remote Collection as up to two conditional
|
|
69
78
|
* writes (content, then metadata). Returns the master-state conflict entry on a
|
|
70
|
-
* `412` at either step
|
|
71
|
-
*
|
|
79
|
+
* `412` at either step, or the accepted writes' acked revisions on success
|
|
80
|
+
* (`ack: null` when no response carried a revision). A conflict on the
|
|
81
|
+
* metadata half still returns the content half's earned ack alongside the
|
|
82
|
+
* conflict entry, so an accepted content version is never discarded.
|
|
72
83
|
*
|
|
73
84
|
* @param options {object}
|
|
74
85
|
* @param options.port {WasSyncPort}
|
|
@@ -81,8 +92,23 @@ async function pushRow({ port, newDocumentState, assumedMasterState }) {
|
|
|
81
92
|
const { id } = newDocumentState;
|
|
82
93
|
const assumedVersion = assumedMasterState?.version;
|
|
83
94
|
const isCreate = assumedMasterState === undefined;
|
|
95
|
+
const ack = { id };
|
|
96
|
+
const hasAck = () => ack.version !== undefined || ack.metaVersion !== undefined;
|
|
97
|
+
// Builds the conflict outcome for a 412 at either half, PRESERVING any ack
|
|
98
|
+
// already earned: a content write accepted before a `/meta` 412 must keep its
|
|
99
|
+
// acked `version` (and feed it to the re-read fallback), or the local row
|
|
100
|
+
// keeps the pre-write version and every later conditional write sends a
|
|
101
|
+
// stale `If-Match`.
|
|
102
|
+
const conflictResult = async () => {
|
|
103
|
+
const conflict = await assembleConflict({
|
|
104
|
+
port,
|
|
105
|
+
id,
|
|
106
|
+
fallbackUpdatedAt: newDocumentState.updatedAt,
|
|
107
|
+
fallbackVersion: ack.version ?? assumedVersion ?? newDocumentState.version
|
|
108
|
+
});
|
|
109
|
+
return { conflict, ack: hasAck() ? ack : null };
|
|
110
|
+
};
|
|
84
111
|
try {
|
|
85
|
-
const ack = { id };
|
|
86
112
|
if (newDocumentState._deleted) {
|
|
87
113
|
// Delete supersedes any metadata write: drop the content, tombstone wins.
|
|
88
114
|
const ackedVersion = await port.deleteContent({
|
|
@@ -104,6 +130,9 @@ async function pushRow({ port, newDocumentState, assumedMasterState }) {
|
|
|
104
130
|
const ackedVersion = await port.putContent({
|
|
105
131
|
id,
|
|
106
132
|
data: newDocumentState.data ?? null,
|
|
133
|
+
...(newDocumentState.epoch !== undefined && {
|
|
134
|
+
epoch: newDocumentState.epoch
|
|
135
|
+
}),
|
|
107
136
|
...(isCreate
|
|
108
137
|
? { ifNoneMatch: true }
|
|
109
138
|
: assumedVersion !== undefined && {
|
|
@@ -114,14 +143,29 @@ async function pushRow({ port, newDocumentState, assumedMasterState }) {
|
|
|
114
143
|
ack.version = ackedVersion;
|
|
115
144
|
}
|
|
116
145
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
if (err instanceof WasSyncConflictError) {
|
|
149
|
+
return await conflictResult();
|
|
150
|
+
}
|
|
151
|
+
// Any non-conflict error (network, 5xx, auth) propagates so RxDB retries
|
|
152
|
+
// the whole batch with backoff.
|
|
153
|
+
throw err;
|
|
154
|
+
}
|
|
155
|
+
// Metadata half: write when the metadata changed -- including a CLEAR (the
|
|
156
|
+
// new state carries no `custom` while the assumed master does; `putMeta`
|
|
157
|
+
// with no `custom` writes the cleared state). On a create this runs after
|
|
158
|
+
// the content write (the resource must exist first). Its own try/catch so a
|
|
159
|
+
// rejection here can never discard an ack the content half already earned.
|
|
160
|
+
const metadataChanged = !bodiesEqual(newDocumentState.custom, assumedMasterState?.custom);
|
|
161
|
+
if (metadataChanged) {
|
|
162
|
+
try {
|
|
121
163
|
const assumedMetaVersion = assumedMasterState?.metaVersion;
|
|
122
164
|
const ackedMetaVersion = await port.putMeta({
|
|
123
165
|
id,
|
|
124
|
-
|
|
166
|
+
...(newDocumentState.custom !== undefined && {
|
|
167
|
+
custom: newDocumentState.custom
|
|
168
|
+
}),
|
|
125
169
|
...(assumedMetaVersion !== undefined
|
|
126
170
|
? { ifMatch: formatEtag(assumedMetaVersion) }
|
|
127
171
|
: { ifNoneMatch: true })
|
|
@@ -130,23 +174,40 @@ async function pushRow({ port, newDocumentState, assumedMasterState }) {
|
|
|
130
174
|
ack.metaVersion = ackedMetaVersion;
|
|
131
175
|
}
|
|
132
176
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
177
|
+
catch (err) {
|
|
178
|
+
if (err instanceof WasSyncConflictError) {
|
|
179
|
+
return await conflictResult();
|
|
180
|
+
}
|
|
181
|
+
// Corroborate before condemnation: under WAS 404-masking a `/meta` 404
|
|
182
|
+
// is ambiguous -- expired access, or an ordinary race with a remote
|
|
183
|
+
// delete (a PUT to the `/meta` of a nonexistent resource legitimately
|
|
184
|
+
// 404s). An independent request decides: re-read the master off the
|
|
185
|
+
// changes feed. A feed read that is itself denied rethrows its own auth
|
|
186
|
+
// error (access genuinely expired, so the controller escalates); a feed
|
|
187
|
+
// that answers with an absent/deleted master confirms the delete race,
|
|
188
|
+
// and the row is resolved with that tombstone as the conflict entry
|
|
189
|
+
// (the conflict handler reconciles it) instead of flipping the whole
|
|
190
|
+
// session to "access expired" and wedging the batch in RxDB's retries.
|
|
191
|
+
if (err instanceof WasSyncAuthError && err.status === 404) {
|
|
192
|
+
const master = await port.get({ id });
|
|
193
|
+
if (master === null || master.deleted) {
|
|
194
|
+
const conflict = master
|
|
195
|
+
? masterToConflict(id, master)
|
|
196
|
+
: {
|
|
197
|
+
id,
|
|
198
|
+
updatedAt: newDocumentState.updatedAt,
|
|
199
|
+
version: ack.version ?? assumedVersion ?? newDocumentState.version,
|
|
200
|
+
_deleted: true
|
|
201
|
+
};
|
|
202
|
+
return { conflict, ack: hasAck() ? ack : null };
|
|
203
|
+
}
|
|
204
|
+
// The resource is alive and readable while its `/meta` write 404s:
|
|
205
|
+
// the write itself was rejected, so the auth signal stands.
|
|
206
|
+
}
|
|
207
|
+
throw err;
|
|
145
208
|
}
|
|
146
|
-
// Any non-conflict error (network, 5xx, auth) propagates so RxDB retries
|
|
147
|
-
// the whole batch with backoff.
|
|
148
|
-
throw err;
|
|
149
209
|
}
|
|
210
|
+
return { conflict: null, ack: hasAck() ? ack : null };
|
|
150
211
|
}
|
|
151
212
|
/**
|
|
152
213
|
* Builds the RxDB push handler that fans a batch of local changes out to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pushWrites.js","sourceRoot":"","sources":["../../src/sync/pushWrites.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pushWrites.js","sourceRoot":"","sources":["../../src/sync/pushWrites.ts"],"names":[],"mappings":"AAoCA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAcnE;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,IAAI,QAAQ,GAAG,CAAA;AACxB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,WAAW,CAAC,IAAsB,EAAE,KAAuB;IAClE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAA;AACvE,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,EAAU,EACV,MAAmB;IAEnB,MAAM,QAAQ,GAA2B;QACvC,EAAE;QACF,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,OAAO;KACzB,CAAA;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IAC7B,CAAC;IACD,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACrC,QAAQ,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAA;IAC3C,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IACjC,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;IAC/B,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,KAAK,UAAU,gBAAgB,CAAC,EAC9B,IAAI,EACJ,EAAE,EACF,iBAAiB,EACjB,eAAe,EAMhB;IACC,MAAM,MAAM,GAAuB,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACzD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO;YACL,EAAE;YACF,SAAS,EAAE,iBAAiB;YAC5B,OAAO,EAAE,eAAe;YACxB,QAAQ,EAAE,IAAI;SACf,CAAA;IACH,CAAC;IACD,OAAO,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;AACrC,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,OAAO,CAAC,EACrB,IAAI,EACJ,gBAAgB,EAChB,kBAAkB,EAKnB;IAIC,MAAM,EAAE,EAAE,EAAE,GAAG,gBAAgB,CAAA;IAC/B,MAAM,cAAc,GAAG,kBAAkB,EAAE,OAAO,CAAA;IAClD,MAAM,QAAQ,GAAG,kBAAkB,KAAK,SAAS,CAAA;IACjD,MAAM,GAAG,GAAiB,EAAE,EAAE,EAAE,CAAA;IAChC,MAAM,MAAM,GAAG,GAAG,EAAE,CAClB,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,CAAA;IAE5D,2EAA2E;IAC3E,8EAA8E;IAC9E,0EAA0E;IAC1E,wEAAwE;IACxE,oBAAoB;IACpB,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;QAChC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC;YACtC,IAAI;YACJ,EAAE;YACF,iBAAiB,EAAE,gBAAgB,CAAC,SAAS;YAC7C,eAAe,EAAE,GAAG,CAAC,OAAO,IAAI,cAAc,IAAI,gBAAgB,CAAC,OAAO;SAC3E,CAAC,CAAA;QACF,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACjD,CAAC,CAAA;IAED,IAAI,CAAC;QACH,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC;YAC9B,0EAA0E;YAC1E,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC;gBAC5C,EAAE;gBACF,GAAG,CAAC,cAAc,KAAK,SAAS,IAAI;oBAClC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC;iBACpC,CAAC;aACH,CAAC,CAAA;YACF,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC/B,GAAG,CAAC,OAAO,GAAG,YAAY,CAAA;YAC5B,CAAC;YACD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACxE,CAAC;QAED,yEAAyE;QACzE,yEAAyE;QACzE,2DAA2D;QAC3D,MAAM,cAAc,GAClB,QAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAA;QAC3E,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;gBACzC,EAAE;gBACF,IAAI,EAAE,gBAAgB,CAAC,IAAI,IAAI,IAAI;gBACnC,GAAG,CAAC,gBAAgB,CAAC,KAAK,KAAK,SAAS,IAAI;oBAC1C,KAAK,EAAE,gBAAgB,CAAC,KAAK;iBAC9B,CAAC;gBACF,GAAG,CAAC,QAAQ;oBACV,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE;oBACvB,CAAC,CAAC,cAAc,KAAK,SAAS,IAAI;wBAC9B,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC;qBACpC,CAAC;aACP,CAAC,CAAA;YACF,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC/B,GAAG,CAAC,OAAO,GAAG,YAAY,CAAA;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,oBAAoB,EAAE,CAAC;YACxC,OAAO,MAAM,cAAc,EAAE,CAAA;QAC/B,CAAC;QACD,yEAAyE;QACzE,gCAAgC;QAChC,MAAM,GAAG,CAAA;IACX,CAAC;IAED,2EAA2E;IAC3E,yEAAyE;IACzE,0EAA0E;IAC1E,4EAA4E;IAC5E,2EAA2E;IAC3E,MAAM,eAAe,GAAG,CAAC,WAAW,CAClC,gBAAgB,CAAC,MAAM,EACvB,kBAAkB,EAAE,MAAM,CAC3B,CAAA;IACD,IAAI,eAAe,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,kBAAkB,GAAG,kBAAkB,EAAE,WAAW,CAAA;YAC1D,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;gBAC1C,EAAE;gBACF,GAAG,CAAC,gBAAgB,CAAC,MAAM,KAAK,SAAS,IAAI;oBAC3C,MAAM,EAAE,gBAAgB,CAAC,MAAM;iBAChC,CAAC;gBACF,GAAG,CAAC,kBAAkB,KAAK,SAAS;oBAClC,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,kBAAkB,CAAC,EAAE;oBAC7C,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;aAC3B,CAAC,CAAA;YACF,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACnC,GAAG,CAAC,WAAW,GAAG,gBAAgB,CAAA;YACpC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,oBAAoB,EAAE,CAAC;gBACxC,OAAO,MAAM,cAAc,EAAE,CAAA;YAC/B,CAAC;YACD,uEAAuE;YACvE,oEAAoE;YACpE,sEAAsE;YACtE,oEAAoE;YACpE,wEAAwE;YACxE,wEAAwE;YACxE,uEAAuE;YACvE,oEAAoE;YACpE,qEAAqE;YACrE,uEAAuE;YACvE,IAAI,GAAG,YAAY,gBAAgB,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC1D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;gBACrC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACtC,MAAM,QAAQ,GAAG,MAAM;wBACrB,CAAC,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC;wBAC9B,CAAC,CAAC;4BACE,EAAE;4BACF,SAAS,EAAE,gBAAgB,CAAC,SAAS;4BACrC,OAAO,EACL,GAAG,CAAC,OAAO,IAAI,cAAc,IAAI,gBAAgB,CAAC,OAAO;4BAC3D,QAAQ,EAAE,IAAI;yBACf,CAAA;oBACL,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;gBACjD,CAAC;gBACD,mEAAmE;gBACnE,4DAA4D;YAC9D,CAAC;YACD,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;AACvD,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAiB,EACjB,eAAsD;IAEtD,OAAO,KAAK,UAAU,IAAI,CACxB,IAGE;QAEF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;YACnB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;gBAC3B,IAAI;gBACJ,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;gBACtC,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;aAC3C,CAAC,CAAA;YACF,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;gBACzD,MAAM,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACnC,CAAC;YACD,OAAO,MAAM,CAAA;QACf,CAAC,CAAC,CACH,CAAA;QACD,OAAO,OAAO;aACX,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;aAC9B,MAAM,CACL,CAAC,QAAQ,EAAsC,EAAE,CAAC,QAAQ,KAAK,IAAI,CACpE,CAAA;IACL,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncedDocSchema.d.ts","sourceRoot":"","sources":["../../src/sync/syncedDocSchema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"syncedDocSchema.d.ts","sourceRoot":"","sources":["../../src/sync/syncedDocSchema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAAC,SAAS,CAAC,CAoBzD"}
|
|
@@ -15,6 +15,9 @@ export function syncedDocSchema() {
|
|
|
15
15
|
updatedAt: { type: 'string', maxLength: 64 },
|
|
16
16
|
version: { type: 'number' },
|
|
17
17
|
metaVersion: { type: 'number' },
|
|
18
|
+
// The opaque key-epoch id `data` was encrypted under (the `WAS-Key-Epoch`
|
|
19
|
+
// content-push header), when known.
|
|
20
|
+
epoch: { type: 'string', maxLength: 256 },
|
|
18
21
|
// Opaque stored bodies -- content and metadata envelopes -- moved verbatim.
|
|
19
22
|
data: { type: 'object', additionalProperties: true },
|
|
20
23
|
custom: { type: 'object', additionalProperties: true }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncedDocSchema.js","sourceRoot":"","sources":["../../src/sync/syncedDocSchema.ts"],"names":[],"mappings":"AAcA;;;;;;GAMG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,IAAI;QAChB,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE;YACtC,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;YAC5C,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC3B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC/B,4EAA4E;YAC5E,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE;YACpD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE;SACvD;QACD,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC;QACxC,OAAO,EAAE,CAAC,WAAW,CAAC;KACI,CAAA;AAC9B,CAAC"}
|
|
1
|
+
{"version":3,"file":"syncedDocSchema.js","sourceRoot":"","sources":["../../src/sync/syncedDocSchema.ts"],"names":[],"mappings":"AAcA;;;;;;GAMG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,IAAI;QAChB,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE;YACtC,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;YAC5C,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC3B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC/B,0EAA0E;YAC1E,oCAAoC;YACpC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE;YACzC,4EAA4E;YAC5E,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE;YACpD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE;SACvD;QACD,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC;QACxC,OAAO,EAAE,CAAC,WAAW,CAAC;KACI,CAAA;AAC9B,CAAC"}
|
package/dist/sync/types.d.ts
CHANGED
|
@@ -56,6 +56,12 @@ export interface WireDoc {
|
|
|
56
56
|
metaVersion?: number;
|
|
57
57
|
data?: Json;
|
|
58
58
|
custom?: Json;
|
|
59
|
+
/**
|
|
60
|
+
* The opaque key-epoch id the content body was encrypted under (the
|
|
61
|
+
* `key-epochs` feature), present when the server holds a stamp for the
|
|
62
|
+
* resource. Moved verbatim; the sync layer never interprets it.
|
|
63
|
+
*/
|
|
64
|
+
epoch?: string;
|
|
59
65
|
}
|
|
60
66
|
/**
|
|
61
67
|
* The local RxDB document shape, shared across every synced collection. The
|
|
@@ -72,6 +78,13 @@ export interface SyncedDoc {
|
|
|
72
78
|
metaVersion?: number;
|
|
73
79
|
data?: Json;
|
|
74
80
|
custom?: Json;
|
|
81
|
+
/**
|
|
82
|
+
* The opaque key-epoch id `data` was encrypted under, when known (stamped by
|
|
83
|
+
* the encrypting cipher on a local write, or pulled off the feed). Sent as
|
|
84
|
+
* the `WAS-Key-Epoch` header on the content push so the server's stamp stays
|
|
85
|
+
* in step with the envelope.
|
|
86
|
+
*/
|
|
87
|
+
epoch?: string;
|
|
75
88
|
}
|
|
76
89
|
/**
|
|
77
90
|
* The current master state of a single resource, as read back for the 412
|
|
@@ -85,6 +98,10 @@ export interface MasterState {
|
|
|
85
98
|
metaVersion?: number;
|
|
86
99
|
data?: Json;
|
|
87
100
|
custom?: Json;
|
|
101
|
+
/**
|
|
102
|
+
* The key-epoch stamp of the master's content body, when the feed carries one.
|
|
103
|
+
*/
|
|
104
|
+
epoch?: string;
|
|
88
105
|
}
|
|
89
106
|
/**
|
|
90
107
|
* The write/query half of the injected WAS-access seam. An adapter (the app-side
|
|
@@ -124,15 +141,19 @@ export interface WasSyncBasePort {
|
|
|
124
141
|
/**
|
|
125
142
|
* Conditionally writes the content body verbatim (`PUT /:id`). Pass
|
|
126
143
|
* `ifNoneMatch: true` for a create-if-absent, or `ifMatch` (a quoted ETag over
|
|
127
|
-
* the content `version`) for an update-if-unchanged.
|
|
128
|
-
*
|
|
129
|
-
*
|
|
144
|
+
* the content `version`) for an update-if-unchanged. `epoch` is the opaque
|
|
145
|
+
* key-epoch id the body was encrypted under, sent as the `WAS-Key-Epoch`
|
|
146
|
+
* header (an absent epoch clears any prior stamp on the server, per the
|
|
147
|
+
* `key-epochs` feature). Returns the new content `version` parsed from the
|
|
148
|
+
* response ETag (the acked master revision), or `undefined` when the server
|
|
149
|
+
* does not supply one.
|
|
130
150
|
*
|
|
131
151
|
* @param options {object}
|
|
132
152
|
* @param options.id {string}
|
|
133
153
|
* @param options.data {Json}
|
|
134
154
|
* @param [options.ifMatch] {string}
|
|
135
155
|
* @param [options.ifNoneMatch] {boolean}
|
|
156
|
+
* @param [options.epoch] {string}
|
|
136
157
|
* @returns {Promise<number | undefined>}
|
|
137
158
|
*/
|
|
138
159
|
putContent(options: {
|
|
@@ -140,6 +161,7 @@ export interface WasSyncBasePort {
|
|
|
140
161
|
data: Json;
|
|
141
162
|
ifMatch?: string;
|
|
142
163
|
ifNoneMatch?: boolean;
|
|
164
|
+
epoch?: string;
|
|
143
165
|
}): Promise<number | undefined>;
|
|
144
166
|
/**
|
|
145
167
|
* Conditionally deletes a resource (writes a tombstone; `DELETE /:id`). Pass
|
|
@@ -162,23 +184,25 @@ export interface WasSyncBasePort {
|
|
|
162
184
|
}): Promise<number | undefined>;
|
|
163
185
|
/**
|
|
164
186
|
* Conditionally writes the metadata body verbatim (`PUT /:id/meta`, body
|
|
165
|
-
* `{ custom }`).
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
187
|
+
* `{ custom }`). An ABSENT `custom` writes the CLEARED state (a body with no
|
|
188
|
+
* `custom` member -- the server's metadata replace clears every property the
|
|
189
|
+
* body omits), so removing a resource's metadata replicates rather than being
|
|
190
|
+
* skipped. Pass `ifNoneMatch: true` when the resource has no metadata yet, or
|
|
191
|
+
* `ifMatch` (a quoted ETag over `metaVersion`) for an update-if-unchanged.
|
|
192
|
+
* The resource must already exist (the server does not create a resource from
|
|
193
|
+
* a `/meta` write). Returns the new `metaVersion` parsed from the response
|
|
194
|
+
* ETag, or `undefined` when the server does not supply one.
|
|
171
195
|
*
|
|
172
196
|
* @param options {object}
|
|
197
|
+
* @param [options.custom] {Json} absent = write the cleared state
|
|
173
198
|
* @param options.id {string}
|
|
174
|
-
* @param options.custom {Json}
|
|
175
199
|
* @param [options.ifMatch] {string}
|
|
176
200
|
* @param [options.ifNoneMatch] {boolean}
|
|
177
201
|
* @returns {Promise<number | undefined>}
|
|
178
202
|
*/
|
|
179
203
|
putMeta(options: {
|
|
180
204
|
id: string;
|
|
181
|
-
custom
|
|
205
|
+
custom?: Json;
|
|
182
206
|
ifMatch?: string;
|
|
183
207
|
ifNoneMatch?: boolean;
|
|
184
208
|
}): Promise<number | undefined>;
|
package/dist/sync/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;GAIG;AACH,MAAM,MAAM,IAAI,GACd,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAA;AAErE;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,MAAM,CAAC,EAAE,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;GAkBG;AAuNH;;;;;;GAMG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAO,GAAG,4CAA4C;QAChE,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAA;IACpC,CAAC;CACF;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,MAAM,CAAQ;IACvB,YAAY,MAAc;QACxB,KAAK,CAAC,mCAAmC,MAAM,IAAI,CAAC,CAAA;QACpD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wasSyncPort.d.ts","sourceRoot":"","sources":["../../src/sync/wasSyncPort.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAA0B,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AACzD,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,YAAY,CAAA;AAEnB;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAK5D;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAEjD;AAgDD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,OAAO,EACP,YAAY,EACZ,UAAU,EACX,EAAE;IACD,GAAG,EAAE,SAAS,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,KAAK,CAAA;CACnB,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"wasSyncPort.d.ts","sourceRoot":"","sources":["../../src/sync/wasSyncPort.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAA0B,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AACzD,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,YAAY,CAAA;AAEnB;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAK5D;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAEjD;AAgDD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,OAAO,EACP,YAAY,EACZ,UAAU,EACX,EAAE;IACD,GAAG,EAAE,SAAS,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,KAAK,CAAA;CACnB,GAAG,eAAe,CAiHlB"}
|
package/dist/sync/wasSyncPort.js
CHANGED
|
@@ -153,13 +153,19 @@ export function createWasSyncPort({ was, spaceId, collectionId, capability }) {
|
|
|
153
153
|
throw toPortError(err);
|
|
154
154
|
}
|
|
155
155
|
},
|
|
156
|
-
async putContent({ id, data, ifMatch, ifNoneMatch }) {
|
|
156
|
+
async putContent({ id, data, ifMatch, ifNoneMatch, epoch }) {
|
|
157
157
|
return conditionalWrite(() => was.request({
|
|
158
158
|
capability,
|
|
159
159
|
path: resourcePath(id),
|
|
160
160
|
method: 'PUT',
|
|
161
161
|
json: data,
|
|
162
|
-
|
|
162
|
+
// `epoch` rides as the `WAS-Key-Epoch` header so the server's stamp
|
|
163
|
+
// stays in step with the envelope (an absent epoch clears any prior
|
|
164
|
+
// stamp, per the `key-epochs` feature).
|
|
165
|
+
headers: writeHeaders({
|
|
166
|
+
precondition: { ifMatch, ifNoneMatch },
|
|
167
|
+
epoch
|
|
168
|
+
})
|
|
163
169
|
}));
|
|
164
170
|
},
|
|
165
171
|
async deleteContent({ id, ifMatch }) {
|
|
@@ -193,7 +199,10 @@ export function createWasSyncPort({ was, spaceId, collectionId, capability }) {
|
|
|
193
199
|
capability,
|
|
194
200
|
path: `${resourcePath(id)}/meta`,
|
|
195
201
|
method: 'PUT',
|
|
196
|
-
|
|
202
|
+
// The `/meta` PUT is a full replacement of `custom`: a body with no
|
|
203
|
+
// `custom` member writes the CLEARED state (the server clears every
|
|
204
|
+
// property the body omits), which is how a metadata clear replicates.
|
|
205
|
+
json: custom === undefined ? {} : { custom },
|
|
197
206
|
headers: writeHeaders({ precondition: { ifMatch, ifNoneMatch } })
|
|
198
207
|
}));
|
|
199
208
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wasSyncPort.js","sourceRoot":"","sources":["../../src/sync/wasSyncPort.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"wasSyncPort.js","sourceRoot":"","sources":["../../src/sync/wasSyncPort.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@interop/was-react",
|
|
3
3
|
"description": "React library for building 'Bring Your Own Everything' (BYOE) apps on Wallet Attached Storage: DID Auth login via CHAPI wallet, local-first encrypted storage, and background sync to a WAS server.",
|
|
4
|
-
"version": "0.8.
|
|
4
|
+
"version": "0.8.3",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"build": "pnpm run clear && tsc",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"@interop/ezcap": "^7.4.1",
|
|
53
53
|
"@interop/security-document-loader": "^9.5.1",
|
|
54
54
|
"@interop/vc": "^11.0.6",
|
|
55
|
-
"@interop/verifier-core": "^3.5.
|
|
55
|
+
"@interop/verifier-core": "^3.5.3",
|
|
56
56
|
"@interop/wallet-core": "^0.16.0",
|
|
57
57
|
"@interop/was-client": "^0.26.0",
|
|
58
58
|
"@interop/webkms-client": "^14.7.1",
|