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;