File: ve.dm.FakeSocket.js

package info (click to toggle)
mediawiki 1%3A1.43.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 417,464 kB
  • sloc: php: 1,062,949; javascript: 664,290; sql: 9,714; python: 5,458; xml: 3,489; sh: 1,131; makefile: 64
file content (69 lines) | stat: -rw-r--r-- 1,802 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*!
 * VisualEditor DataModel Fake socket.io-like class for testing
 *
 * @copyright See AUTHORS.txt
 */

// Fake socket class, with limited API
ve.dm.FakeSocket = function VeDmFakeSocket( server, query ) {
	server.sockets.sockets.push( this );
	this.handlers = new Map();
	this.rooms = new Set();
	this.pending = [];
	this.handshake = { query: query, url: 'fakeurl' };
	this.client = { conn: { remoteAddress: 'fakeaddress' } };
	this.storedDataForDoc = {};
	this.dataForDoc = undefined;
	this.log = [];
};

OO.initClass( ve.dm.FakeSocket );

ve.dm.FakeSocket.static.makeServer = function () {
	const sockets = [],
		log = [];

	const getRoom = function ( roomName ) {
		return { emit: ( ...args ) => {
			sockets.forEach( ( socket ) => {
				if ( socket.rooms.has( roomName ) ) {
					socket.emit( ...args );
				}
			} );
		} };
	};
	const reset = function () {
		sockets.length = 0;
		log.length = 0;
	};
	return { sockets: { sockets: sockets, log: log, in: getRoom, reset: reset } };
};

ve.dm.FakeSocket.prototype.join = function ( roomName ) {
	this.rooms.add( roomName );
};

ve.dm.FakeSocket.prototype.emit = function ( eventName, ...args ) {
	const handlers = this.handlers.get( eventName ) || [];
	handlers.forEach( ( handler ) => {
		this.pending.push( handler( ...args ) );
	} );
};

ve.dm.FakeSocket.prototype.on = function ( eventName, handler ) {
	if ( !this.handlers.has( eventName ) ) {
		this.handlers.set( eventName, [] );
	}
	this.handlers.get( eventName ).push( handler );
};

ve.dm.FakeSocket.prototype.receive = function ( eventName, ...args ) {
	const handlers = this.handlers.get( eventName ) || [];
	handlers.forEach( ( handler ) => {
		this.pending.push( handler( ...args ) );
	} );
};

ve.dm.FakeSocket.prototype.wait = function () {
	return Promise.all( this.pending );
};