gs2 1.0.6 → 1.3.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.
@@ -0,0 +1,5 @@
1
+ import { Gs2WebSocketSession } from './model';
2
+ export default class {
3
+ session: Gs2WebSocketSession;
4
+ constructor(session: Gs2WebSocketSession);
5
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ /*
3
+ Copyright 2016 Game Server Services, Inc. or its affiliates. All Rights
4
+ Reserved.
5
+
6
+ Licensed under the Apache License, Version 2.0 (the "License").
7
+ You may not use this file except in compliance with the License.
8
+ A copy of the License is located at
9
+
10
+ http://www.apache.org/licenses/LICENSE-2.0
11
+
12
+ or in the "license" file accompanying this file. This file is distributed
13
+ on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
14
+ express or implied. See the License for the specific language governing
15
+ permissions and limitations under the License.
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ var default_1 = /** @class */ (function () {
19
+ function default_1(session) {
20
+ this.session = session;
21
+ }
22
+ return default_1;
23
+ }());
24
+ exports.default = default_1;
25
+ //# sourceMappingURL=AbstractGs2WebSocketClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractGs2WebSocketClient.js","sourceRoot":"","sources":["../src/core/AbstractGs2WebSocketClient.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;AAIH;IAIE,mBAAY,OAA4B;QACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IACH,gBAAC;AAAD,CAAC,AAPD,IAOC"}
package/core/index.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import AbstractGs2Client from './AbstractGs2RestClient';
2
- import { Gs2RestSession, BasicGs2Credential, ProjectTokenGs2Credential } from './model';
2
+ import { Gs2RestSession, Gs2WebSocketSession, BasicGs2Credential, ProjectTokenGs2Credential } from './model';
3
3
  declare const _default: {
4
4
  AbstractGs2Client: typeof AbstractGs2Client;
5
5
  Gs2RestSession: typeof Gs2RestSession;
6
+ Gs2WebSocketSession: typeof Gs2WebSocketSession;
6
7
  BasicGs2Credential: typeof BasicGs2Credential;
7
8
  ProjectTokenGs2Credential: typeof ProjectTokenGs2Credential;
8
9
  Region: {
package/core/index.js CHANGED
@@ -21,6 +21,7 @@ var model_1 = require("./model");
21
21
  exports.default = {
22
22
  AbstractGs2Client: AbstractGs2RestClient_1.default,
23
23
  Gs2RestSession: model_1.Gs2RestSession,
24
+ Gs2WebSocketSession: model_1.Gs2WebSocketSession,
24
25
  BasicGs2Credential: model_1.BasicGs2Credential,
25
26
  ProjectTokenGs2Credential: model_1.ProjectTokenGs2Credential,
26
27
  Region: model_1.Region,
package/core/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/core/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,+FAAwD;AACxD,iCAAgG;AAEhG,kBAAe;IACb,iBAAiB,iCAAA;IACjB,cAAc,wBAAA;IACd,kBAAkB,4BAAA;IAClB,yBAAyB,mCAAA;IACzB,MAAM,gBAAA;CACP,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/core/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,+FAAwD;AACxD,iCAAqH;AAErH,kBAAe;IACb,iBAAiB,iCAAA;IACjB,cAAc,wBAAA;IACd,mBAAmB,6BAAA;IACnB,kBAAkB,4BAAA;IAClB,yBAAyB,mCAAA;IACzB,MAAM,gBAAA;CACP,CAAC"}
package/core/model.d.ts CHANGED
@@ -14,6 +14,30 @@ export declare class Gs2RestSession {
14
14
  connect(): Promise<LoginResult> | undefined;
15
15
  disconnect(): void;
16
16
  }
17
+ export declare class Gs2WebSocketSession {
18
+ credential: IGs2Credential;
19
+ private client;
20
+ region: string;
21
+ projectToken: string | null;
22
+ expiresAt: number | null;
23
+ private inflightRequest;
24
+ private onOpenHandlers;
25
+ private onErrorHandlers;
26
+ private onCloseHandlers;
27
+ private onNotificationHandlers;
28
+ constructor(credential: IGs2Credential, region: string);
29
+ connect(): Promise<any>;
30
+ send(service: string, component: string, func: string, payload: any): Promise<any>;
31
+ onOpen(func: (ev: Event) => any): void;
32
+ onError(func: (ev: Event) => any): void;
33
+ onClose(func: (ev: CloseEvent) => any): void;
34
+ onNotification(func: (message: {
35
+ subject: string;
36
+ issuer: string;
37
+ payload: any;
38
+ }) => any): void;
39
+ disconnect(): Promise<any>;
40
+ }
17
41
  declare class LoginResult {
18
42
  accessToken: string;
19
43
  tokenType: string;
@@ -36,6 +60,7 @@ export declare class ProjectTokenGs2Credential implements IGs2Credential {
36
60
  }
37
61
  export declare const Gs2Constant: {
38
62
  ENDPOINT_HOST: string;
63
+ WS_ENDPOINT_HOST: string;
39
64
  };
40
65
  export declare const Region: {
41
66
  AP_NORTHEAST_1: string;
package/core/model.js CHANGED
@@ -15,9 +15,12 @@ express or implied. See the License for the specific language governing
15
15
  permissions and limitations under the License.
16
16
  */
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.Region = exports.Gs2Constant = exports.ProjectTokenGs2Credential = exports.ProjectToken = exports.Gs2RestSession = exports.BasicGs2Credential = void 0;
18
+ exports.Region = exports.Gs2Constant = exports.ProjectTokenGs2Credential = exports.ProjectToken = exports.Gs2WebSocketSession = exports.Gs2RestSession = exports.BasicGs2Credential = void 0;
19
19
  var tslib_1 = require("tslib");
20
20
  var axios_1 = (0, tslib_1.__importDefault)(require("axios"));
21
+ var async_wait_until_1 = (0, tslib_1.__importDefault)(require("async-wait-until"));
22
+ var crypto_1 = require("crypto");
23
+ var WebSocket = require('ws');
21
24
  var BasicGs2Credential = /** @class */ (function () {
22
25
  function BasicGs2Credential(clientId, clientSecret) {
23
26
  this.clientId = clientId;
@@ -65,6 +68,153 @@ var Gs2RestSession = /** @class */ (function () {
65
68
  return Gs2RestSession;
66
69
  }());
67
70
  exports.Gs2RestSession = Gs2RestSession;
71
+ var Gs2WebSocketSession = /** @class */ (function () {
72
+ function Gs2WebSocketSession(credential, region) {
73
+ this.client = null;
74
+ this.inflightRequest = {};
75
+ this.onOpenHandlers = [];
76
+ this.onErrorHandlers = [];
77
+ this.onCloseHandlers = [];
78
+ this.onNotificationHandlers = [];
79
+ this.credential = credential;
80
+ this.region = region;
81
+ this.projectToken = null;
82
+ this.expiresAt = null;
83
+ }
84
+ Gs2WebSocketSession.prototype.connect = function () {
85
+ return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
86
+ var service, url, data, response, result;
87
+ var _this = this;
88
+ return (0, tslib_1.__generator)(this, function (_a) {
89
+ switch (_a.label) {
90
+ case 0:
91
+ service = 'identifier';
92
+ url = exports.Gs2Constant.ENDPOINT_HOST
93
+ .replace('{service}', service)
94
+ .replace('{region}', this.region)
95
+ + '/projectToken/login';
96
+ if (!(this.credential instanceof BasicGs2Credential)) return [3 /*break*/, 2];
97
+ data = {
98
+ client_id: this.credential.clientId,
99
+ client_secret: this.credential.clientSecret,
100
+ };
101
+ return [4 /*yield*/, axios_1.default.post(url, data)];
102
+ case 1:
103
+ response = _a.sent();
104
+ result = new LoginResult(response.data);
105
+ this.projectToken = result.accessToken;
106
+ this.expiresAt = new Date().getTime() + result.expiresIn * 1000;
107
+ return [3 /*break*/, 3];
108
+ case 2:
109
+ if (this.credential instanceof ProjectTokenGs2Credential) {
110
+ this.projectToken = this.credential.projectToken;
111
+ }
112
+ _a.label = 3;
113
+ case 3:
114
+ this.client = new WebSocket(exports.Gs2Constant.WS_ENDPOINT_HOST.replace('{region}', this.region));
115
+ this.client.onopen = function (event) {
116
+ for (var i = 0; i < _this.onOpenHandlers.length; i++) {
117
+ _this.onOpenHandlers[i]();
118
+ }
119
+ };
120
+ this.client.onmessage = function (message) {
121
+ var payload = JSON.parse(message.data);
122
+ if (payload.type == 'notification') {
123
+ for (var i = 0; i < _this.onNotificationHandlers.length; i++) {
124
+ _this.onNotificationHandlers[i](payload.body);
125
+ }
126
+ }
127
+ else {
128
+ _this.inflightRequest[payload.requestId] = payload;
129
+ }
130
+ };
131
+ this.client.onerror = function (error) {
132
+ for (var i = 0; i < _this.onErrorHandlers.length; i++) {
133
+ _this.onErrorHandlers[i](error);
134
+ }
135
+ };
136
+ this.client.onclose = function () {
137
+ for (var i = 0; i < _this.onCloseHandlers.length; i++) {
138
+ _this.onCloseHandlers[i]();
139
+ }
140
+ };
141
+ return [4 /*yield*/, (0, async_wait_until_1.default)(function () { return _this.client == null || _this.client.readyState == WebSocket.CLOSED || _this.client.readyState == WebSocket.OPEN; })];
142
+ case 4:
143
+ _a.sent();
144
+ return [2 /*return*/];
145
+ }
146
+ });
147
+ });
148
+ };
149
+ Gs2WebSocketSession.prototype.send = function (service, component, func, payload) {
150
+ var _a;
151
+ return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
152
+ var requestId, result;
153
+ var _this = this;
154
+ return (0, tslib_1.__generator)(this, function (_b) {
155
+ switch (_b.label) {
156
+ case 0:
157
+ requestId = (0, crypto_1.randomUUID)();
158
+ this.inflightRequest[requestId] = null;
159
+ (_a = this.client) === null || _a === void 0 ? void 0 : _a.send(JSON.stringify(Object.assign({}, payload, {
160
+ xGs2ClientId: this.credential.clientId,
161
+ xGs2ProjectToken: this.projectToken,
162
+ x_gs2: {
163
+ service: service,
164
+ component: component,
165
+ function: func,
166
+ contentType: "application/json",
167
+ requestId: requestId,
168
+ },
169
+ })));
170
+ return [4 /*yield*/, (0, async_wait_until_1.default)(function () { return _this.inflightRequest[requestId] != null; })];
171
+ case 1:
172
+ _b.sent();
173
+ result = this.inflightRequest[requestId];
174
+ delete this.inflightRequest[requestId];
175
+ if (result.status != 200) {
176
+ throw result.body;
177
+ }
178
+ return [2 /*return*/, result.body];
179
+ }
180
+ });
181
+ });
182
+ };
183
+ Gs2WebSocketSession.prototype.onOpen = function (func) {
184
+ this.onOpenHandlers.push(func);
185
+ };
186
+ Gs2WebSocketSession.prototype.onError = function (func) {
187
+ this.onErrorHandlers.push(func);
188
+ };
189
+ Gs2WebSocketSession.prototype.onClose = function (func) {
190
+ this.onCloseHandlers.push(func);
191
+ };
192
+ Gs2WebSocketSession.prototype.onNotification = function (func) {
193
+ this.onNotificationHandlers.push(func);
194
+ };
195
+ Gs2WebSocketSession.prototype.disconnect = function () {
196
+ return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
197
+ var _this = this;
198
+ return (0, tslib_1.__generator)(this, function (_a) {
199
+ switch (_a.label) {
200
+ case 0:
201
+ if (!(this.client != null)) return [3 /*break*/, 2];
202
+ this.client.close();
203
+ return [4 /*yield*/, (0, async_wait_until_1.default)(function () { return _this.client == null || _this.client.readyState == WebSocket.CLOSED; })];
204
+ case 1:
205
+ _a.sent();
206
+ this.client = null;
207
+ _a.label = 2;
208
+ case 2:
209
+ this.projectToken = null;
210
+ return [2 /*return*/];
211
+ }
212
+ });
213
+ });
214
+ };
215
+ return Gs2WebSocketSession;
216
+ }());
217
+ exports.Gs2WebSocketSession = Gs2WebSocketSession;
68
218
  var LoginResult = /** @class */ (function () {
69
219
  function LoginResult(data) {
70
220
  if (data) {
@@ -95,6 +245,7 @@ var ProjectTokenGs2Credential = /** @class */ (function () {
95
245
  exports.ProjectTokenGs2Credential = ProjectTokenGs2Credential;
96
246
  exports.Gs2Constant = {
97
247
  ENDPOINT_HOST: 'https://{service}.{region}.gen2.gs2io.com',
248
+ WS_ENDPOINT_HOST: 'wss://gateway-ws.{region}.gen2.gs2io.com',
98
249
  };
99
250
  exports.Region = {
100
251
  AP_NORTHEAST_1: 'ap-northeast-1',
package/core/model.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/core/model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/core/model.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,5 @@ import * as model from './model';
2
2
  import * as request from './request';
3
3
  import * as result from './result';
4
4
  import Gs2GatewayRestClient from './rest';
5
- export { model, request, result, Gs2GatewayRestClient, };
5
+ import Gs2GatewayWebSocketClient from './websocket';
6
+ export { model, request, result, Gs2GatewayRestClient, Gs2GatewayWebSocketClient, };
package/gateway/index.js CHANGED
@@ -15,7 +15,7 @@ express or implied. See the License for the specific language governing
15
15
  permissions and limitations under the License.
16
16
  */
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.Gs2GatewayRestClient = exports.result = exports.request = exports.model = void 0;
18
+ exports.Gs2GatewayWebSocketClient = exports.Gs2GatewayRestClient = exports.result = exports.request = exports.model = void 0;
19
19
  var tslib_1 = require("tslib");
20
20
  var model = (0, tslib_1.__importStar)(require("./model"));
21
21
  exports.model = model;
@@ -25,4 +25,6 @@ var result = (0, tslib_1.__importStar)(require("./result"));
25
25
  exports.result = result;
26
26
  var rest_1 = (0, tslib_1.__importDefault)(require("./rest"));
27
27
  exports.Gs2GatewayRestClient = rest_1.default;
28
+ var websocket_1 = (0, tslib_1.__importDefault)(require("./websocket"));
29
+ exports.Gs2GatewayWebSocketClient = websocket_1.default;
28
30
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/gateway/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;;AAEH,0DAAiC;AAM7B,sBAAK;AALT,8DAAqC;AAMjC,0BAAO;AALX,4DAAmC;AAM/B,wBAAM;AALV,6DAA0C;AAMtC,+BANG,cAAoB,CAMH"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/gateway/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;;AAEH,0DAAiC;AAO7B,sBAAK;AANT,8DAAqC;AAOjC,0BAAO;AANX,4DAAmC;AAO/B,wBAAM;AANV,6DAA0C;AAOtC,+BAPG,cAAoB,CAOH;AANxB,uEAAoD;AAOhD,oCAPG,mBAAyB,CAOH"}
@@ -0,0 +1,8 @@
1
+ import AbstractGs2WebSocketClient from '../core/AbstractGs2WebSocketClient';
2
+ import { Gs2WebSocketSession } from '../core/model';
3
+ import * as Request from './request';
4
+ import * as Result from './result';
5
+ export default class Gs2GatewayWebSocketClient extends AbstractGs2WebSocketClient {
6
+ constructor(session: Gs2WebSocketSession);
7
+ setUserId(request: Request.SetUserIdRequest): Promise<Result.SetUserIdResult>;
8
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /*
3
+ Copyright 2016 Game Server Services, Inc. or its affiliates. All Rights
4
+ Reserved.
5
+
6
+ Licensed under the Apache License, Version 2.0 (the 'License').
7
+ You may not use this file except in compliance with the License.
8
+ A copy of the License is located at
9
+
10
+ http://www.apache.org/licenses/LICENSE-2.0
11
+
12
+ or in the 'license' file accompanying this file. This file is distributed
13
+ on an 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
14
+ express or implied. See the License for the specific language governing
15
+ permissions and limitations under the License.
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ var tslib_1 = require("tslib");
19
+ var AbstractGs2WebSocketClient_1 = (0, tslib_1.__importDefault)(require("../core/AbstractGs2WebSocketClient"));
20
+ var Result = (0, tslib_1.__importStar)(require("./result"));
21
+ var Gs2GatewayWebSocketClient = /** @class */ (function (_super) {
22
+ (0, tslib_1.__extends)(Gs2GatewayWebSocketClient, _super);
23
+ function Gs2GatewayWebSocketClient(session) {
24
+ return _super.call(this, session) || this;
25
+ }
26
+ Gs2GatewayWebSocketClient.prototype.setUserId = function (request) {
27
+ var _a, _b, _c, _d;
28
+ return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
29
+ var result;
30
+ return (0, tslib_1.__generator)(this, function (_e) {
31
+ switch (_e.label) {
32
+ case 0: return [4 /*yield*/, this.session.send("gateway", "webSocketSession", "setUserId", {
33
+ 'contextStack': (_a = request.getContextStack()) !== null && _a !== void 0 ? _a : null,
34
+ 'namespaceName': (_b = request.getNamespaceName()) !== null && _b !== void 0 ? _b : null,
35
+ 'xGs2AccessToken': (_c = request.getAccessToken()) !== null && _c !== void 0 ? _c : null,
36
+ 'allowConcurrentAccess': (_d = request.getAllowConcurrentAccess()) !== null && _d !== void 0 ? _d : null,
37
+ })];
38
+ case 1:
39
+ result = _e.sent();
40
+ return [2 /*return*/, Result.SetUserIdResult.fromDict(result)];
41
+ }
42
+ });
43
+ });
44
+ };
45
+ return Gs2GatewayWebSocketClient;
46
+ }(AbstractGs2WebSocketClient_1.default));
47
+ exports.default = Gs2GatewayWebSocketClient;
48
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../src/gateway/websocket.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,+GAA4E;AAG5E,4DAAmC;AAInC;IAAuD,0DAA0B;IAE7E,mCAAY,OAA4B;eACpC,kBAAM,OAAO,CAAC;IAClB,CAAC;IAEY,6CAAS,GAAtB,UAAuB,OAAiC;;;;;;4BACrC,qBAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAClC,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX;4BACI,cAAc,EAAE,MAAA,OAAO,CAAC,eAAe,EAAE,mCAAI,IAAI;4BACjD,eAAe,EAAE,MAAA,OAAO,CAAC,gBAAgB,EAAE,mCAAI,IAAI;4BACnD,iBAAiB,EAAE,MAAA,OAAO,CAAC,cAAc,EAAE,mCAAI,IAAI;4BACnD,uBAAuB,EAAE,MAAA,OAAO,CAAC,wBAAwB,EAAE,mCAAI,IAAI;yBACtE,CACJ,EAAA;;wBAVK,MAAM,GAAG,SAUd;wBACD,sBAAO,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAC;;;;KAClD;IACL,gCAAC;AAAD,CAAC,AApBD,CAAuD,oCAA0B,GAoBhF"}
package/package.json CHANGED
@@ -1,20 +1,23 @@
1
1
  {
2
2
  "name": "gs2",
3
- "version": "1.0.6",
3
+ "version": "1.3.0",
4
4
  "scripts": {
5
5
  "build": "tsc",
6
6
  "prepublishOnly": "npm run build"
7
7
  },
8
8
  "dependencies": {
9
- "axios": "^0.26.0"
9
+ "@types/websocket": "^1.0.5",
10
+ "async-wait-until": "^2.0.12",
11
+ "axios": "^0.26.0",
12
+ "websocket": "^1.0.34"
10
13
  },
11
14
  "devDependencies": {
15
+ "@types/jest": "^27.4.0",
12
16
  "@types/node": "^17.0.18",
13
- "typescript": "^4.5.5",
14
- "tslib": "^2.3.1",
15
17
  "jest": "^27.5.1",
16
18
  "ts-jest": "^27.1.3",
17
- "@types/jest": "^27.4.0"
19
+ "tslib": "^2.3.1",
20
+ "typescript": "^4.5.5"
18
21
  },
19
22
  "types": "index.d.ts",
20
23
  "postcss": {
@@ -29,8 +32,7 @@
29
32
  ],
30
33
  "test": "jest",
31
34
  "jest": {
32
- "moduleNameMapper": {
33
- },
35
+ "moduleNameMapper": {},
34
36
  "moduleFileExtensions": [
35
37
  "js",
36
38
  "jsx",
@@ -0,0 +1,26 @@
1
+ /*
2
+ Copyright 2016 Game Server Services, Inc. or its affiliates. All Rights
3
+ Reserved.
4
+
5
+ Licensed under the Apache License, Version 2.0 (the "License").
6
+ You may not use this file except in compliance with the License.
7
+ A copy of the License is located at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ or in the "license" file accompanying this file. This file is distributed
12
+ on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ express or implied. See the License for the specific language governing
14
+ permissions and limitations under the License.
15
+ */
16
+
17
+ import { Gs2WebSocketSession } from './model';
18
+
19
+ export default class {
20
+
21
+ public session: Gs2WebSocketSession;
22
+
23
+ constructor(session: Gs2WebSocketSession) {
24
+ this.session = session;
25
+ }
26
+ }
package/src/core/index.ts CHANGED
@@ -15,11 +15,12 @@ permissions and limitations under the License.
15
15
  */
16
16
 
17
17
  import AbstractGs2Client from './AbstractGs2RestClient';
18
- import { Gs2RestSession, BasicGs2Credential, ProjectTokenGs2Credential, Region } from './model';
18
+ import { Gs2RestSession, Gs2WebSocketSession, BasicGs2Credential, ProjectTokenGs2Credential, Region } from './model';
19
19
 
20
20
  export default {
21
21
  AbstractGs2Client,
22
22
  Gs2RestSession,
23
+ Gs2WebSocketSession,
23
24
  BasicGs2Credential,
24
25
  ProjectTokenGs2Credential,
25
26
  Region,
package/src/core/model.ts CHANGED
@@ -17,6 +17,9 @@ permissions and limitations under the License.
17
17
  import IGs2Credential from './interface/IGs2Credential';
18
18
  import IModel from './interface/IModel';
19
19
  import axios from 'axios';
20
+ import waitUntil from "async-wait-until";
21
+ import {randomUUID} from "crypto";
22
+ const WebSocket = require('ws');
20
23
 
21
24
  export class BasicGs2Credential implements IGs2Credential {
22
25
 
@@ -83,6 +86,146 @@ export class Gs2RestSession {
83
86
  }
84
87
  }
85
88
 
89
+
90
+ export class Gs2WebSocketSession {
91
+
92
+ public credential: IGs2Credential;
93
+ private client: WebSocket | null = null;
94
+ public region: string;
95
+ public projectToken: string | null;
96
+ public expiresAt: number | null;
97
+
98
+ private inflightRequest: any = {};
99
+
100
+ private onOpenHandlers: Function[] = [];
101
+ private onErrorHandlers: Function[] = [];
102
+ private onCloseHandlers: Function[] = [];
103
+
104
+ private onNotificationHandlers: Function[] = [];
105
+
106
+ constructor(credential: IGs2Credential, region: string) {
107
+ this.credential = credential;
108
+ this.region = region;
109
+ this.projectToken = null;
110
+ this.expiresAt = null;
111
+ }
112
+
113
+ public async connect(): Promise<any> {
114
+
115
+ const service = 'identifier';
116
+ const url = Gs2Constant.ENDPOINT_HOST
117
+ .replace('{service}', service)
118
+ .replace('{region}', this.region)
119
+ + '/projectToken/login';
120
+
121
+ if (this.credential instanceof BasicGs2Credential) {
122
+ const data = {
123
+ client_id: (this.credential as BasicGs2Credential).clientId,
124
+ client_secret: (this.credential as BasicGs2Credential).clientSecret,
125
+ };
126
+
127
+ const response = await axios.post(
128
+ url,
129
+ data,
130
+ )
131
+ const result = new LoginResult(response.data);
132
+ this.projectToken = result.accessToken;
133
+ this.expiresAt = new Date().getTime() + result.expiresIn * 1000;
134
+ } else if (this.credential instanceof ProjectTokenGs2Credential) {
135
+ this.projectToken = (this.credential as ProjectTokenGs2Credential).projectToken;
136
+ }
137
+
138
+ this.client = new WebSocket(Gs2Constant.WS_ENDPOINT_HOST.replace('{region}', this.region));
139
+ this.client!.onopen = (event: Event): any => {
140
+ for (let i=0; i<this.onOpenHandlers.length; i++) {
141
+ this.onOpenHandlers[i]();
142
+ }
143
+ };
144
+ this.client!.onmessage = (message: MessageEvent) => {
145
+ const payload = JSON.parse(message.data);
146
+ if (payload.type == 'notification') {
147
+ for (let i=0; i<this.onNotificationHandlers.length; i++) {
148
+ this.onNotificationHandlers[i](payload.body);
149
+ }
150
+ } else {
151
+ this.inflightRequest[payload.requestId] = payload;
152
+ }
153
+ };
154
+ this.client!.onerror = (error: Event) => {
155
+ for (let i = 0; i < this.onErrorHandlers.length; i++) {
156
+ this.onErrorHandlers[i](error);
157
+ }
158
+ };
159
+ this.client!.onclose = () => {
160
+ for (let i=0; i<this.onCloseHandlers.length; i++) {
161
+ this.onCloseHandlers[i]();
162
+ }
163
+ };
164
+ await waitUntil(() => this.client == null || this.client.readyState == WebSocket.CLOSED || this.client.readyState == WebSocket.OPEN);
165
+ }
166
+
167
+ public async send(
168
+ service: string,
169
+ component: string,
170
+ func: string,
171
+ payload: any,
172
+ ): Promise<any> {
173
+
174
+ const requestId = randomUUID();
175
+
176
+ this.inflightRequest[requestId] = null;
177
+ this.client?.send(JSON.stringify(Object.assign({}, payload, {
178
+ xGs2ClientId: this.credential.clientId,
179
+ xGs2ProjectToken: this.projectToken,
180
+ x_gs2: {
181
+ service: service,
182
+ component: component,
183
+ function: func,
184
+ contentType: "application/json",
185
+ requestId : requestId,
186
+ },
187
+ })));
188
+
189
+ await waitUntil(() => this.inflightRequest[requestId] != null);
190
+
191
+ const result = this.inflightRequest[requestId];
192
+ delete this.inflightRequest[requestId];
193
+ if (result.status != 200) {
194
+ throw result.body;
195
+ }
196
+ return result.body;
197
+ }
198
+
199
+ public onOpen(func: (ev: Event) => any) {
200
+ this.onOpenHandlers.push(func);
201
+ }
202
+
203
+ public onError(func: (ev: Event) => any) {
204
+ this.onErrorHandlers.push(func);
205
+ }
206
+
207
+ public onClose(func: (ev: CloseEvent) => any) {
208
+ this.onCloseHandlers.push(func);
209
+ }
210
+
211
+ public onNotification(func: (message: {
212
+ subject: string,
213
+ issuer: string,
214
+ payload: any,
215
+ }) => any) {
216
+ this.onNotificationHandlers.push(func);
217
+ }
218
+
219
+ public async disconnect(): Promise<any> {
220
+ if (this.client != null) {
221
+ this.client.close();
222
+ await waitUntil(() => this.client == null || this.client.readyState == WebSocket.CLOSED);
223
+ this.client = null;
224
+ }
225
+ this.projectToken = null;
226
+ }
227
+ }
228
+
86
229
  class LoginResult {
87
230
 
88
231
  public accessToken!: string;
@@ -129,6 +272,7 @@ export class ProjectTokenGs2Credential implements IGs2Credential {
129
272
 
130
273
  export const Gs2Constant = {
131
274
  ENDPOINT_HOST: 'https://{service}.{region}.gen2.gs2io.com',
275
+ WS_ENDPOINT_HOST: 'wss://gateway-ws.{region}.gen2.gs2io.com',
132
276
  };
133
277
 
134
278
  export const Region = {
@@ -18,10 +18,12 @@ import * as model from './model';
18
18
  import * as request from './request';
19
19
  import * as result from './result';
20
20
  import Gs2GatewayRestClient from './rest';
21
+ import Gs2GatewayWebSocketClient from './websocket';
21
22
 
22
23
  export {
23
24
  model,
24
25
  request,
25
26
  result,
26
27
  Gs2GatewayRestClient,
28
+ Gs2GatewayWebSocketClient,
27
29
  }
@@ -0,0 +1,44 @@
1
+ /*
2
+ Copyright 2016 Game Server Services, Inc. or its affiliates. All Rights
3
+ Reserved.
4
+
5
+ Licensed under the Apache License, Version 2.0 (the 'License').
6
+ You may not use this file except in compliance with the License.
7
+ A copy of the License is located at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ or in the 'license' file accompanying this file. This file is distributed
12
+ on an 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ express or implied. See the License for the specific language governing
14
+ permissions and limitations under the License.
15
+ */
16
+
17
+ import AbstractGs2WebSocketClient from '../core/AbstractGs2WebSocketClient';
18
+ import { Gs2Constant, Gs2WebSocketSession } from '../core/model';
19
+ import * as Request from './request';
20
+ import * as Result from './result';
21
+
22
+ import axios from 'axios';
23
+
24
+ export default class Gs2GatewayWebSocketClient extends AbstractGs2WebSocketClient {
25
+
26
+ constructor(session: Gs2WebSocketSession) {
27
+ super(session);
28
+ }
29
+
30
+ public async setUserId(request: Request.SetUserIdRequest): Promise<Result.SetUserIdResult> {
31
+ const result = await this.session.send(
32
+ "gateway",
33
+ "webSocketSession",
34
+ "setUserId",
35
+ {
36
+ 'contextStack': request.getContextStack() ?? null,
37
+ 'namespaceName': request.getNamespaceName() ?? null,
38
+ 'xGs2AccessToken': request.getAccessToken() ?? null,
39
+ 'allowConcurrentAccess': request.getAllowConcurrentAccess() ?? null,
40
+ },
41
+ );
42
+ return Result.SetUserIdResult.fromDict(result);
43
+ }
44
+ }