@fluid-internal/presence-runtime 2.102.0 → 2.103.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/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/runtime/extension/containerPresence.d.ts +1 -1
- package/dist/runtime/presenceDatastoreManager.d.ts +2 -2
- package/dist/runtime/presenceDatastoreManager.d.ts.map +1 -1
- package/dist/runtime/presenceDatastoreManager.js.map +1 -1
- package/dist/runtime/presenceManager.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/runtime/extension/containerPresence.d.ts +1 -1
- package/lib/runtime/presenceDatastoreManager.d.ts +2 -2
- package/lib/runtime/presenceDatastoreManager.d.ts.map +1 -1
- package/lib/runtime/presenceDatastoreManager.js.map +1 -1
- package/lib/runtime/presenceManager.js.map +1 -1
- package/package.json +14 -14
- package/dist/runtime/test/presenceDatastoreManager.spec.js +0 -618
- package/dist/runtime/test/presenceDatastoreManager.spec.js.map +0 -1
- package/dist/runtime/test/presenceManager.spec.js +0 -651
- package/dist/runtime/test/presenceManager.spec.js.map +0 -1
- package/dist/states/test/batching.spec.js +0 -843
- package/dist/states/test/batching.spec.js.map +0 -1
- package/dist/states/test/broadcastControlsTests.js +0 -60
- package/dist/states/test/broadcastControlsTests.js.map +0 -1
- package/dist/states/test/eventing.spec.js +0 -576
- package/dist/states/test/eventing.spec.js.map +0 -1
- package/dist/states/test/latestMapValueManager.spec.js +0 -210
- package/dist/states/test/latestMapValueManager.spec.js.map +0 -1
- package/dist/states/test/latestValueManager.spec.js +0 -193
- package/dist/states/test/latestValueManager.spec.js.map +0 -1
- package/dist/states/test/mockEphemeralRuntime.js +0 -11
- package/dist/states/test/mockEphemeralRuntime.js.map +0 -1
- package/dist/states/test/notificationsManager.spec.js +0 -460
- package/dist/states/test/notificationsManager.spec.js.map +0 -1
- package/dist/states/test/presenceStates.spec.js +0 -73
- package/dist/states/test/presenceStates.spec.js.map +0 -1
- package/dist/states/test/schemaValidation/protocol.spec.js +0 -246
- package/dist/states/test/schemaValidation/protocol.spec.js.map +0 -1
- package/dist/states/test/schemaValidation/valueManagers.spec.js +0 -784
- package/dist/states/test/schemaValidation/valueManagers.spec.js.map +0 -1
- package/dist/states/test/testUtils.js +0 -21
- package/dist/states/test/testUtils.js.map +0 -1
- package/dist/test/mockEphemeralRuntime.js +0 -175
- package/dist/test/mockEphemeralRuntime.js.map +0 -1
- package/dist/test/testUtils.js +0 -262
- package/dist/test/testUtils.js.map +0 -1
- package/dist/test/utils/index.js +0 -27
- package/dist/test/utils/index.js.map +0 -1
- package/dist/utils/test/timerManager.spec.js +0 -93
- package/dist/utils/test/timerManager.spec.js.map +0 -1
- package/lib/runtime/test/presenceDatastoreManager.spec.js +0 -616
- package/lib/runtime/test/presenceDatastoreManager.spec.js.map +0 -1
- package/lib/runtime/test/presenceManager.spec.js +0 -649
- package/lib/runtime/test/presenceManager.spec.js.map +0 -1
- package/lib/states/test/batching.spec.js +0 -841
- package/lib/states/test/batching.spec.js.map +0 -1
- package/lib/states/test/broadcastControlsTests.js +0 -56
- package/lib/states/test/broadcastControlsTests.js.map +0 -1
- package/lib/states/test/eventing.spec.js +0 -574
- package/lib/states/test/eventing.spec.js.map +0 -1
- package/lib/states/test/latestMapValueManager.spec.js +0 -206
- package/lib/states/test/latestMapValueManager.spec.js.map +0 -1
- package/lib/states/test/latestValueManager.spec.js +0 -189
- package/lib/states/test/latestValueManager.spec.js.map +0 -1
- package/lib/states/test/mockEphemeralRuntime.js +0 -6
- package/lib/states/test/mockEphemeralRuntime.js.map +0 -1
- package/lib/states/test/notificationsManager.spec.js +0 -456
- package/lib/states/test/notificationsManager.spec.js.map +0 -1
- package/lib/states/test/presenceStates.spec.js +0 -69
- package/lib/states/test/presenceStates.spec.js.map +0 -1
- package/lib/states/test/schemaValidation/protocol.spec.js +0 -244
- package/lib/states/test/schemaValidation/protocol.spec.js.map +0 -1
- package/lib/states/test/schemaValidation/valueManagers.spec.js +0 -782
- package/lib/states/test/schemaValidation/valueManagers.spec.js.map +0 -1
- package/lib/states/test/testUtils.js +0 -6
- package/lib/states/test/testUtils.js.map +0 -1
- package/lib/test/mockEphemeralRuntime.js +0 -171
- package/lib/test/mockEphemeralRuntime.js.map +0 -1
- package/lib/test/testUtils.js +0 -251
- package/lib/test/testUtils.js.map +0 -1
- package/lib/test/utils/index.js +0 -8
- package/lib/test/utils/index.js.map +0 -1
- package/lib/utils/test/timerManager.spec.js +0 -91
- package/lib/utils/test/timerManager.spec.js.map +0 -1
|
@@ -1,576 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*!
|
|
3
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
4
|
-
* Licensed under the MIT License.
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
const node_assert_1 = require("node:assert");
|
|
8
|
-
const internal_1 = require("@fluidframework/test-utils/internal");
|
|
9
|
-
const sinon_1 = require("sinon");
|
|
10
|
-
const states_1 = require("@fluid-internal/presence-runtime/states");
|
|
11
|
-
const utils_1 = require("@fluid-internal/presence-runtime/utils");
|
|
12
|
-
const mockEphemeralRuntime_js_1 = require("./mockEphemeralRuntime.js");
|
|
13
|
-
const testUtils_js_1 = require("./testUtils.js");
|
|
14
|
-
const datastoreUpdateType = "Pres:DatastoreUpdate";
|
|
15
|
-
/**
|
|
16
|
-
* Workspace updates
|
|
17
|
-
*/
|
|
18
|
-
const attendeeUpdate = {
|
|
19
|
-
"clientToSessionId": {
|
|
20
|
-
"client1": {
|
|
21
|
-
"rev": 0,
|
|
22
|
-
"timestamp": 0,
|
|
23
|
-
"value": testUtils_js_1.attendeeId1,
|
|
24
|
-
},
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
const latestUpdate = {
|
|
28
|
-
"latest": {
|
|
29
|
-
[testUtils_js_1.attendeeId1]: {
|
|
30
|
-
"rev": 1,
|
|
31
|
-
"timestamp": 0,
|
|
32
|
-
"value": (0, utils_1.toOpaqueJson)({ x: 1, y: 1, z: 1 }),
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
};
|
|
36
|
-
const latestMapUpdate = {
|
|
37
|
-
"latestMap": {
|
|
38
|
-
[testUtils_js_1.attendeeId1]: {
|
|
39
|
-
"rev": 1,
|
|
40
|
-
"items": {
|
|
41
|
-
"key1": {
|
|
42
|
-
"rev": 1,
|
|
43
|
-
"timestamp": 0,
|
|
44
|
-
"value": (0, utils_1.toOpaqueJson)({ a: 1, b: 1 }),
|
|
45
|
-
},
|
|
46
|
-
"key2": {
|
|
47
|
-
"rev": 1,
|
|
48
|
-
"timestamp": 0,
|
|
49
|
-
"value": (0, utils_1.toOpaqueJson)({ c: 1, d: 1 }),
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
};
|
|
55
|
-
const latestUpdateRev2 = {
|
|
56
|
-
"latest": {
|
|
57
|
-
[testUtils_js_1.attendeeId1]: {
|
|
58
|
-
"rev": 2,
|
|
59
|
-
"timestamp": 50,
|
|
60
|
-
"value": (0, utils_1.toOpaqueJson)({ x: 2, y: 2, z: 2 }),
|
|
61
|
-
},
|
|
62
|
-
},
|
|
63
|
-
};
|
|
64
|
-
const itemRemovedMapUpdate = {
|
|
65
|
-
"latestMap": {
|
|
66
|
-
[testUtils_js_1.attendeeId1]: {
|
|
67
|
-
"rev": 2,
|
|
68
|
-
"items": {
|
|
69
|
-
"key2": {
|
|
70
|
-
"rev": 2,
|
|
71
|
-
"timestamp": 50,
|
|
72
|
-
},
|
|
73
|
-
},
|
|
74
|
-
},
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
const itemRemovedAndItemUpdatedMapUpdate = {
|
|
78
|
-
"latestMap": {
|
|
79
|
-
[testUtils_js_1.attendeeId1]: {
|
|
80
|
-
"rev": 2,
|
|
81
|
-
"items": {
|
|
82
|
-
"key2": {
|
|
83
|
-
"rev": 2,
|
|
84
|
-
"timestamp": 50,
|
|
85
|
-
},
|
|
86
|
-
"key1": {
|
|
87
|
-
"rev": 2,
|
|
88
|
-
"timestamp": 50,
|
|
89
|
-
"value": (0, utils_1.toOpaqueJson)({ a: 2, b: 2 }),
|
|
90
|
-
},
|
|
91
|
-
},
|
|
92
|
-
},
|
|
93
|
-
},
|
|
94
|
-
};
|
|
95
|
-
const itemUpdatedAndItemRemovedMapUpdate = {
|
|
96
|
-
"latestMap": {
|
|
97
|
-
[testUtils_js_1.attendeeId1]: {
|
|
98
|
-
"rev": 2,
|
|
99
|
-
"items": {
|
|
100
|
-
"key1": {
|
|
101
|
-
"rev": 2,
|
|
102
|
-
"timestamp": 50,
|
|
103
|
-
"value": (0, utils_1.toOpaqueJson)({ a: 2, b: 2 }),
|
|
104
|
-
},
|
|
105
|
-
"key2": {
|
|
106
|
-
"rev": 2,
|
|
107
|
-
"timestamp": 50,
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
},
|
|
112
|
-
};
|
|
113
|
-
const notificationsUpdate = {
|
|
114
|
-
"testEvents": {
|
|
115
|
-
[testUtils_js_1.attendeeId1]: {
|
|
116
|
-
"rev": 0,
|
|
117
|
-
"timestamp": 0,
|
|
118
|
-
"value": (0, utils_1.toOpaqueJson)({ "name": "newId", "args": [42] }),
|
|
119
|
-
"ignoreUnmonitored": true,
|
|
120
|
-
},
|
|
121
|
-
},
|
|
122
|
-
};
|
|
123
|
-
describe("Presence/States", () => {
|
|
124
|
-
describe("events are fired with consistent and final state when", () => {
|
|
125
|
-
let runtime;
|
|
126
|
-
let logger;
|
|
127
|
-
let clock;
|
|
128
|
-
let presence;
|
|
129
|
-
let processSignal;
|
|
130
|
-
let latest;
|
|
131
|
-
let latestMap;
|
|
132
|
-
let notificationManager;
|
|
133
|
-
function verifyState(attendee, verifications) {
|
|
134
|
-
(0, node_assert_1.strict)(attendee !== undefined, "Eventing does not reflect new attendee");
|
|
135
|
-
node_assert_1.strict.strictEqual(attendee.attendeeId, "attendeeId-1", "Eventing does not reflect new attendee's attendeeId");
|
|
136
|
-
node_assert_1.strict.strictEqual(attendee.getConnectionId(), "client1", "Eventing does not reflect new attendee's connection id");
|
|
137
|
-
for (const { manager, expectedValue } of verifications) {
|
|
138
|
-
switch (manager) {
|
|
139
|
-
case "latest": {
|
|
140
|
-
node_assert_1.strict.deepEqual(latest.getRemote(attendee).value, expectedValue, "Eventing does not reflect latest value");
|
|
141
|
-
break;
|
|
142
|
-
}
|
|
143
|
-
case "latestMap": {
|
|
144
|
-
node_assert_1.strict.deepEqual(latestMap.getRemote(attendee).get("key1")?.value, expectedValue.key1, "Eventing does not reflect latest map value");
|
|
145
|
-
node_assert_1.strict.deepEqual(latestMap.getRemote(attendee).get("key2")?.value, expectedValue.key2, "Eventing does not reflect latest map value");
|
|
146
|
-
break;
|
|
147
|
-
}
|
|
148
|
-
default: {
|
|
149
|
-
break;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
before(() => {
|
|
155
|
-
clock = (0, sinon_1.useFakeTimers)();
|
|
156
|
-
});
|
|
157
|
-
beforeEach(() => {
|
|
158
|
-
logger = new internal_1.EventAndErrorTrackingLogger();
|
|
159
|
-
runtime = new mockEphemeralRuntime_js_1.MockEphemeralRuntime(logger);
|
|
160
|
-
({ presence, processSignal } = (0, testUtils_js_1.prepareConnectedPresence)(runtime, testUtils_js_1.localAttendeeId, testUtils_js_1.initialLocalClientConnectionId, clock, logger));
|
|
161
|
-
});
|
|
162
|
-
afterEach(function (done) {
|
|
163
|
-
clock.reset();
|
|
164
|
-
if (this.currentTest?.state === "passed") {
|
|
165
|
-
(0, testUtils_js_1.assertFinalExpectations)(runtime, logger);
|
|
166
|
-
}
|
|
167
|
-
done();
|
|
168
|
-
});
|
|
169
|
-
after(() => {
|
|
170
|
-
clock.restore();
|
|
171
|
-
});
|
|
172
|
-
function setupSharedStatesWorkspace({ notifications, } = {}) {
|
|
173
|
-
const statesWorkspace = presence.states.getWorkspace("name:testWorkspace", {
|
|
174
|
-
latest: states_1.StateFactory.latest({ local: { x: 0, y: 0, z: 0 } }),
|
|
175
|
-
latestMap: states_1.StateFactory.latestMap({
|
|
176
|
-
local: { key1: { a: 0, b: 0 }, key2: { c: 0, d: 0 } },
|
|
177
|
-
}),
|
|
178
|
-
});
|
|
179
|
-
latest = statesWorkspace.states.latest;
|
|
180
|
-
latestMap = statesWorkspace.states.latestMap;
|
|
181
|
-
if (notifications) {
|
|
182
|
-
const workspace = statesWorkspace;
|
|
183
|
-
workspace.add("testEvents", (0, states_1.Notifications)({
|
|
184
|
-
newId: (_attendee, _id) => { },
|
|
185
|
-
}));
|
|
186
|
-
notificationManager = workspace.states.testEvents;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
function setupMultipleStatesWorkspaces() {
|
|
190
|
-
const latestsStates = presence.states.getWorkspace("name:testWorkspace1", {
|
|
191
|
-
latest: states_1.StateFactory.latest({ local: { x: 0, y: 0, z: 0 } }),
|
|
192
|
-
});
|
|
193
|
-
const latesetMapStates = presence.states.getWorkspace("name:testWorkspace2", {
|
|
194
|
-
latestMap: states_1.StateFactory.latestMap({
|
|
195
|
-
local: { key1: { a: 0, b: 0 }, key2: { c: 0, d: 0 } },
|
|
196
|
-
}),
|
|
197
|
-
});
|
|
198
|
-
latest = latestsStates.states.latest;
|
|
199
|
-
latestMap = latesetMapStates.states.latestMap;
|
|
200
|
-
}
|
|
201
|
-
function setupNotificationsWorkspace() {
|
|
202
|
-
const notificationsWorkspace = presence.notifications.getWorkspace("name:testWorkspace", {
|
|
203
|
-
testEvents: (0, states_1.Notifications)({
|
|
204
|
-
newId: (_attendee, _id) => { },
|
|
205
|
-
}),
|
|
206
|
-
});
|
|
207
|
-
notificationManager = notificationsWorkspace.notifications.testEvents;
|
|
208
|
-
}
|
|
209
|
-
function processUpdates(valueManagerUpdates) {
|
|
210
|
-
const updates = { "system:presence": attendeeUpdate, ...valueManagerUpdates };
|
|
211
|
-
processSignal([], {
|
|
212
|
-
type: datastoreUpdateType,
|
|
213
|
-
content: {
|
|
214
|
-
sendTimestamp: clock.now - 10,
|
|
215
|
-
avgLatency: 20,
|
|
216
|
-
data: updates,
|
|
217
|
-
},
|
|
218
|
-
clientId: "client1",
|
|
219
|
-
}, false);
|
|
220
|
-
}
|
|
221
|
-
function getTestAttendee() {
|
|
222
|
-
return presence.attendees.getAttendee("attendeeId-1");
|
|
223
|
-
}
|
|
224
|
-
describe("states workspace", () => {
|
|
225
|
-
let latestUpdatedEventSpy;
|
|
226
|
-
let latestMapUpdatedEventSpy;
|
|
227
|
-
let itemUpdatedEventSpy;
|
|
228
|
-
describe("value is updated where", () => {
|
|
229
|
-
let atteendeeEventSpy;
|
|
230
|
-
function verify() {
|
|
231
|
-
verifyState(getTestAttendee(), [
|
|
232
|
-
{ manager: "latest", expectedValue: { x: 1, y: 1, z: 1 } },
|
|
233
|
-
{
|
|
234
|
-
manager: "latestMap",
|
|
235
|
-
expectedValue: { key1: { a: 1, b: 1 }, key2: { c: 1, d: 1 } },
|
|
236
|
-
},
|
|
237
|
-
]);
|
|
238
|
-
}
|
|
239
|
-
function assertSpies() {
|
|
240
|
-
node_assert_1.strict.ok(atteendeeEventSpy.calledOnce, "attendee event not fired exactly once");
|
|
241
|
-
node_assert_1.strict.ok(latestUpdatedEventSpy.calledOnce, "latest update event not fired exactly once");
|
|
242
|
-
node_assert_1.strict.ok(latestMapUpdatedEventSpy.calledOnce, "latestMap update event not fired exactly once");
|
|
243
|
-
node_assert_1.strict.ok(itemUpdatedEventSpy.calledTwice, "latestMap item update event not fired exactly twice");
|
|
244
|
-
}
|
|
245
|
-
function setupSpiesAndListeners() {
|
|
246
|
-
latestUpdatedEventSpy = (0, sinon_1.spy)(verify);
|
|
247
|
-
latestMapUpdatedEventSpy = (0, sinon_1.spy)(verify);
|
|
248
|
-
itemUpdatedEventSpy = (0, sinon_1.spy)(verify);
|
|
249
|
-
atteendeeEventSpy = (0, sinon_1.spy)(verify);
|
|
250
|
-
latest.events.on("remoteUpdated", latestUpdatedEventSpy);
|
|
251
|
-
latestMap.events.on("remoteUpdated", latestMapUpdatedEventSpy);
|
|
252
|
-
latestMap.events.on("remoteItemUpdated", itemUpdatedEventSpy);
|
|
253
|
-
presence.attendees.events.on("attendeeConnected", atteendeeEventSpy);
|
|
254
|
-
}
|
|
255
|
-
it("'latest' update comes before 'latestMap' update in single workspace", async () => {
|
|
256
|
-
// Setup
|
|
257
|
-
setupSharedStatesWorkspace();
|
|
258
|
-
setupSpiesAndListeners();
|
|
259
|
-
const workspace = {
|
|
260
|
-
"s:name:testWorkspace": { ...latestUpdate, ...latestMapUpdate },
|
|
261
|
-
};
|
|
262
|
-
// Act
|
|
263
|
-
processUpdates(workspace);
|
|
264
|
-
// Verify
|
|
265
|
-
assertSpies();
|
|
266
|
-
});
|
|
267
|
-
it("'latestMap' update comes before 'latest' update in single workspace", async () => {
|
|
268
|
-
// Setup
|
|
269
|
-
setupSharedStatesWorkspace();
|
|
270
|
-
setupSpiesAndListeners();
|
|
271
|
-
const workspace = {
|
|
272
|
-
"s:name:testWorkspace": { ...latestMapUpdate, ...latestUpdate },
|
|
273
|
-
};
|
|
274
|
-
// Act
|
|
275
|
-
processUpdates(workspace);
|
|
276
|
-
// Verify
|
|
277
|
-
assertSpies();
|
|
278
|
-
});
|
|
279
|
-
it("workspace 1 update comes before workspace 2 update in multiple workspaces", async () => {
|
|
280
|
-
// Setup
|
|
281
|
-
setupMultipleStatesWorkspaces();
|
|
282
|
-
setupSpiesAndListeners();
|
|
283
|
-
const workspace = {
|
|
284
|
-
"s:name:testWorkspace1": latestUpdate,
|
|
285
|
-
"s:name:testWorkspace2": latestMapUpdate,
|
|
286
|
-
};
|
|
287
|
-
// Act
|
|
288
|
-
processUpdates(workspace);
|
|
289
|
-
// Verify
|
|
290
|
-
assertSpies();
|
|
291
|
-
});
|
|
292
|
-
it("workspace 2 update comes before workspace 1 update in multiple workspaces", async () => {
|
|
293
|
-
// Setup
|
|
294
|
-
setupMultipleStatesWorkspaces();
|
|
295
|
-
setupSpiesAndListeners();
|
|
296
|
-
const workspace = {
|
|
297
|
-
"s:name:testWorkspace2": latestMapUpdate,
|
|
298
|
-
"s:name:testWorkspace1": latestUpdate,
|
|
299
|
-
};
|
|
300
|
-
// Act
|
|
301
|
-
processUpdates(workspace);
|
|
302
|
-
// Verify
|
|
303
|
-
assertSpies();
|
|
304
|
-
});
|
|
305
|
-
});
|
|
306
|
-
describe("map item is removed", () => {
|
|
307
|
-
let itemRemovedEventSpy;
|
|
308
|
-
describe("and 'latest' value updated", () => {
|
|
309
|
-
function verify() {
|
|
310
|
-
verifyState(getTestAttendee(), [
|
|
311
|
-
{ manager: "latest", expectedValue: { x: 2, y: 2, z: 2 } },
|
|
312
|
-
{
|
|
313
|
-
manager: "latestMap",
|
|
314
|
-
expectedValue: { key1: { a: 1, b: 1 }, key2: undefined },
|
|
315
|
-
},
|
|
316
|
-
]);
|
|
317
|
-
}
|
|
318
|
-
function setupSpiesAndListeners() {
|
|
319
|
-
itemRemovedEventSpy = (0, sinon_1.spy)(verify);
|
|
320
|
-
latestUpdatedEventSpy = (0, sinon_1.spy)(verify);
|
|
321
|
-
latestMapUpdatedEventSpy = (0, sinon_1.spy)(verify);
|
|
322
|
-
latest.events.on("remoteUpdated", latestUpdatedEventSpy);
|
|
323
|
-
latestMap.events.on("remoteUpdated", latestMapUpdatedEventSpy);
|
|
324
|
-
latestMap.events.on("remoteItemRemoved", itemRemovedEventSpy);
|
|
325
|
-
}
|
|
326
|
-
function assertSpies() {
|
|
327
|
-
node_assert_1.strict.ok(latestUpdatedEventSpy.calledOnce, `latest update event not fired exactly once`);
|
|
328
|
-
node_assert_1.strict.ok(latestMapUpdatedEventSpy.calledOnce, "latestMap update event not fired exactly once");
|
|
329
|
-
node_assert_1.strict.ok(itemRemovedEventSpy.calledOnce, "latestMap item remove event not fired exactly once");
|
|
330
|
-
}
|
|
331
|
-
it("in a single workspace", async () => {
|
|
332
|
-
// Setup
|
|
333
|
-
setupSharedStatesWorkspace();
|
|
334
|
-
const workspace = {
|
|
335
|
-
"s:name:testWorkspace": { ...latestMapUpdate, ...latestUpdate },
|
|
336
|
-
};
|
|
337
|
-
processUpdates(workspace);
|
|
338
|
-
setupSpiesAndListeners();
|
|
339
|
-
const itemRemovedUpdate = {
|
|
340
|
-
"s:name:testWorkspace": { ...latestUpdateRev2, ...itemRemovedMapUpdate },
|
|
341
|
-
};
|
|
342
|
-
// Act
|
|
343
|
-
processUpdates(itemRemovedUpdate);
|
|
344
|
-
// Verify
|
|
345
|
-
assertSpies();
|
|
346
|
-
});
|
|
347
|
-
it("in multiple workspaces", async () => {
|
|
348
|
-
// Setup
|
|
349
|
-
setupMultipleStatesWorkspaces();
|
|
350
|
-
const workspace = {
|
|
351
|
-
"s:name:testWorkspace2": latestMapUpdate,
|
|
352
|
-
"s:name:testWorkspace1": latestUpdate,
|
|
353
|
-
};
|
|
354
|
-
processUpdates(workspace);
|
|
355
|
-
setupSpiesAndListeners();
|
|
356
|
-
const itemRemovedUpdate = {
|
|
357
|
-
"s:name:testWorkspace1": latestUpdateRev2,
|
|
358
|
-
"s:name:testWorkspace2": itemRemovedMapUpdate,
|
|
359
|
-
};
|
|
360
|
-
// Act
|
|
361
|
-
processUpdates(itemRemovedUpdate);
|
|
362
|
-
// Verify
|
|
363
|
-
assertSpies();
|
|
364
|
-
});
|
|
365
|
-
});
|
|
366
|
-
describe("and map item is updated", () => {
|
|
367
|
-
function verify() {
|
|
368
|
-
verifyState(getTestAttendee(), [
|
|
369
|
-
{
|
|
370
|
-
manager: "latestMap",
|
|
371
|
-
expectedValue: { key1: { a: 2, b: 2 }, key2: undefined },
|
|
372
|
-
},
|
|
373
|
-
]);
|
|
374
|
-
}
|
|
375
|
-
function setupSpiesAndListeners() {
|
|
376
|
-
itemRemovedEventSpy = (0, sinon_1.spy)(verify);
|
|
377
|
-
latestMapUpdatedEventSpy = (0, sinon_1.spy)(verify);
|
|
378
|
-
itemUpdatedEventSpy = (0, sinon_1.spy)(verify);
|
|
379
|
-
latestMap.events.on("remoteUpdated", latestMapUpdatedEventSpy);
|
|
380
|
-
latestMap.events.on("remoteItemUpdated", itemUpdatedEventSpy);
|
|
381
|
-
latestMap.events.on("remoteItemRemoved", itemRemovedEventSpy);
|
|
382
|
-
}
|
|
383
|
-
function assertSpies() {
|
|
384
|
-
node_assert_1.strict.ok(itemUpdatedEventSpy.calledOnce, `latest update event not fired exactly once`);
|
|
385
|
-
node_assert_1.strict.ok(latestMapUpdatedEventSpy.calledOnce, "latestMap update event not fired exactly once");
|
|
386
|
-
node_assert_1.strict.ok(itemRemovedEventSpy.calledOnce, "latestMap item remove event not fired exactly once");
|
|
387
|
-
}
|
|
388
|
-
it("with removal first", () => {
|
|
389
|
-
// Setup
|
|
390
|
-
setupSharedStatesWorkspace();
|
|
391
|
-
const workspace = {
|
|
392
|
-
"s:name:testWorkspace": latestMapUpdate,
|
|
393
|
-
};
|
|
394
|
-
processUpdates(workspace);
|
|
395
|
-
setupSpiesAndListeners();
|
|
396
|
-
const itemRemovedAndItemUpdatedUpdate = {
|
|
397
|
-
"s:name:testWorkspace": itemRemovedAndItemUpdatedMapUpdate,
|
|
398
|
-
};
|
|
399
|
-
// Act
|
|
400
|
-
processUpdates(itemRemovedAndItemUpdatedUpdate);
|
|
401
|
-
// Verify
|
|
402
|
-
assertSpies();
|
|
403
|
-
});
|
|
404
|
-
it("with update first", () => {
|
|
405
|
-
// Setup
|
|
406
|
-
setupSharedStatesWorkspace();
|
|
407
|
-
const workspace = {
|
|
408
|
-
"s:name:testWorkspace": latestMapUpdate,
|
|
409
|
-
};
|
|
410
|
-
processUpdates(workspace);
|
|
411
|
-
setupSpiesAndListeners();
|
|
412
|
-
const itemUpdatedAndItemRemovedUpdate = {
|
|
413
|
-
"s:name:testWorkspace": itemUpdatedAndItemRemovedMapUpdate,
|
|
414
|
-
};
|
|
415
|
-
// Act
|
|
416
|
-
processUpdates(itemUpdatedAndItemRemovedUpdate);
|
|
417
|
-
// Verify
|
|
418
|
-
assertSpies();
|
|
419
|
-
});
|
|
420
|
-
});
|
|
421
|
-
});
|
|
422
|
-
});
|
|
423
|
-
describe("Notifications update", () => {
|
|
424
|
-
let notificationSpy;
|
|
425
|
-
let latestSpy;
|
|
426
|
-
let attendeeSpy;
|
|
427
|
-
let latestMapSpy;
|
|
428
|
-
function verify() {
|
|
429
|
-
verifyState(getTestAttendee(), [
|
|
430
|
-
{ manager: "latest", expectedValue: { x: 1, y: 1, z: 1 } },
|
|
431
|
-
{
|
|
432
|
-
manager: "latestMap",
|
|
433
|
-
expectedValue: { key1: { a: 1, b: 1 }, key2: { c: 1, d: 1 } },
|
|
434
|
-
},
|
|
435
|
-
]);
|
|
436
|
-
}
|
|
437
|
-
function setupSpiesAndListeners() {
|
|
438
|
-
notificationSpy = (0, sinon_1.spy)(verify);
|
|
439
|
-
latestSpy = (0, sinon_1.spy)(verify);
|
|
440
|
-
attendeeSpy = (0, sinon_1.spy)(verify);
|
|
441
|
-
latestMapSpy = (0, sinon_1.spy)(verify);
|
|
442
|
-
notificationManager.notifications.on("newId", notificationSpy);
|
|
443
|
-
latest.events.on("remoteUpdated", latestSpy);
|
|
444
|
-
latestMap.events.on("remoteUpdated", latestMapSpy);
|
|
445
|
-
presence.attendees.events.on("attendeeConnected", attendeeSpy);
|
|
446
|
-
}
|
|
447
|
-
function assertSpies() {
|
|
448
|
-
node_assert_1.strict.ok(notificationSpy.calledOnce, "notification event not fired exactly once");
|
|
449
|
-
node_assert_1.strict.ok(latestMapSpy.calledOnce, "latestMap update event not fired exactly once");
|
|
450
|
-
node_assert_1.strict.ok(latestSpy.calledOnce, "latest update event not fired exactly once");
|
|
451
|
-
node_assert_1.strict.ok(attendeeSpy.calledOnce, "attendee event not fired exactly once");
|
|
452
|
-
}
|
|
453
|
-
it("comes before states workspace update", async () => {
|
|
454
|
-
// Setup
|
|
455
|
-
setupSharedStatesWorkspace();
|
|
456
|
-
setupNotificationsWorkspace();
|
|
457
|
-
setupSpiesAndListeners();
|
|
458
|
-
const workspace = {
|
|
459
|
-
"n:name:testWorkspace": notificationsUpdate,
|
|
460
|
-
"s:name:testWorkspace": { ...latestUpdate, ...latestMapUpdate },
|
|
461
|
-
};
|
|
462
|
-
// Act
|
|
463
|
-
processUpdates(workspace);
|
|
464
|
-
// Verify
|
|
465
|
-
assertSpies();
|
|
466
|
-
});
|
|
467
|
-
it("comes after states workspace update", async () => {
|
|
468
|
-
// Setup
|
|
469
|
-
setupSharedStatesWorkspace();
|
|
470
|
-
setupNotificationsWorkspace();
|
|
471
|
-
setupSpiesAndListeners();
|
|
472
|
-
const workspace = {
|
|
473
|
-
"s:name:testWorkspace": { ...latestUpdate, ...latestMapUpdate },
|
|
474
|
-
"n:name:testWorkspace": notificationsUpdate,
|
|
475
|
-
};
|
|
476
|
-
// Act
|
|
477
|
-
processUpdates(workspace);
|
|
478
|
-
// Verify
|
|
479
|
-
assertSpies();
|
|
480
|
-
});
|
|
481
|
-
it("comes in between states workspaces", async () => {
|
|
482
|
-
// Setup
|
|
483
|
-
setupMultipleStatesWorkspaces();
|
|
484
|
-
setupNotificationsWorkspace();
|
|
485
|
-
setupSpiesAndListeners();
|
|
486
|
-
const workspace = {
|
|
487
|
-
"s:name:testWorkspace1": latestUpdate,
|
|
488
|
-
"n:name:testWorkspace": notificationsUpdate,
|
|
489
|
-
"s:name:testWorkspace2": latestMapUpdate,
|
|
490
|
-
};
|
|
491
|
-
// Act
|
|
492
|
-
processUpdates(workspace);
|
|
493
|
-
// Verify
|
|
494
|
-
assertSpies();
|
|
495
|
-
});
|
|
496
|
-
it("within a states workspace", async () => {
|
|
497
|
-
// Setup
|
|
498
|
-
setupSharedStatesWorkspace({ notifications: true });
|
|
499
|
-
setupSpiesAndListeners();
|
|
500
|
-
const workspace = {
|
|
501
|
-
"s:name:testWorkspace": {
|
|
502
|
-
...latestUpdate,
|
|
503
|
-
...notificationsUpdate,
|
|
504
|
-
...latestMapUpdate,
|
|
505
|
-
},
|
|
506
|
-
};
|
|
507
|
-
// Act
|
|
508
|
-
processUpdates(workspace);
|
|
509
|
-
// Verify
|
|
510
|
-
assertSpies();
|
|
511
|
-
});
|
|
512
|
-
it("from unregistered workspace triggers 'workspaceActivated' event", async () => {
|
|
513
|
-
// Setup
|
|
514
|
-
notificationSpy = (0, sinon_1.spy)();
|
|
515
|
-
const workspaceActivatedEventSpy = (0, sinon_1.spy)((workspaceAddress) => {
|
|
516
|
-
// Once activated, register the notifications workspace and listener for it's event
|
|
517
|
-
const notificationsWorkspace = presence.notifications.getWorkspace(workspaceAddress, {
|
|
518
|
-
testEvents: (0, states_1.Notifications)({
|
|
519
|
-
newId: (_attendee, _id) => { },
|
|
520
|
-
}),
|
|
521
|
-
});
|
|
522
|
-
notificationsWorkspace.notifications.testEvents.notifications.on("newId", notificationSpy);
|
|
523
|
-
});
|
|
524
|
-
presence.events.on("workspaceActivated", (workspaceAddress, type) => {
|
|
525
|
-
if (workspaceAddress === "name:testWorkspace" && type === "Notifications") {
|
|
526
|
-
workspaceActivatedEventSpy(workspaceAddress);
|
|
527
|
-
}
|
|
528
|
-
});
|
|
529
|
-
const workspace = {
|
|
530
|
-
"n:name:testWorkspace": notificationsUpdate,
|
|
531
|
-
};
|
|
532
|
-
// Act
|
|
533
|
-
processUpdates(workspace);
|
|
534
|
-
// Verify
|
|
535
|
-
node_assert_1.strict.ok(workspaceActivatedEventSpy.calledOnce, "workspace activated event not fired");
|
|
536
|
-
node_assert_1.strict.ok(notificationSpy.calledOnce, `notification event not fired exactly once ${notificationSpy.callCount}`);
|
|
537
|
-
});
|
|
538
|
-
it("from an unregistered workspace arrives with state updates", async () => {
|
|
539
|
-
setupMultipleStatesWorkspaces();
|
|
540
|
-
const initialWorkspaceUpdate = {
|
|
541
|
-
"s:name:testWorkspace1": latestUpdate,
|
|
542
|
-
"s:name:testWorkspace2": latestMapUpdate,
|
|
543
|
-
};
|
|
544
|
-
const secondWorkspaceUpdate = {
|
|
545
|
-
"s:name:testWorkspace1": latestUpdateRev2,
|
|
546
|
-
"n:name:testWorkspace": notificationsUpdate,
|
|
547
|
-
"s:name:testWorkspace2": itemUpdatedAndItemRemovedMapUpdate,
|
|
548
|
-
};
|
|
549
|
-
presence.events.on("workspaceActivated", (_, type) => {
|
|
550
|
-
if (type === "Notifications") {
|
|
551
|
-
// Verify initial state maintains consistency
|
|
552
|
-
verifyState(getTestAttendee(), [
|
|
553
|
-
{ manager: "latest", expectedValue: { x: 1, y: 1, z: 1 } },
|
|
554
|
-
{
|
|
555
|
-
manager: "latestMap",
|
|
556
|
-
expectedValue: { key1: { a: 1, b: 1 }, key2: { c: 1, d: 1 } },
|
|
557
|
-
},
|
|
558
|
-
]);
|
|
559
|
-
}
|
|
560
|
-
});
|
|
561
|
-
// Act
|
|
562
|
-
processUpdates(initialWorkspaceUpdate);
|
|
563
|
-
processUpdates(secondWorkspaceUpdate);
|
|
564
|
-
// Verify
|
|
565
|
-
verifyState(getTestAttendee(), [
|
|
566
|
-
{ manager: "latest", expectedValue: { x: 2, y: 2, z: 2 } },
|
|
567
|
-
{
|
|
568
|
-
manager: "latestMap",
|
|
569
|
-
expectedValue: { key1: { a: 2, b: 2 }, key2: undefined },
|
|
570
|
-
},
|
|
571
|
-
]);
|
|
572
|
-
});
|
|
573
|
-
});
|
|
574
|
-
});
|
|
575
|
-
});
|
|
576
|
-
//# sourceMappingURL=eventing.spec.js.map
|