agones.dev/agones@v1.54.0/sdks/nodejs/src/agonesSDK.js (about)

     1  // Copyright 2019 Google LLC All Rights Reserved.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  const grpc = require('@grpc/grpc-js');
    16  
    17  const Alpha = require('./alpha');
    18  const Beta = require('./beta');
    19  
    20  const messages = require('../lib/sdk_pb');
    21  const servicesPackageDefinition = require('../lib/sdk_grpc_pb');
    22  
    23  class AgonesSDK {
    24  	constructor() {
    25  		const services = grpc.loadPackageDefinition(servicesPackageDefinition);
    26  		const address = `localhost:${this.port}`;
    27  		const credentials = grpc.credentials.createInsecure();
    28  		this.client = new services.agones.dev.sdk.SDK(address, credentials);
    29  		this.healthStream = undefined;
    30  		this.streams = [];
    31  		this.alpha = new Alpha(address, credentials);
    32  		this.beta = new Beta(address, credentials);
    33  	}
    34  
    35  	get port() {
    36  		return process.env.AGONES_SDK_GRPC_PORT || '9357';
    37  	}
    38  
    39  	async connect() {
    40  		return new Promise((resolve, reject) => {
    41  			this.client.waitForReady(Date.now() + 30000, (error) => {
    42  				if (error) {
    43  					reject(error);
    44  				} else {
    45  					resolve();
    46  				}
    47  			});
    48  		});
    49  	}
    50  
    51  	close() {
    52  		if (this.healthStream !== undefined) {
    53  			this.healthStream.end();
    54  		}
    55  		this.streams.forEach(stream => stream.destroy());
    56  		this.client.close();
    57  	}
    58  
    59  	async ready() {
    60  		const request = new messages.Empty();
    61  		return new Promise((resolve, reject) => {
    62  			this.client.ready(request, (error, response) => {
    63  				if (error) {
    64  					reject(error);
    65  				} else {
    66  					resolve(response.toObject());
    67  				}
    68  			});
    69  		});
    70  	}
    71  	
    72  	async allocate() {
    73  		const request = new messages.Empty();
    74  		return new Promise((resolve, reject) => {
    75  			this.client.allocate(request, (error, response) => {
    76  				if (error) {
    77  					reject(error);
    78  				} else {
    79  					resolve(response.toObject());
    80  				}
    81  			});
    82  		});
    83  	}
    84  
    85  	async shutdown() {
    86  		const request = new messages.Empty();
    87  		return new Promise((resolve, reject) => {
    88  			this.client.shutdown(request, (error, response) => {
    89  				if (error) {
    90  					reject(error);
    91  				} else {
    92  					resolve(response.toObject());
    93  				}
    94  			});
    95  		});
    96  	}
    97  
    98  	health(errorCallback) {
    99  		if (this.healthStream === undefined) {
   100  			this.healthStream = this.client.health(() => {
   101  				// Ignore error as this can't be caught
   102  			});
   103  			this.healthStream.on('error', () => {
   104  				// ignore error, prevent from being uncaught
   105  			});
   106  		}
   107  		const request = new messages.Empty();
   108  		this.healthStream.write(request, null, (error) => {
   109  			if (error) {
   110  				if (errorCallback) {
   111  					errorCallback(error);
   112  					return;
   113  				}
   114  				throw error;
   115  			}
   116  		});
   117  	}
   118  
   119  	async getGameServer() {
   120  		const request = new messages.Empty();
   121  		return new Promise((resolve, reject) => {
   122  			this.client.getGameServer(request, (error, response) => {
   123  				if (error) {
   124  					reject(error);
   125  				} else {
   126  					resolve(response.toObject());
   127  				}
   128  			});
   129  		});
   130  	}
   131  
   132  	watchGameServer(callback, errorCallback) {
   133  		const request = new messages.Empty();
   134  		const stream = this.client.watchGameServer(request);
   135  		stream.on('data', (data) => {
   136  			callback(data.toObject());
   137  		});
   138  		if (errorCallback) {
   139  			stream.on('error', (error) => {
   140  				errorCallback(error);
   141  			});
   142  		}
   143  		this.streams.push(stream);
   144  	}
   145  
   146  	async setLabel(key, value) {
   147  		const request = new messages.KeyValue();
   148  		request.setKey(key);
   149  		request.setValue(value);
   150  		return new Promise((resolve, reject) => {
   151  			this.client.setLabel(request, (error, response) => {
   152  				if (error) {
   153  					reject(error);
   154  				} else {
   155  					resolve(response.toObject());
   156  				}
   157  			});
   158  		});
   159  	}
   160  
   161  	async setAnnotation(key, value) {
   162  		const request = new messages.KeyValue();
   163  		request.setKey(key);
   164  		request.setValue(value);
   165  		return new Promise((resolve, reject) => {
   166  			this.client.setAnnotation(request, (error, response) => {
   167  				if (error) {
   168  					reject(error);
   169  				} else {
   170  					resolve(response.toObject());
   171  				}
   172  			});
   173  		});
   174  	}
   175  
   176  	async reserve(duration) {
   177  		const request = new messages.Duration();
   178  		request.setSeconds(duration);
   179  		return new Promise((resolve, reject) => {
   180  			this.client.reserve(request, (error, response) => {
   181  				if (error) {
   182  					reject(error);
   183  				} else {
   184  					resolve(response.toObject());
   185  				}
   186  			});
   187  		});
   188  	}
   189  }
   190  
   191  module.exports = AgonesSDK;