@google-cloud/agones-sdk 1.18.0 → 1.25.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/package.json CHANGED
@@ -4,13 +4,13 @@
4
4
  "url": "https://github.com/googleforgames/agones/issues"
5
5
  },
6
6
  "dependencies": {
7
- "@grpc/grpc-js": "1.2.12",
8
- "google-protobuf": "3.15.6"
7
+ "@grpc/grpc-js": "1.5.4",
8
+ "google-protobuf": "3.19.4"
9
9
  },
10
10
  "description": "Game Server SDK for Agones, the open source project for hosting dedicated game servers on Kubernetes",
11
11
  "devDependencies": {
12
- "eslint": "^7.32.0",
13
- "jasmine": "^3.9.0",
12
+ "eslint": "^8.8.0",
13
+ "jasmine": "^4.0.2",
14
14
  "nyc": "^15.1.0"
15
15
  },
16
16
  "homepage": "https://agones.dev",
@@ -26,5 +26,5 @@
26
26
  "publishConfig": {
27
27
  "access": "public"
28
28
  },
29
- "version": "1.18.0"
29
+ "version": "1.25.0"
30
30
  }
@@ -152,7 +152,7 @@ describe('AgonesSDK', () => {
152
152
 
153
153
  describe('health', () => {
154
154
  it('calls the server and passes calls to stream', async () => {
155
- let stream = jasmine.createSpyObj('stream', ['write']);
155
+ let stream = jasmine.createSpyObj('stream', ['write', 'on']);
156
156
  spyOn(agonesSDK.client, 'health').and.callFake(() => {
157
157
  return stream;
158
158
  });
@@ -163,7 +163,7 @@ describe('AgonesSDK', () => {
163
163
  });
164
164
 
165
165
  it('uses the same stream for subsequent calls', async () => {
166
- let stream = jasmine.createSpyObj('stream', ['write']);
166
+ let stream = jasmine.createSpyObj('stream', ['write', 'on']);
167
167
  spyOn(agonesSDK.client, 'health').and.callFake(() => {
168
168
  return stream;
169
169
  });
@@ -187,8 +187,55 @@ describe('AgonesSDK', () => {
187
187
  }
188
188
  });
189
189
 
190
+ it('calls the server and handles stream write error if callback provided', async () => {
191
+ let stream = jasmine.createSpyObj('stream', ['write', 'on']);
192
+ stream.write.and.callFake((chunk, encoding, callback) => {
193
+ callback('error');
194
+ });
195
+ spyOn(agonesSDK.client, 'health').and.callFake(() => {
196
+ return stream;
197
+ });
198
+ try {
199
+ agonesSDK.health((error) => {
200
+ expect(error).toEqual('error');
201
+ });
202
+ } catch (error) {
203
+ fail();
204
+ }
205
+ });
206
+
207
+ it('calls the server and re throws stream write error if no callback', async () => {
208
+ let stream = jasmine.createSpyObj('stream', ['write', 'on']);
209
+ stream.write.and.callFake((chunk, encoding, callback) => {
210
+ callback('error');
211
+ });
212
+ spyOn(agonesSDK.client, 'health').and.callFake(() => {
213
+ return stream;
214
+ });
215
+ try {
216
+ agonesSDK.health();
217
+ fail();
218
+ } catch (error) {
219
+ expect(agonesSDK.client.health).toHaveBeenCalled();
220
+ expect(error).toEqual('error');
221
+ }
222
+ });
223
+
224
+ it('does not call error callback if there was no stream error', async () => {
225
+ let stream = jasmine.createSpyObj('stream', ['write', 'on']);
226
+ stream.write.and.callFake((chunk, encoding, callback) => {
227
+ callback();
228
+ });
229
+ spyOn(agonesSDK.client, 'health').and.callFake(() => {
230
+ return stream;
231
+ });
232
+ agonesSDK.health(() => {
233
+ fail();
234
+ });
235
+ });
236
+
190
237
  it('calls the server and handles stream completing', async () => {
191
- let stream = jasmine.createSpyObj('stream', ['write']);
238
+ let stream = jasmine.createSpyObj('stream', ['write', 'on']);
192
239
  spyOn(agonesSDK.client, 'health').and.callFake((callback) => {
193
240
  let result = new messages.Empty();
194
241
  callback(undefined, result);
@@ -249,35 +296,27 @@ describe('AgonesSDK', () => {
249
296
  serverStream.emit('data', gameServer);
250
297
 
251
298
  expect(callback).toHaveBeenCalled();
252
- let result = callback.calls.argsFor(0)[0];
253
- expect(result.status).toBeDefined();
254
- expect(result.status.state).toEqual('up');
299
+ let callbackArgs = callback.calls.argsFor(0)[0];
300
+ expect(callbackArgs.status).toBeDefined();
301
+ expect(callbackArgs.status.state).toEqual('up');
255
302
  });
256
- it('captures CANCELLED errors only', async() => {
303
+ it('calls the server and passes errors to the optional error callback', async () => {
257
304
  let serverStream = stream.Readable({read: () => undefined});
258
305
  spyOn(agonesSDK.client, 'watchGameServer').and.callFake(() => {
259
306
  return serverStream;
260
307
  });
261
308
 
262
309
  let callback = jasmine.createSpy('callback');
263
- agonesSDK.watchGameServer(callback);
264
-
265
- try {
266
- serverStream.emit('error', {
267
- code: grpc.status.CANCELLED
268
- });
269
- } catch (error) {
270
- fail();
271
- }
272
-
273
- try {
274
- serverStream.emit('error', {
275
- code: grpc.status.ABORTED
276
- });
277
- fail();
278
- } catch (error) {
279
- expect(error.code).toEqual(grpc.status.ABORTED);
280
- }
310
+ let errorCallback = jasmine.createSpy('errorCallback');
311
+ agonesSDK.watchGameServer(callback, errorCallback);
312
+
313
+ let error = {
314
+ code: grpc.status.CANCELLED
315
+ };
316
+ serverStream.emit('error', error);
317
+ expect(errorCallback).toHaveBeenCalled();
318
+ let errorCallbackArgs = errorCallback.calls.argsFor(0)[0];
319
+ expect(errorCallbackArgs).toEqual(error);
281
320
  });
282
321
  });
283
322
 
@@ -366,7 +405,7 @@ describe('AgonesSDK', () => {
366
405
  expect(agonesSDK.client.close).toHaveBeenCalled();
367
406
  });
368
407
  it('ends the health stream if set', async () => {
369
- let stream = jasmine.createSpyObj('stream', ['end', 'write']);
408
+ let stream = jasmine.createSpyObj('stream', ['end', 'write', 'on']);
370
409
  spyOn(agonesSDK.client, 'health').and.callFake(() => {
371
410
  return stream;
372
411
  });
package/src/agonesSDK.js CHANGED
@@ -93,14 +93,25 @@ class AgonesSDK {
93
93
  });
94
94
  }
95
95
 
96
- health() {
96
+ health(errorCallback) {
97
97
  if (this.healthStream === undefined) {
98
98
  this.healthStream = this.client.health(() => {
99
99
  // Ignore error as this can't be caught
100
100
  });
101
+ this.healthStream.on('error', () => {
102
+ // ignore error, prevent from being uncaught
103
+ });
101
104
  }
102
105
  const request = new messages.Empty();
103
- this.healthStream.write(request);
106
+ this.healthStream.write(request, null, (error) => {
107
+ if (error) {
108
+ if (errorCallback) {
109
+ errorCallback(error);
110
+ return;
111
+ }
112
+ throw error;
113
+ }
114
+ });
104
115
  }
105
116
 
106
117
  async getGameServer() {
@@ -116,19 +127,17 @@ class AgonesSDK {
116
127
  });
117
128
  }
118
129
 
119
- watchGameServer(callback) {
130
+ watchGameServer(callback, errorCallback) {
120
131
  const request = new messages.Empty();
121
132
  const stream = this.client.watchGameServer(request);
122
133
  stream.on('data', (data) => {
123
134
  callback(data.toObject());
124
135
  });
125
- stream.on('error', (error) => {
126
- if (error.code === grpc.status.CANCELLED) {
127
- // Capture error when call is cancelled
128
- return;
129
- }
130
- throw error;
131
- });
136
+ if (errorCallback) {
137
+ stream.on('error', (error) => {
138
+ errorCallback(error);
139
+ });
140
+ }
132
141
  this.streams.push(stream);
133
142
  }
134
143