instar 1.3.547 → 1.3.549
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/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +112 -0
- package/dist/commands/server.js.map +1 -1
- package/dist/config/ConfigDefaults.d.ts.map +1 -1
- package/dist/config/ConfigDefaults.js +29 -0
- package/dist/config/ConfigDefaults.js.map +1 -1
- package/dist/core/CoherenceJournal.d.ts +1 -1
- package/dist/core/CoherenceJournal.d.ts.map +1 -1
- package/dist/core/CoherenceJournal.js +23 -2
- package/dist/core/CoherenceJournal.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +27 -1
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/TopicOperatorReplicatedStore.d.ts +250 -0
- package/dist/core/TopicOperatorReplicatedStore.d.ts.map +1 -0
- package/dist/core/TopicOperatorReplicatedStore.js +413 -0
- package/dist/core/TopicOperatorReplicatedStore.js.map +1 -0
- package/dist/core/UserRegistryReplicatedStore.d.ts +287 -0
- package/dist/core/UserRegistryReplicatedStore.d.ts.map +1 -0
- package/dist/core/UserRegistryReplicatedStore.js +527 -0
- package/dist/core/UserRegistryReplicatedStore.js.map +1 -0
- package/dist/core/devGatedFeatures.d.ts.map +1 -1
- package/dist/core/devGatedFeatures.js +10 -0
- package/dist/core/devGatedFeatures.js.map +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +3 -1
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +40 -0
- package/dist/server/routes.js.map +1 -1
- package/dist/users/TopicOperatorStore.d.ts +24 -0
- package/dist/users/TopicOperatorStore.d.ts.map +1 -1
- package/dist/users/TopicOperatorStore.js +28 -0
- package/dist/users/TopicOperatorStore.js.map +1 -1
- package/dist/users/UserManager.d.ts +27 -0
- package/dist/users/UserManager.d.ts.map +1 -1
- package/dist/users/UserManager.js +44 -0
- package/dist/users/UserManager.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +63 -63
- package/src/scaffold/templates.ts +3 -1
- package/upgrades/1.3.548.md +24 -0
- package/upgrades/1.3.549.md +36 -0
- package/upgrades/side-effects/multi-machine-replicated-store-ws26-user-topicop.md +123 -0
- package/upgrades/side-effects/ws52-incb-b4-livetest-route.md +42 -0
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
import { type VerifiedOperator } from '../core/PrincipalGuard.js';
|
|
2
|
+
/**
|
|
3
|
+
* WS2.6 topic-operator-record replication emit seam (injected, dark by default). server.ts
|
|
4
|
+
* late-binds a journal-backed emitter ONLY when `multiMachine.stateSync.topicOperator.enabled` is
|
|
5
|
+
* true; absent ⇒ strict no-op (single-machine, byte-identical). The emitter NEVER throws into the
|
|
6
|
+
* store (it swallows + counts internally), so the store calls it best-effort.
|
|
7
|
+
*
|
|
8
|
+
* THE LOAD-BEARING INVARIANT: this seam only EMITS the LOCAL authoritative binding to peers — it
|
|
9
|
+
* never RECEIVES one. A replicated topic-operator record can NEVER establish/override the local
|
|
10
|
+
* operator (that path does not exist by construction). emitPut carries the disclosure-minimized
|
|
11
|
+
* projection {platform, uid, names, boundAt} keyed on sha256(topicId + ":" + verified-uid).
|
|
12
|
+
*/
|
|
13
|
+
export interface TopicOperatorReplicationEmitter {
|
|
14
|
+
/** Emit a `put` for a freshly-bound (or re-bound) topic operator (called from setOperator). */
|
|
15
|
+
emitPut(topicId: number | string, record: TopicOperator): void;
|
|
16
|
+
}
|
|
2
17
|
/** The stored operator record for a topic. */
|
|
3
18
|
export interface TopicOperator {
|
|
4
19
|
/** The channel the operator is verified on. */
|
|
@@ -16,7 +31,16 @@ export interface TopicOperator {
|
|
|
16
31
|
export declare class TopicOperatorStore {
|
|
17
32
|
private readonly file;
|
|
18
33
|
private cache;
|
|
34
|
+
/** WS2.6 topic-operator-record replication emitter (injected, dark by default). Absent ⇒ strict no-op. */
|
|
35
|
+
private operatorReplication;
|
|
19
36
|
constructor(stateDir: string);
|
|
37
|
+
/**
|
|
38
|
+
* Late-bind the WS2.6 topic-operator-record replication emitter (server.ts constructs the
|
|
39
|
+
* journal/clock AFTER the store). Idempotent; passing undefined/null detaches (back to
|
|
40
|
+
* single-machine no-op). The emit funnel checks `this.operatorReplication` per bind, so
|
|
41
|
+
* attaching mid-life takes effect on the next setOperator.
|
|
42
|
+
*/
|
|
43
|
+
setOperatorReplicationEmitter(emitter: TopicOperatorReplicationEmitter | null | undefined): void;
|
|
20
44
|
private load;
|
|
21
45
|
private save;
|
|
22
46
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TopicOperatorStore.d.ts","sourceRoot":"","sources":["../../src/users/TopicOperatorStore.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAErF,8CAA8C;AAC9C,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IACrD,uDAAuD;IACvD,GAAG,EAAE,MAAM,CAAC;IACZ,oEAAoE;IACpE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB;uEACmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,SAAS,EAAE,uBAAuB,CAAC;CACpC;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,KAAK,CAA8C;gBAE/
|
|
1
|
+
{"version":3,"file":"TopicOperatorStore.d.ts","sourceRoot":"","sources":["../../src/users/TopicOperatorStore.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAErF;;;;;;;;;;GAUG;AACH,MAAM,WAAW,+BAA+B;IAC9C,+FAA+F;IAC/F,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;CAChE;AAED,8CAA8C;AAC9C,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IACrD,uDAAuD;IACvD,GAAG,EAAE,MAAM,CAAC;IACZ,oEAAoE;IACpE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB;uEACmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,SAAS,EAAE,uBAAuB,CAAC;CACpC;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,KAAK,CAA8C;IAC3D,0GAA0G;IAC1G,OAAO,CAAC,mBAAmB,CAAgD;gBAE/D,QAAQ,EAAE,MAAM;IAI5B;;;;;OAKG;IACH,6BAA6B,CAAC,OAAO,EAAE,+BAA+B,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAIhG,OAAO,CAAC,IAAI;IAeZ,OAAO,CAAC,IAAI;IAMZ;;;;;OAKG;IACH,WAAW,CACT,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/E,aAAa,GAAG,IAAI;IAyCvB,4DAA4D;IAC5D,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,IAAI;IAI3D;oFACgF;IAChF,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAKrE,mCAAmC;IACnC,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAIpC;;;;;;OAMG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI;CAY7D"}
|
|
@@ -25,9 +25,20 @@ import { establishOperator } from '../core/PrincipalGuard.js';
|
|
|
25
25
|
export class TopicOperatorStore {
|
|
26
26
|
file;
|
|
27
27
|
cache = null;
|
|
28
|
+
/** WS2.6 topic-operator-record replication emitter (injected, dark by default). Absent ⇒ strict no-op. */
|
|
29
|
+
operatorReplication = null;
|
|
28
30
|
constructor(stateDir) {
|
|
29
31
|
this.file = path.join(stateDir, 'topic-operators.json');
|
|
30
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Late-bind the WS2.6 topic-operator-record replication emitter (server.ts constructs the
|
|
35
|
+
* journal/clock AFTER the store). Idempotent; passing undefined/null detaches (back to
|
|
36
|
+
* single-machine no-op). The emit funnel checks `this.operatorReplication` per bind, so
|
|
37
|
+
* attaching mid-life takes effect on the next setOperator.
|
|
38
|
+
*/
|
|
39
|
+
setOperatorReplicationEmitter(emitter) {
|
|
40
|
+
this.operatorReplication = emitter ?? null;
|
|
41
|
+
}
|
|
31
42
|
load() {
|
|
32
43
|
if (this.cache)
|
|
33
44
|
return this.cache;
|
|
@@ -77,6 +88,23 @@ export class TopicOperatorStore {
|
|
|
77
88
|
const map = { ...this.load() };
|
|
78
89
|
map[String(topicId)] = record;
|
|
79
90
|
this.save(map);
|
|
91
|
+
// WS2.6 — best-effort topic-operator-record replication emission on a REAL bind (dark by
|
|
92
|
+
// default; the emitter is only injected when multiMachine.stateSync.topicOperator.enabled is
|
|
93
|
+
// true). The idempotent-skip above already returned, so we only emit when the binding actually
|
|
94
|
+
// changed. The emitter swallows its own errors, but we wrap defensively so a replication fault
|
|
95
|
+
// can NEVER break a local operator bind. This emits the LOCAL authoritative binding to peers;
|
|
96
|
+
// it never receives one (a replicated record is never authoritative — the invariant).
|
|
97
|
+
const emitter = this.operatorReplication;
|
|
98
|
+
if (emitter) {
|
|
99
|
+
try {
|
|
100
|
+
emitter.emitPut(topicId, record);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// @silent-fallback-ok: a replication emit fault must never break or roll back a local
|
|
104
|
+
// operator bind — the durable on-disk state is already persisted above. The emitter counts
|
|
105
|
+
// its own failures internally; this guard only ensures a throw from the seam cannot propagate.
|
|
106
|
+
}
|
|
107
|
+
}
|
|
80
108
|
return record;
|
|
81
109
|
}
|
|
82
110
|
/** Read a topic's verified operator, or null if unbound. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TopicOperatorStore.js","sourceRoot":"","sources":["../../src/users/TopicOperatorStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAyB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"TopicOperatorStore.js","sourceRoot":"","sources":["../../src/users/TopicOperatorStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,11 +5,38 @@
|
|
|
5
5
|
* Same agent, same repo, different relationship per user.
|
|
6
6
|
*/
|
|
7
7
|
import type { UserProfile, UserChannel, Message } from '../core/types.js';
|
|
8
|
+
/**
|
|
9
|
+
* WS2.6 user-record replication emit seam (injected, dark by default). server.ts late-binds a
|
|
10
|
+
* journal-backed emitter ONLY when `multiMachine.stateSync.userRegistry.enabled` is true; absent
|
|
11
|
+
* ⇒ strict no-op (single-machine, byte-identical). The emitter NEVER throws into the manager
|
|
12
|
+
* (it swallows + counts internally), so the manager calls it best-effort.
|
|
13
|
+
*
|
|
14
|
+
* CRITICAL: emitDelete MUST fire for every user REMOVED (the removeUser() path) — else a peer
|
|
15
|
+
* re-replicates the locally-removed user forever (resurrection). The emitter keys the tombstone
|
|
16
|
+
* on the SAME channel-set recordKey the put used, so the delete reaches the same human on every
|
|
17
|
+
* machine even though the local ids differ. emitPut carries the disclosure-minimized projection
|
|
18
|
+
* only — never the local `userId`.
|
|
19
|
+
*/
|
|
20
|
+
export interface UserReplicationEmitter {
|
|
21
|
+
/** Emit a `put` for a persisted user profile (called from the persist funnel). */
|
|
22
|
+
emitPut(record: UserProfile): void;
|
|
23
|
+
/** Emit a `delete` tombstone for a removed user, keyed on their channel set. */
|
|
24
|
+
emitDelete(channels: UserChannel[], deletedAt: string): void;
|
|
25
|
+
}
|
|
8
26
|
export declare class UserManager {
|
|
9
27
|
private users;
|
|
10
28
|
private channelIndex;
|
|
11
29
|
private usersFile;
|
|
30
|
+
/** WS2.6 user-record replication emitter (injected, dark by default). Absent ⇒ strict no-op. */
|
|
31
|
+
private userReplication;
|
|
12
32
|
constructor(stateDir: string, initialUsers?: UserProfile[]);
|
|
33
|
+
/**
|
|
34
|
+
* Late-bind the WS2.6 user-record replication emitter (server.ts constructs the journal/clock
|
|
35
|
+
* AFTER the manager). Idempotent; passing undefined/null detaches (back to single-machine
|
|
36
|
+
* no-op). The emit funnel checks `this.userReplication` per write, so attaching mid-life takes
|
|
37
|
+
* effect on the next upsert/remove.
|
|
38
|
+
*/
|
|
39
|
+
setUserReplicationEmitter(emitter: UserReplicationEmitter | null | undefined): void;
|
|
13
40
|
/**
|
|
14
41
|
* Resolve a user from an incoming message.
|
|
15
42
|
* Returns the user profile if the sender is recognized.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserManager.d.ts","sourceRoot":"","sources":["../../src/users/UserManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAG1E,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,SAAS,CAAS;
|
|
1
|
+
{"version":3,"file":"UserManager.d.ts","sourceRoot":"","sources":["../../src/users/UserManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAG1E;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,sBAAsB;IACrC,kFAAkF;IAClF,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IACnC,gFAAgF;IAChF,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9D;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,SAAS,CAAS;IAC1B,gGAAgG;IAChG,OAAO,CAAC,eAAe,CAAuC;gBAElD,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,WAAW,EAAE;IAK1D;;;;;OAKG;IACH,yBAAyB,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAInF;;;OAGG;IACH,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI;IAIxD;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI;IAO5D;;;;;;;OAOG;IACH,yBAAyB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAQrE;;;;;;;OAOG;IACH,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAW/D;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAI3C;;OAEG;IACH,SAAS,IAAI,WAAW,EAAE;IAI1B;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IA6BtC;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IA4BnC;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAM1D;;;OAGG;IACH,kBAAkB,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW;IAYpG;;;OAGG;IACH,qBAAqB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAQpF;;OAEG;IACH,SAAS,IAAI,WAAW,EAAE;IAI1B,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,SAAS;IAoCjB,OAAO,CAAC,YAAY;CA+BrB"}
|
|
@@ -12,10 +12,21 @@ export class UserManager {
|
|
|
12
12
|
users = new Map();
|
|
13
13
|
channelIndex = new Map(); // "type:identifier" -> userId
|
|
14
14
|
usersFile;
|
|
15
|
+
/** WS2.6 user-record replication emitter (injected, dark by default). Absent ⇒ strict no-op. */
|
|
16
|
+
userReplication = null;
|
|
15
17
|
constructor(stateDir, initialUsers) {
|
|
16
18
|
this.usersFile = path.join(stateDir, 'users.json');
|
|
17
19
|
this.loadUsers(initialUsers);
|
|
18
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Late-bind the WS2.6 user-record replication emitter (server.ts constructs the journal/clock
|
|
23
|
+
* AFTER the manager). Idempotent; passing undefined/null detaches (back to single-machine
|
|
24
|
+
* no-op). The emit funnel checks `this.userReplication` per write, so attaching mid-life takes
|
|
25
|
+
* effect on the next upsert/remove.
|
|
26
|
+
*/
|
|
27
|
+
setUserReplicationEmitter(emitter) {
|
|
28
|
+
this.userReplication = emitter ?? null;
|
|
29
|
+
}
|
|
19
30
|
/**
|
|
20
31
|
* Resolve a user from an incoming message.
|
|
21
32
|
* Returns the user profile if the sender is recognized.
|
|
@@ -117,11 +128,26 @@ export class UserManager {
|
|
|
117
128
|
const user = this.users.get(userId);
|
|
118
129
|
if (!user)
|
|
119
130
|
return false;
|
|
131
|
+
// WS2.6 — capture the channel set BEFORE deletion so the tombstone keys on the same
|
|
132
|
+
// channel-set recordKey the put used (resurrection guard). Best-effort: a replication emit
|
|
133
|
+
// fault must never break or roll back the local removal.
|
|
134
|
+
const removedChannels = user.channels.slice();
|
|
120
135
|
for (const channel of user.channels) {
|
|
121
136
|
this.channelIndex.delete(`${channel.type}:${channel.identifier}`);
|
|
122
137
|
}
|
|
123
138
|
this.users.delete(userId);
|
|
124
139
|
this.persistUsers();
|
|
140
|
+
const emitter = this.userReplication;
|
|
141
|
+
if (emitter) {
|
|
142
|
+
try {
|
|
143
|
+
emitter.emitDelete(removedChannels, new Date().toISOString());
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// @silent-fallback-ok: a replication emit fault must never break a local user removal —
|
|
147
|
+
// the durable on-disk state is already persisted above. The emitter counts its own
|
|
148
|
+
// failures internally; this guard only ensures a throw from the seam cannot propagate.
|
|
149
|
+
}
|
|
150
|
+
}
|
|
125
151
|
return true;
|
|
126
152
|
}
|
|
127
153
|
/**
|
|
@@ -230,6 +256,24 @@ export class UserManager {
|
|
|
230
256
|
catch { /* ignore */ }
|
|
231
257
|
throw err;
|
|
232
258
|
}
|
|
259
|
+
// WS2.6 — best-effort user-record replication emission (dark by default; the emitter is only
|
|
260
|
+
// injected when multiMachine.stateSync.userRegistry.enabled is true). Re-emit a put for every
|
|
261
|
+
// surviving user so a peer SEES the latest profile state (the upsert + removeUser paths both
|
|
262
|
+
// route through here; a removed user is already gone from the map, so its put is NOT re-emitted
|
|
263
|
+
// — its tombstone fires in removeUser). The emitter swallows its own errors, but we wrap
|
|
264
|
+
// defensively so a replication fault can NEVER break a local user write.
|
|
265
|
+
const emitter = this.userReplication;
|
|
266
|
+
if (emitter) {
|
|
267
|
+
for (const u of this.users.values()) {
|
|
268
|
+
try {
|
|
269
|
+
emitter.emitPut(u);
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
// @silent-fallback-ok: a replication emit fault must never break the local write — the
|
|
273
|
+
// durable on-disk state is already persisted above. The emitter counts its own failures.
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
233
277
|
}
|
|
234
278
|
}
|
|
235
279
|
//# sourceMappingURL=UserManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserManager.js","sourceRoot":"","sources":["../../src/users/UserManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"UserManager.js","sourceRoot":"","sources":["../../src/users/UserManager.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED