@eleven-am/pondsocket 0.1.169 → 0.1.170
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/abstracts/middleware.js +40 -17
- package/abstracts/redisClient.js +278 -0
- package/engines/channelEngine.js +163 -0
- package/engines/endpointEngine.js +163 -0
- package/engines/lobbyEngine.js +79 -0
- package/errors/httpError.js +11 -0
- package/index.js +2 -2
- package/managers/distributedManager.js +115 -0
- package/managers/localManager.js +41 -0
- package/managers/manager.js +219 -0
- package/managers/managerFactory.js +31 -0
- package/package.json +24 -14
- package/requests/eventRequest.js +51 -0
- package/requests/joinRequest.js +56 -0
- package/responses/connectionResponse.js +89 -0
- package/{channel → responses}/eventResponse.js +8 -79
- package/{lobby → responses}/joinResponse.js +25 -84
- package/server/{pondSocket.js → server.js} +55 -55
- package/types.d.ts +33 -104
- package/wrappers/channel.js +70 -0
- package/wrappers/endpoint.js +32 -0
- package/wrappers/pondChannel.js +48 -0
- package/abstracts/abstractRequest.js +0 -57
- package/abstracts/abstractRequest.test.js +0 -48
- package/abstracts/middleware.test.js +0 -70
- package/channel/channel.js +0 -351
- package/channel/channel.test.js +0 -435
- package/channel/eventRequest.js +0 -25
- package/channel/eventRequest.test.js +0 -30
- package/channel/eventResponse.test.js +0 -175
- package/endpoint/endpoint.js +0 -299
- package/endpoint/endpoint.test.js +0 -299
- package/endpoint/response.js +0 -129
- package/errors/pondError.js +0 -28
- package/lobby/JoinRequest.test.js +0 -50
- package/lobby/JoinResponse.test.js +0 -142
- package/lobby/joinRequest.js +0 -43
- package/lobby/lobby.js +0 -186
- package/matcher/matcher.test.js +0 -90
- package/presence/presence.js +0 -112
- package/presence/presenceEngine.test.js +0 -129
package/presence/presence.js
DELETED
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
-
};
|
|
8
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
-
};
|
|
13
|
-
var _PresenceEngine_instances, _PresenceEngine_presenceMap, _PresenceEngine_channel, _PresenceEngine_publish;
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.PresenceEngine = void 0;
|
|
16
|
-
const pondsocket_common_1 = require("@eleven-am/pondsocket-common");
|
|
17
|
-
const pondError_1 = require("../errors/pondError");
|
|
18
|
-
class PresenceEngine {
|
|
19
|
-
constructor(channel) {
|
|
20
|
-
_PresenceEngine_instances.add(this);
|
|
21
|
-
_PresenceEngine_presenceMap.set(this, void 0);
|
|
22
|
-
_PresenceEngine_channel.set(this, void 0);
|
|
23
|
-
__classPrivateFieldSet(this, _PresenceEngine_channel, channel, "f");
|
|
24
|
-
__classPrivateFieldSet(this, _PresenceEngine_presenceMap, new Map(), "f");
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* @desc Lists all the presence of the users
|
|
28
|
-
*/
|
|
29
|
-
getPresence() {
|
|
30
|
-
return Array.from(__classPrivateFieldGet(this, _PresenceEngine_presenceMap, "f").entries())
|
|
31
|
-
.reduce((acc, [key, value]) => {
|
|
32
|
-
acc[key] = value;
|
|
33
|
-
return acc;
|
|
34
|
-
}, {});
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* @desc Returns the presence of a user
|
|
38
|
-
* @param userId - The id of the user
|
|
39
|
-
*/
|
|
40
|
-
getUserPresence(userId) {
|
|
41
|
-
return __classPrivateFieldGet(this, _PresenceEngine_presenceMap, "f").get(userId);
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* @desc Tracks a presence
|
|
45
|
-
* @param presenceKey - The key of the presence
|
|
46
|
-
* @param presence - The presence
|
|
47
|
-
*/
|
|
48
|
-
trackPresence(presenceKey, presence) {
|
|
49
|
-
if (!__classPrivateFieldGet(this, _PresenceEngine_presenceMap, "f").has(presenceKey)) {
|
|
50
|
-
__classPrivateFieldGet(this, _PresenceEngine_presenceMap, "f").set(presenceKey, presence);
|
|
51
|
-
__classPrivateFieldGet(this, _PresenceEngine_instances, "m", _PresenceEngine_publish).call(this, pondsocket_common_1.PresenceEventTypes.JOIN, {
|
|
52
|
-
changed: presence,
|
|
53
|
-
presence: Array.from(__classPrivateFieldGet(this, _PresenceEngine_presenceMap, "f").values()),
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
const code = 400;
|
|
58
|
-
const message = `PresenceEngine: Presence with key ${presenceKey} already exists`;
|
|
59
|
-
throw new pondError_1.PresenceError(message, code, __classPrivateFieldGet(this, _PresenceEngine_channel, "f").name, pondsocket_common_1.PresenceEventTypes.JOIN);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* @desc Removes a presence from the presence engine
|
|
64
|
-
* @param presenceKey - The key of the presence
|
|
65
|
-
* @param safe - If true, it will not throw an error if the presence does not exist
|
|
66
|
-
*/
|
|
67
|
-
removePresence(presenceKey, safe = false) {
|
|
68
|
-
const presence = __classPrivateFieldGet(this, _PresenceEngine_presenceMap, "f").get(presenceKey);
|
|
69
|
-
if (presence) {
|
|
70
|
-
__classPrivateFieldGet(this, _PresenceEngine_presenceMap, "f").delete(presenceKey);
|
|
71
|
-
__classPrivateFieldGet(this, _PresenceEngine_instances, "m", _PresenceEngine_publish).call(this, pondsocket_common_1.PresenceEventTypes.LEAVE, {
|
|
72
|
-
changed: presence,
|
|
73
|
-
presence: Array.from(__classPrivateFieldGet(this, _PresenceEngine_presenceMap, "f").values()),
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
else if (!safe) {
|
|
77
|
-
const code = 404;
|
|
78
|
-
const message = `PresenceEngine: Presence with key ${presenceKey} does not exist`;
|
|
79
|
-
throw new pondError_1.PresenceError(message, code, __classPrivateFieldGet(this, _PresenceEngine_channel, "f").name, pondsocket_common_1.PresenceEventTypes.LEAVE);
|
|
80
|
-
}
|
|
81
|
-
return presence;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* @desc Updates a presence
|
|
85
|
-
* @param presenceKey - The key of the presence
|
|
86
|
-
* @param presence - The new presence
|
|
87
|
-
*/
|
|
88
|
-
updatePresence(presenceKey, presence) {
|
|
89
|
-
const oldPresence = __classPrivateFieldGet(this, _PresenceEngine_presenceMap, "f").get(presenceKey);
|
|
90
|
-
if (oldPresence) {
|
|
91
|
-
const newPresence = Object.assign(Object.assign({}, oldPresence), presence);
|
|
92
|
-
__classPrivateFieldGet(this, _PresenceEngine_presenceMap, "f").set(presenceKey, newPresence);
|
|
93
|
-
__classPrivateFieldGet(this, _PresenceEngine_instances, "m", _PresenceEngine_publish).call(this, pondsocket_common_1.PresenceEventTypes.UPDATE, {
|
|
94
|
-
changed: newPresence,
|
|
95
|
-
presence: Array.from(__classPrivateFieldGet(this, _PresenceEngine_presenceMap, "f").values()),
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
const code = 404;
|
|
100
|
-
const message = `PresenceEngine: Presence with key ${presenceKey} does not exist`;
|
|
101
|
-
throw new pondError_1.PresenceError(message, code, __classPrivateFieldGet(this, _PresenceEngine_channel, "f").name, pondsocket_common_1.PresenceEventTypes.UPDATE);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
exports.PresenceEngine = PresenceEngine;
|
|
106
|
-
_PresenceEngine_presenceMap = new WeakMap(), _PresenceEngine_channel = new WeakMap(), _PresenceEngine_instances = new WeakSet(), _PresenceEngine_publish = function _PresenceEngine_publish(event, payload) {
|
|
107
|
-
const recipients = Array.from(__classPrivateFieldGet(this, _PresenceEngine_presenceMap, "f").keys());
|
|
108
|
-
if (recipients.length === 0) {
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
__classPrivateFieldGet(this, _PresenceEngine_channel, "f").sendMessage(pondsocket_common_1.SystemSender.CHANNEL, recipients, pondsocket_common_1.ServerActions.PRESENCE, event, payload);
|
|
112
|
-
};
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const pondsocket_common_1 = require("@eleven-am/pondsocket-common");
|
|
4
|
-
const presence_1 = require("./presence");
|
|
5
|
-
const eventResponse_test_1 = require("../channel/eventResponse.test");
|
|
6
|
-
describe('PresenceEngine', () => {
|
|
7
|
-
let presenceEngine;
|
|
8
|
-
let presence;
|
|
9
|
-
let presenceKey;
|
|
10
|
-
let channel;
|
|
11
|
-
beforeEach(() => {
|
|
12
|
-
channel = (0, eventResponse_test_1.createChannelEngine)().channelEngine;
|
|
13
|
-
channel.addUser('presenceKey', { assign: 'assign' }, () => {
|
|
14
|
-
// do nothing
|
|
15
|
-
});
|
|
16
|
-
presenceEngine = new presence_1.PresenceEngine(channel);
|
|
17
|
-
presence = {
|
|
18
|
-
id: 'id',
|
|
19
|
-
name: 'name',
|
|
20
|
-
color: 'color',
|
|
21
|
-
type: 'type',
|
|
22
|
-
location: 'location',
|
|
23
|
-
};
|
|
24
|
-
presenceKey = 'presenceKey';
|
|
25
|
-
});
|
|
26
|
-
describe('trackPresence', () => {
|
|
27
|
-
it('should insert a presence into the presence engine', () => {
|
|
28
|
-
// spy on the channel sendMessage method
|
|
29
|
-
const sendMessage = jest.spyOn(channel, 'sendMessage');
|
|
30
|
-
presenceEngine.trackPresence(presenceKey, presence);
|
|
31
|
-
// get all the params
|
|
32
|
-
const params = sendMessage.mock.calls[0];
|
|
33
|
-
// remove the first element as it contains the request id which is random
|
|
34
|
-
params.shift();
|
|
35
|
-
expect(params).toEqual([
|
|
36
|
-
['presenceKey'],
|
|
37
|
-
pondsocket_common_1.ServerActions.PRESENCE,
|
|
38
|
-
pondsocket_common_1.PresenceEventTypes.JOIN,
|
|
39
|
-
{
|
|
40
|
-
changed: presence,
|
|
41
|
-
presence: [presence],
|
|
42
|
-
},
|
|
43
|
-
]);
|
|
44
|
-
});
|
|
45
|
-
it('should throw an error if the presence already exists', () => {
|
|
46
|
-
presenceEngine.trackPresence(presenceKey, presence);
|
|
47
|
-
expect(() => presenceEngine.trackPresence(presenceKey, presence)).toThrowError(`PresenceEngine: Presence with key ${presenceKey} already exists`);
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
describe('updatePresence', () => {
|
|
51
|
-
it('should update a presence', () => {
|
|
52
|
-
presenceEngine.trackPresence(presenceKey, presence);
|
|
53
|
-
const newPresence = {
|
|
54
|
-
id: 'id',
|
|
55
|
-
name: 'name',
|
|
56
|
-
color: 'color',
|
|
57
|
-
type: 'type',
|
|
58
|
-
location: 'location',
|
|
59
|
-
};
|
|
60
|
-
const sendMessage = jest.spyOn(channel, 'sendMessage');
|
|
61
|
-
presenceEngine.updatePresence(presenceKey, newPresence);
|
|
62
|
-
// get all the params
|
|
63
|
-
const params = sendMessage.mock.calls[0];
|
|
64
|
-
// remove the first element as it contains the request id which is random
|
|
65
|
-
params.shift();
|
|
66
|
-
expect(params).toEqual([
|
|
67
|
-
['presenceKey'],
|
|
68
|
-
pondsocket_common_1.ServerActions.PRESENCE,
|
|
69
|
-
pondsocket_common_1.PresenceEventTypes.UPDATE,
|
|
70
|
-
{
|
|
71
|
-
changed: Object.assign(Object.assign({}, presence), newPresence),
|
|
72
|
-
presence: [newPresence],
|
|
73
|
-
},
|
|
74
|
-
]);
|
|
75
|
-
});
|
|
76
|
-
it('should throw an error if the presence does not exist', () => {
|
|
77
|
-
expect(() => presenceEngine.updatePresence(presenceKey, presence)).toThrowError(`PresenceEngine: Presence with key ${presenceKey} does not exist`);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
describe('removePresence', () => {
|
|
81
|
-
it('should remove a presence from the presence engine', () => {
|
|
82
|
-
const listener = jest.spyOn(channel, 'sendMessage');
|
|
83
|
-
// before we can track a presence, we need make sure the user is in the channel
|
|
84
|
-
channel.addUser('presenceKey2', { assign: 'assign' }, () => {
|
|
85
|
-
// do nothing
|
|
86
|
-
});
|
|
87
|
-
listener.mockClear();
|
|
88
|
-
presenceEngine.trackPresence(presenceKey, presence);
|
|
89
|
-
presenceEngine.trackPresence('presenceKey2', Object.assign(Object.assign({}, presence), { key: 'presence2' }));
|
|
90
|
-
expect(listener).toHaveBeenCalledTimes(2);
|
|
91
|
-
// clear the mock
|
|
92
|
-
listener.mockClear();
|
|
93
|
-
presenceEngine.removePresence(presenceKey);
|
|
94
|
-
expect(listener).toHaveBeenCalledTimes(1);
|
|
95
|
-
// get all the params
|
|
96
|
-
const params = listener.mock.calls[0];
|
|
97
|
-
// remove the first element as it contains the request id which is random
|
|
98
|
-
params.shift();
|
|
99
|
-
expect(params).toEqual([
|
|
100
|
-
['presenceKey2'],
|
|
101
|
-
pondsocket_common_1.ServerActions.PRESENCE,
|
|
102
|
-
pondsocket_common_1.PresenceEventTypes.LEAVE,
|
|
103
|
-
{
|
|
104
|
-
changed: presence,
|
|
105
|
-
presence: [
|
|
106
|
-
Object.assign(Object.assign({}, presence), { key: 'presence2' }),
|
|
107
|
-
],
|
|
108
|
-
},
|
|
109
|
-
]);
|
|
110
|
-
listener.mockClear();
|
|
111
|
-
presenceEngine.removePresence('presenceKey2');
|
|
112
|
-
expect(listener).toHaveBeenCalledTimes(0);
|
|
113
|
-
});
|
|
114
|
-
it('should throw an error if the presence does not exist', () => {
|
|
115
|
-
expect(() => presenceEngine.removePresence(presenceKey)).toThrowError(`PresenceEngine: Presence with key ${presenceKey} does not exist`);
|
|
116
|
-
});
|
|
117
|
-
it('should not throw an error if the safe flag is true', () => {
|
|
118
|
-
expect(() => presenceEngine.removePresence(presenceKey, true)).not.toThrow();
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
describe('getPresence', () => {
|
|
122
|
-
it('should return the presence', () => {
|
|
123
|
-
presenceEngine.trackPresence(presenceKey, presence);
|
|
124
|
-
const data = {};
|
|
125
|
-
data[presenceKey] = presence;
|
|
126
|
-
expect(presenceEngine.getPresence()).toEqual(data);
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
});
|