@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
JavaScript
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;
;