UNPKG

@pureweb/platform-streaming-agent

Version:

The PureWeb platform streaming agent enables your game to communicate and stream through the PureWeb Platform

201 lines (200 loc) 7.91 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.StorageServer = void 0; const grpc_js_1 = require("@grpc/grpc-js"); const platform_sdk_1 = require("@pureweb/platform-sdk"); const sidecar_pb_1 = require("./proto/sidecar_pb"); const Log_1 = __importDefault(require("../../Log")); class StorageServer { constructor(agent) { this.agent = agent; } store(call, callback) { const keyValue = call.request; try { if (keyValue.hasKey()) { const key = keyValue.getKey(); this.agent .writeToStorage(key.getName(), keyValue.getValue(), this.getAgent(key)) .then(( /*value*/) => { callback(null, new sidecar_pb_1.StoreKeyResponse()); }) .catch((reason) => { this.errorMsg = 'Failed to store a value: ' + reason; Log_1.default.error(this.errorMsg); callback({ code: grpc_js_1.status.ABORTED, details: this.errorMsg, metadata: call.metadata }, null); }); } else { this.errorMsg = 'A key is required to store a value'; Log_1.default.error(this.errorMsg); callback({ code: grpc_js_1.status.ABORTED, details: this.errorMsg, metadata: call.metadata }, null); } } catch (e) { Log_1.default.error('Failed writing to storage with key: ' + keyValue.getKey() + ' value: ' + keyValue.getValue()); Log_1.default.error(e.message); callback({ code: grpc_js_1.status.ABORTED, details: e.message, metadata: call.metadata }, null); } } retrieve(call, callback) { const key = call.request; try { this.agent .getFromStorage(key.getName(), this.getAgent(key)) .then((value) => { const keyValue = new sidecar_pb_1.KeyValue(); keyValue.setKey(key); keyValue.setValue(value); callback(null, keyValue); }) .catch((reason) => { this.errorMsg = 'Failed to retrieve value: ' + reason; Log_1.default.error(this.errorMsg); callback({ code: grpc_js_1.status.NOT_FOUND, details: this.errorMsg, metadata: call.metadata }, null); }); } catch (e) { Log_1.default.error('Failed to retrieved from storage key: ' + key.getName()); Log_1.default.error(e.message); callback({ code: grpc_js_1.status.ABORTED, details: e.message, metadata: call.metadata }, null); } } remove(call, callback) { const key = call.request; try { this.agent .removeFromStorage(key.getName(), this.getAgent(key)) .then(( /*value*/) => { callback(null, new sidecar_pb_1.RemoveKeyResponse()); }) .catch((reason) => { this.errorMsg = 'Failed to remove value: ' + reason; Log_1.default.error(this.errorMsg); callback({ code: grpc_js_1.status.NOT_FOUND, details: this.errorMsg, metadata: call.metadata }, null); }); } catch (e) { Log_1.default.error('Failed to remove from storage key: ' + key.getName()); Log_1.default.error(e.message); callback({ code: grpc_js_1.status.ABORTED, details: e.message, metadata: call.metadata }, null); } } retrieveAllKeys(call, callback) { const request = call.request; const remoteAgent = request.hasAgent() ? new platform_sdk_1.RemoteAgent(request.getAgent().getId()) : undefined; try { this.agent .getKeysFromStorage(remoteAgent) .then((value) => { const keyList = new sidecar_pb_1.KeyList(); value.forEach((item) => { const key = new sidecar_pb_1.Key(); key.setName(item.key); if (item.agentId) { const agent = new sidecar_pb_1.Agent(); agent.setId(item.agentId); key.setAgent(agent); } keyList.addKeys(key); }); callback(null, keyList); }) .catch((reason) => { this.errorMsg = 'Failed to retrieve keys: ' + reason; Log_1.default.error(this.errorMsg); callback({ code: grpc_js_1.status.ABORTED, details: this.errorMsg, metadata: call.metadata }, null); }); } catch (e) { Log_1.default.error('Failed to retrieve keys from storage'); Log_1.default.error(e.message); callback({ code: grpc_js_1.status.ABORTED, details: e.message, metadata: call.metadata }, null); } } subscribe(call) { const subscription = call.request; const key = subscription.getKey(); const type = subscription.getType(); try { this.agent.subscribeToStorage(key.getName(), this.getAgent(key), (data) => { const response = new sidecar_pb_1.StorageEvent(); const keyValue = new sidecar_pb_1.KeyValue(); const key = new sidecar_pb_1.Key(); key.setName(data.key); if (data.agentId) { const agent = new sidecar_pb_1.Agent(); agent.setId(data.agentId); key.setAgent(agent); } keyValue.setKey(key); keyValue.setValue(data.value); response.setKeyvalue(keyValue); if (data.type === platform_sdk_1.StorageTypes.REMOVE && type !== sidecar_pb_1.StorageEvent.StorageType.WRITE) { response.setType(sidecar_pb_1.StorageEvent.StorageType.REMOVE); call.write(response, (error) => { if (error) { Log_1.default.error('Failed to write storage event'); } }); } else if (data.type === platform_sdk_1.StorageTypes.WRITE && type !== sidecar_pb_1.StorageEvent.StorageType.REMOVE) { response.setType(sidecar_pb_1.StorageEvent.StorageType.WRITE); call.write(response, (error) => { if (error) { Log_1.default.error('Failed to write storage event'); } }); } }); } catch (e) { Log_1.default.error('Failed subscribe to storage with key: ' + key.getName()); Log_1.default.error(e.message); throw e; } } getAgent(key) { return key.hasAgent() ? new platform_sdk_1.RemoteAgent(key.getAgent().getId()) : undefined; } } exports.StorageServer = StorageServer;