wa-chat-server
Version:
Watson Assistant powered chat server
88 lines (87 loc) • 3.78 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SessionStorageProcessMemory = void 0;
const SessionDoesNotExistError_1 = require("../../exception/SessionDoesNotExistError");
const SessionExpiredError_1 = require("../../exception/SessionExpiredError");
const uuid_1 = require("uuid");
class SessionStorageProcessMemory {
constructor(config) {
this.config = config;
}
init() {
return __awaiter(this, void 0, void 0, function* () {
this.lastCleanupTimeMS = 0;
this.sessions = new Map();
this.sessionTimeouts = new Map();
return this;
});
}
create() {
return __awaiter(this, arguments, void 0, function* (forcedSessionId = undefined) {
let sessionId;
yield this.cleanup();
if (this.config.allowForeignSessionIds && forcedSessionId) {
sessionId = forcedSessionId;
}
else {
do {
sessionId = (0, uuid_1.v4)();
} while (this.sessions.has(sessionId));
}
this.sessions.set(sessionId, {});
this.sessionTimeouts.set(sessionId, new Date().getTime() + this.config.lifeTimeMS);
return sessionId;
});
}
read(sessionId) {
return __awaiter(this, void 0, void 0, function* () {
const timeMS = new Date().getTime();
if (this.sessions.has(sessionId)) {
if (timeMS <= this.sessionTimeouts.get(sessionId)) {
return this.sessions.get(sessionId);
}
else {
throw new SessionExpiredError_1.SessionExpiredError(`Session ${sessionId} expired`);
}
}
else {
throw new SessionDoesNotExistError_1.SessionDoesNotExistError(`Session ${sessionId} not found`);
}
});
}
write(sessionId, data) {
return __awaiter(this, void 0, void 0, function* () {
yield this.cleanup();
const timeMS = new Date().getTime();
this.sessions.set(sessionId, data);
this.sessionTimeouts.set(sessionId, timeMS + this.config.lifeTimeMS);
});
}
cleanup() {
return __awaiter(this, void 0, void 0, function* () {
const timeMS = new Date().getTime();
if (this.sessions.size > 0 &&
this.config.lifeTimeMS !== 0 &&
timeMS > this.lastCleanupTimeMS + this.config.lifeTimeMS) {
this.lastCleanupTimeMS = timeMS;
const maxTimeoutMS = timeMS - this.config.lifeTimeMS;
for (const [sessionId, timeoutMS] of this.sessionTimeouts.entries()) {
if (timeoutMS <= maxTimeoutMS) {
this.sessions.delete(sessionId);
this.sessionTimeouts.delete(sessionId);
}
}
}
});
}
}
exports.SessionStorageProcessMemory = SessionStorageProcessMemory;