@eleven-am/pondsocket 0.1.214 → 0.1.216
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/distributor.d.ts +13 -0
- package/abstracts/distributor.js +148 -56
- package/abstracts/middleware.d.ts +22 -0
- package/abstracts/middleware.js +8 -1
- package/abstracts/types.d.ts +65 -0
- package/abstracts/types.js +0 -14
- package/contexts/baseContext.d.ts +20 -0
- package/contexts/baseContext.js +17 -25
- package/contexts/connectionContext.d.ts +66 -0
- package/contexts/connectionContext.js +1 -0
- package/contexts/eventContext.d.ts +15 -0
- package/contexts/eventContext.js +5 -49
- package/contexts/joinContext.d.ts +17 -0
- package/contexts/joinContext.js +14 -55
- package/contexts/outgoingContext.d.ts +28 -0
- package/contexts/outgoingContext.js +3 -0
- package/engines/channelEngine.d.ts +26 -0
- package/engines/channelEngine.js +243 -192
- package/engines/endpointEngine.d.ts +34 -0
- package/engines/endpointEngine.js +23 -7
- package/engines/lobbyEngine.d.ts +54 -0
- package/engines/lobbyEngine.js +1 -1
- package/engines/presenceEngine.d.ts +15 -0
- package/engines/presenceEngine.js +6 -59
- package/errors/httpError.d.ts +6 -0
- package/errors/httpError.js +2 -0
- package/index.d.ts +14 -5
- package/index.js +37 -3
- package/matcher/matcher.d.ts +2 -0
- package/matcher/matcher.js +5 -5
- package/package.json +44 -21
- package/server/server.d.ts +21 -0
- package/server/server.js +55 -12
- package/types.d.ts +59 -622
- package/types.js +19 -0
- package/wrappers/channel.d.ts +54 -0
- package/wrappers/endpoint.d.ts +10 -0
- package/wrappers/pondChannel.d.ts +15 -0
package/contexts/eventContext.js
CHANGED
|
@@ -10,90 +10,46 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
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
11
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
12
|
};
|
|
13
|
-
var
|
|
13
|
+
var _EventContext_event, _EventContext_requestId;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.EventContext = void 0;
|
|
16
16
|
const pondsocket_common_1 = require("@eleven-am/pondsocket-common");
|
|
17
17
|
const baseContext_1 = require("./baseContext");
|
|
18
|
-
/**
|
|
19
|
-
* EventContext combines the functionality of EventRequest and EventResponse
|
|
20
|
-
* to provide a unified interface for handling events in a channel.
|
|
21
|
-
*/
|
|
22
18
|
class EventContext extends baseContext_1.BaseContext {
|
|
23
19
|
constructor(event, params, engine) {
|
|
24
20
|
super(engine, params, event.event, event.payload, event.sender);
|
|
25
|
-
_EventContext_instances.add(this);
|
|
26
21
|
_EventContext_event.set(this, void 0);
|
|
27
22
|
_EventContext_requestId.set(this, void 0);
|
|
28
23
|
__classPrivateFieldSet(this, _EventContext_event, event, "f");
|
|
29
24
|
__classPrivateFieldSet(this, _EventContext_requestId, event.requestId, "f");
|
|
30
25
|
}
|
|
31
|
-
/**
|
|
32
|
-
* Assigns data to the client
|
|
33
|
-
*/
|
|
34
26
|
assign(assigns) {
|
|
35
27
|
this.channel.updateAssigns(__classPrivateFieldGet(this, _EventContext_event, "f").sender, assigns);
|
|
36
28
|
return this;
|
|
37
29
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Sends a direct reply to the client
|
|
40
|
-
*/
|
|
41
30
|
reply(event, payload) {
|
|
42
31
|
this.engine.sendMessage(pondsocket_common_1.SystemSender.CHANNEL, [__classPrivateFieldGet(this, _EventContext_event, "f").sender], pondsocket_common_1.ServerActions.SYSTEM, event, payload, __classPrivateFieldGet(this, _EventContext_requestId, "f"));
|
|
43
32
|
return this;
|
|
44
33
|
}
|
|
45
|
-
/**
|
|
46
|
-
* Broadcasts a message to all users in the channel
|
|
47
|
-
*/
|
|
48
|
-
broadcast(event, payload) {
|
|
49
|
-
__classPrivateFieldGet(this, _EventContext_instances, "m", _EventContext_sendMessage).call(this, pondsocket_common_1.ChannelReceiver.ALL_USERS, event, payload);
|
|
50
|
-
return this;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Broadcasts a message to all users except the sender
|
|
54
|
-
*/
|
|
55
|
-
broadcastFrom(event, payload) {
|
|
56
|
-
__classPrivateFieldGet(this, _EventContext_instances, "m", _EventContext_sendMessage).call(this, pondsocket_common_1.ChannelReceiver.ALL_EXCEPT_SENDER, event, payload);
|
|
57
|
-
return this;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Broadcasts a message to specific users
|
|
61
|
-
*/
|
|
62
|
-
broadcastTo(event, payload, userIds) {
|
|
63
|
-
const ids = Array.isArray(userIds) ? userIds : [userIds];
|
|
64
|
-
__classPrivateFieldGet(this, _EventContext_instances, "m", _EventContext_sendMessage).call(this, ids, event, payload);
|
|
65
|
-
return this;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Tracks a user's presence
|
|
69
|
-
*/
|
|
70
34
|
trackPresence(presence, userId = __classPrivateFieldGet(this, _EventContext_event, "f").sender) {
|
|
71
35
|
this.channel.trackPresence(userId, presence);
|
|
72
36
|
return this;
|
|
73
37
|
}
|
|
74
|
-
/**
|
|
75
|
-
* Updates a user's presence
|
|
76
|
-
*/
|
|
77
38
|
updatePresence(presence, userId = __classPrivateFieldGet(this, _EventContext_event, "f").sender) {
|
|
78
39
|
this.channel.updatePresence(userId, presence);
|
|
79
40
|
return this;
|
|
80
41
|
}
|
|
81
|
-
/**
|
|
82
|
-
* Kicks a user from the channel
|
|
83
|
-
*/
|
|
84
42
|
evictUser(reason, userId = __classPrivateFieldGet(this, _EventContext_event, "f").sender) {
|
|
85
43
|
this.channel.evictUser(userId, reason);
|
|
86
44
|
return this;
|
|
87
45
|
}
|
|
88
|
-
/**
|
|
89
|
-
* Removes a user's presence
|
|
90
|
-
*/
|
|
91
46
|
removePresence(userId = __classPrivateFieldGet(this, _EventContext_event, "f").sender) {
|
|
92
47
|
this.channel.removePresence(userId);
|
|
93
48
|
return this;
|
|
94
49
|
}
|
|
50
|
+
_sendMessageToRecipients(recipient, event, payload) {
|
|
51
|
+
this.engine.sendMessage(__classPrivateFieldGet(this, _EventContext_event, "f").sender, recipient, pondsocket_common_1.ServerActions.BROADCAST, event, payload, __classPrivateFieldGet(this, _EventContext_requestId, "f"));
|
|
52
|
+
}
|
|
95
53
|
}
|
|
96
54
|
exports.EventContext = EventContext;
|
|
97
|
-
_EventContext_event = new WeakMap(), _EventContext_requestId = new WeakMap()
|
|
98
|
-
this.engine.sendMessage(__classPrivateFieldGet(this, _EventContext_event, "f").sender, recipient, pondsocket_common_1.ServerActions.BROADCAST, event, payload, __classPrivateFieldGet(this, _EventContext_requestId, "f"));
|
|
99
|
-
};
|
|
55
|
+
_EventContext_event = new WeakMap(), _EventContext_requestId = new WeakMap();
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ChannelReceivers, JoinParams, PondAssigns, PondMessage, PondObject, PondPresence, UserData } from '@eleven-am/pondsocket-common';
|
|
2
|
+
import { BaseContext } from './baseContext';
|
|
3
|
+
import { JoinRequestOptions, RequestCache } from '../abstracts/types';
|
|
4
|
+
import { ChannelEngine } from '../engines/channelEngine';
|
|
5
|
+
export declare class JoinContext<Path extends string> extends BaseContext<Path> {
|
|
6
|
+
#private;
|
|
7
|
+
constructor(options: JoinRequestOptions<Path>, engine: ChannelEngine, user: RequestCache);
|
|
8
|
+
get user(): UserData;
|
|
9
|
+
get joinParams(): JoinParams;
|
|
10
|
+
get hasResponded(): boolean;
|
|
11
|
+
accept(): JoinContext<Path>;
|
|
12
|
+
decline(message?: string, errorCode?: number): JoinContext<Path>;
|
|
13
|
+
assign(assigns: PondAssigns): JoinContext<Path>;
|
|
14
|
+
reply(event: string, payload: PondMessage): JoinContext<Path>;
|
|
15
|
+
trackPresence(presence: PondPresence): JoinContext<Path>;
|
|
16
|
+
protected _sendMessageToRecipients(recipient: ChannelReceivers, event: string, payload: PondObject): void;
|
|
17
|
+
}
|
package/contexts/joinContext.js
CHANGED
|
@@ -10,16 +10,12 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
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
11
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
12
|
};
|
|
13
|
-
var _JoinContext_instances, _JoinContext_options, _JoinContext_user, _JoinContext_newAssigns, _JoinContext_executed, _JoinContext_accepted,
|
|
13
|
+
var _JoinContext_instances, _JoinContext_options, _JoinContext_user, _JoinContext_newAssigns, _JoinContext_executed, _JoinContext_accepted, _JoinContext_directMessage, _JoinContext_performChecks;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.JoinContext = void 0;
|
|
16
16
|
const pondsocket_common_1 = require("@eleven-am/pondsocket-common");
|
|
17
17
|
const baseContext_1 = require("./baseContext");
|
|
18
18
|
const httpError_1 = require("../errors/httpError");
|
|
19
|
-
/**
|
|
20
|
-
* JoinContext combines the functionality of JoinRequest and JoinResponse
|
|
21
|
-
* to provide a unified interface for handling join events in a channel.
|
|
22
|
-
*/
|
|
23
19
|
class JoinContext extends baseContext_1.BaseContext {
|
|
24
20
|
constructor(options, engine, user) {
|
|
25
21
|
super(engine, options.params, engine.name, options.joinParams, user.clientId);
|
|
@@ -35,9 +31,6 @@ class JoinContext extends baseContext_1.BaseContext {
|
|
|
35
31
|
__classPrivateFieldSet(this, _JoinContext_accepted, false, "f");
|
|
36
32
|
__classPrivateFieldSet(this, _JoinContext_newAssigns, Object.assign({}, user.assigns), "f");
|
|
37
33
|
}
|
|
38
|
-
/**
|
|
39
|
-
* The user who sent the request
|
|
40
|
-
*/
|
|
41
34
|
get user() {
|
|
42
35
|
return {
|
|
43
36
|
id: __classPrivateFieldGet(this, _JoinContext_options, "f").clientId,
|
|
@@ -45,32 +38,28 @@ class JoinContext extends baseContext_1.BaseContext {
|
|
|
45
38
|
presence: {},
|
|
46
39
|
};
|
|
47
40
|
}
|
|
48
|
-
/**
|
|
49
|
-
* The join parameters
|
|
50
|
-
*/
|
|
51
41
|
get joinParams() {
|
|
52
42
|
return __classPrivateFieldGet(this, _JoinContext_options, "f").joinParams;
|
|
53
43
|
}
|
|
54
|
-
/**
|
|
55
|
-
* Whether the request has been handled
|
|
56
|
-
*/
|
|
57
44
|
get hasResponded() {
|
|
58
45
|
return __classPrivateFieldGet(this, _JoinContext_executed, "f");
|
|
59
46
|
}
|
|
60
|
-
/**
|
|
61
|
-
* Accepts the join request
|
|
62
|
-
*/
|
|
63
47
|
accept() {
|
|
48
|
+
var _a;
|
|
64
49
|
__classPrivateFieldGet(this, _JoinContext_instances, "m", _JoinContext_performChecks).call(this);
|
|
65
50
|
const onMessage = this.engine.parent.parent.sendMessage.bind(this.engine.parent.parent, __classPrivateFieldGet(this, _JoinContext_user, "f").socket);
|
|
66
51
|
const subscription = this.engine.addUser(__classPrivateFieldGet(this, _JoinContext_user, "f").clientId, __classPrivateFieldGet(this, _JoinContext_newAssigns, "f"), onMessage);
|
|
67
|
-
|
|
52
|
+
const wrappedSubscription = () => {
|
|
53
|
+
var _a;
|
|
54
|
+
subscription();
|
|
55
|
+
__classPrivateFieldGet(this, _JoinContext_user, "f").subscriptions.delete(wrappedSubscription);
|
|
56
|
+
(_a = __classPrivateFieldGet(this, _JoinContext_user, "f").channelSubscriptions) === null || _a === void 0 ? void 0 : _a.delete(this.engine.name);
|
|
57
|
+
};
|
|
58
|
+
__classPrivateFieldGet(this, _JoinContext_user, "f").subscriptions.add(wrappedSubscription);
|
|
59
|
+
(_a = __classPrivateFieldGet(this, _JoinContext_user, "f").channelSubscriptions) === null || _a === void 0 ? void 0 : _a.set(this.engine.name, wrappedSubscription);
|
|
68
60
|
__classPrivateFieldSet(this, _JoinContext_accepted, true, "f");
|
|
69
61
|
return this;
|
|
70
62
|
}
|
|
71
|
-
/**
|
|
72
|
-
* Declines the join request
|
|
73
|
-
*/
|
|
74
63
|
decline(message, errorCode) {
|
|
75
64
|
__classPrivateFieldGet(this, _JoinContext_instances, "m", _JoinContext_performChecks).call(this);
|
|
76
65
|
const errorMessage = {
|
|
@@ -86,9 +75,6 @@ class JoinContext extends baseContext_1.BaseContext {
|
|
|
86
75
|
__classPrivateFieldGet(this, _JoinContext_instances, "m", _JoinContext_directMessage).call(this, errorMessage);
|
|
87
76
|
return this;
|
|
88
77
|
}
|
|
89
|
-
/**
|
|
90
|
-
* Assigns data to the user
|
|
91
|
-
*/
|
|
92
78
|
assign(assigns) {
|
|
93
79
|
if (__classPrivateFieldGet(this, _JoinContext_accepted, "f")) {
|
|
94
80
|
this.engine.updateAssigns(__classPrivateFieldGet(this, _JoinContext_user, "f").clientId, assigns);
|
|
@@ -98,9 +84,6 @@ class JoinContext extends baseContext_1.BaseContext {
|
|
|
98
84
|
}
|
|
99
85
|
return this;
|
|
100
86
|
}
|
|
101
|
-
/**
|
|
102
|
-
* Sends a direct reply to the user
|
|
103
|
-
*/
|
|
104
87
|
reply(event, payload) {
|
|
105
88
|
const message = {
|
|
106
89
|
action: pondsocket_common_1.ServerActions.SYSTEM,
|
|
@@ -112,40 +95,16 @@ class JoinContext extends baseContext_1.BaseContext {
|
|
|
112
95
|
__classPrivateFieldGet(this, _JoinContext_instances, "m", _JoinContext_directMessage).call(this, message);
|
|
113
96
|
return this;
|
|
114
97
|
}
|
|
115
|
-
/**
|
|
116
|
-
* Broadcasts a message to specific users
|
|
117
|
-
*/
|
|
118
|
-
broadcastTo(event, payload, userIds) {
|
|
119
|
-
const ids = Array.isArray(userIds) ? userIds : [userIds];
|
|
120
|
-
__classPrivateFieldGet(this, _JoinContext_instances, "m", _JoinContext_sendMessage).call(this, ids, event, payload);
|
|
121
|
-
return this;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Broadcasts a message to all users in the channel
|
|
125
|
-
*/
|
|
126
|
-
broadcast(event, payload) {
|
|
127
|
-
__classPrivateFieldGet(this, _JoinContext_instances, "m", _JoinContext_sendMessage).call(this, pondsocket_common_1.ChannelReceiver.ALL_USERS, event, payload);
|
|
128
|
-
return this;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Broadcasts a message to all users except the sender
|
|
132
|
-
*/
|
|
133
|
-
broadcastFrom(event, payload) {
|
|
134
|
-
__classPrivateFieldGet(this, _JoinContext_instances, "m", _JoinContext_sendMessage).call(this, pondsocket_common_1.ChannelReceiver.ALL_EXCEPT_SENDER, event, payload);
|
|
135
|
-
return this;
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Tracks the user's presence
|
|
139
|
-
*/
|
|
140
98
|
trackPresence(presence) {
|
|
141
99
|
this.engine.trackPresence(__classPrivateFieldGet(this, _JoinContext_user, "f").clientId, presence);
|
|
142
100
|
return this;
|
|
143
101
|
}
|
|
102
|
+
_sendMessageToRecipients(recipient, event, payload) {
|
|
103
|
+
this.engine.sendMessage(__classPrivateFieldGet(this, _JoinContext_user, "f").clientId, recipient, pondsocket_common_1.ServerActions.BROADCAST, event, payload, __classPrivateFieldGet(this, _JoinContext_user, "f").requestId);
|
|
104
|
+
}
|
|
144
105
|
}
|
|
145
106
|
exports.JoinContext = JoinContext;
|
|
146
|
-
_JoinContext_options = new WeakMap(), _JoinContext_user = new WeakMap(), _JoinContext_newAssigns = new WeakMap(), _JoinContext_executed = new WeakMap(), _JoinContext_accepted = new WeakMap(), _JoinContext_instances = new WeakSet(),
|
|
147
|
-
this.engine.sendMessage(__classPrivateFieldGet(this, _JoinContext_user, "f").clientId, recipient, pondsocket_common_1.ServerActions.BROADCAST, event, payload, __classPrivateFieldGet(this, _JoinContext_user, "f").requestId);
|
|
148
|
-
}, _JoinContext_directMessage = function _JoinContext_directMessage(event) {
|
|
107
|
+
_JoinContext_options = new WeakMap(), _JoinContext_user = new WeakMap(), _JoinContext_newAssigns = new WeakMap(), _JoinContext_executed = new WeakMap(), _JoinContext_accepted = new WeakMap(), _JoinContext_instances = new WeakSet(), _JoinContext_directMessage = function _JoinContext_directMessage(event) {
|
|
149
108
|
this.engine.parent.parent.sendMessage(__classPrivateFieldGet(this, _JoinContext_user, "f").socket, event);
|
|
150
109
|
}, _JoinContext_performChecks = function _JoinContext_performChecks() {
|
|
151
110
|
if (__classPrivateFieldGet(this, _JoinContext_executed, "f")) {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ChannelReceivers, Event, EventParams, PondMessage, PondObject } from '@eleven-am/pondsocket-common';
|
|
2
|
+
import { BaseContext } from './baseContext';
|
|
3
|
+
import { ChannelEngine } from '../engines/channelEngine';
|
|
4
|
+
export declare class OutgoingContext<Path extends string> extends BaseContext<Path> {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(event: Event, params: EventParams<Path>, engine: ChannelEngine, userid: string);
|
|
7
|
+
get payload(): PondMessage;
|
|
8
|
+
/**
|
|
9
|
+
* Blocks the outgoing context, preventing further processing of the event.
|
|
10
|
+
*/
|
|
11
|
+
block(): this;
|
|
12
|
+
/**
|
|
13
|
+
* Checks if the outgoing context is blocked.
|
|
14
|
+
* @returns {boolean} - True if blocked, false otherwise.
|
|
15
|
+
*/
|
|
16
|
+
isBlocked(): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Transforms the outgoing context with a new payload.
|
|
19
|
+
* @param payload - The new payload to set for the context.
|
|
20
|
+
*/
|
|
21
|
+
transform(payload: PondMessage): this;
|
|
22
|
+
/**
|
|
23
|
+
* Updates the parameters of the outgoing context.
|
|
24
|
+
* @param params - The new parameters to set for the context.
|
|
25
|
+
*/
|
|
26
|
+
updateParams(params: EventParams<Path>): void;
|
|
27
|
+
protected _sendMessageToRecipients(_recipient: ChannelReceivers, _event: string, _payload: PondObject): void;
|
|
28
|
+
}
|
|
@@ -54,6 +54,9 @@ class OutgoingContext extends baseContext_1.BaseContext {
|
|
|
54
54
|
updateParams(params) {
|
|
55
55
|
super.updateParams(params);
|
|
56
56
|
}
|
|
57
|
+
_sendMessageToRecipients(_recipient, _event, _payload) {
|
|
58
|
+
void 0;
|
|
59
|
+
}
|
|
57
60
|
}
|
|
58
61
|
exports.OutgoingContext = OutgoingContext;
|
|
59
62
|
_OutgoingContext_payload = new WeakMap(), _OutgoingContext_isBlocked = new WeakMap();
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ChannelEvent, ChannelReceivers, ClientMessage, PondAssigns, PondMessage, PondPresence, ServerActions, Unsubscribe, UserAssigns, UserData, UserPresences } from '@eleven-am/pondsocket-common';
|
|
2
|
+
import { LobbyEngine } from './lobbyEngine';
|
|
3
|
+
import { type ChannelSenders } from '../abstracts/types';
|
|
4
|
+
import { type IDistributedBackend } from '../types';
|
|
5
|
+
export declare class ChannelEngine {
|
|
6
|
+
#private;
|
|
7
|
+
parent: LobbyEngine;
|
|
8
|
+
constructor(parent: LobbyEngine, name: string, backend?: IDistributedBackend | null);
|
|
9
|
+
get name(): string;
|
|
10
|
+
get users(): Set<string>;
|
|
11
|
+
addUser(userId: string, assigns: PondAssigns, onMessage: (event: ChannelEvent) => void): Unsubscribe;
|
|
12
|
+
sendMessage(sender: ChannelSenders, recipient: ChannelReceivers, action: ServerActions, event: string, payload: PondMessage, requestId?: string): void;
|
|
13
|
+
broadcastMessage(userId: string, message: ClientMessage): void;
|
|
14
|
+
trackPresence(userId: string, presence: PondPresence): void;
|
|
15
|
+
updatePresence(userId: string, presence: PondPresence): void;
|
|
16
|
+
removePresence(userId: string): void;
|
|
17
|
+
upsertPresence(userId: string, presence: PondPresence): void;
|
|
18
|
+
updateAssigns(userId: string, assigns: PondMessage): void;
|
|
19
|
+
kickUser(userId: string, reason: string): void;
|
|
20
|
+
getAssigns(): UserAssigns;
|
|
21
|
+
getPresence(): UserPresences;
|
|
22
|
+
destroy(reason?: string): void;
|
|
23
|
+
removeUser(userId: string, skipDistributedBroadcast?: boolean): void;
|
|
24
|
+
getUserData(userId: string): UserData;
|
|
25
|
+
close(): void;
|
|
26
|
+
}
|