diff --git a/src/xhrListener.ts b/src/xhrListener.ts index 0210060..a327875 100644 --- a/src/xhrListener.ts +++ b/src/xhrListener.ts @@ -26,26 +26,26 @@ class XhrListener { logger.debugLog.info("XhrListener running"); } - public relayEvent(event: string, channel: string):boolean { + public relayEvent(event: string, channel: string): boolean { logger.debugLog.info(`XhrListener:relayEvent(event: ${event}, channel: ${channel})`); for (let c of this.#cm.channels) { if (channel === c.id) { - let dmCount:number = 0; - for (let client of c.clients) { - let nonce:string = crypto.randomBytes(4).toString("hex"); - // TODO: verify the nonce against the received reply, which we currently ignore - client.directMessage(JSON.stringify({message_type:"broadcast", message:{event_type:event, seq_id:nonce}})); - dmCount++; - } - // dmCount of 1 would be normal. more than 1 is odd, but not necessarily bad. 0 means Exam UI has gone away somehow. - return dmCount > 0; + let dmCount: number = 0; + for (let client of c.clients) { + let nonce: string = crypto.randomBytes(4).toString("hex"); + // TODO: verify the nonce against the received reply, which we currently ignore + client.directMessage(JSON.stringify({ message_type: "broadcast", message: { event_type: event, seq_id: nonce } })); + dmCount++; + } + // dmCount of 1 would be normal. more than 1 is odd, but not necessarily bad. 0 means Exam UI has gone away somehow. + return dmCount > 0; } } // did not match a channel; examId isn't valid for some reason return false; } - public onRequestEnded(body: Uint8Array[], request: IncomingMessage, response: ServerResponse):void { + public onRequestEnded(body: Uint8Array[], request: IncomingMessage, response: ServerResponse): void { logger.debugLog.info("XhrListener:onRequestEnded()"); if (request.method === 'OPTIONS') { logger.debugLog.info("handling CORS preflight"); @@ -59,56 +59,56 @@ class XhrListener { logger.debugLog.info("parsing Archimedes event: " + body); let endpoint = url.parse(request.url).pathname let returnVal: [number, string] = [-1, ""]; - let authorized:boolean = request.headers['x-proctoru-signature'] === AUTH_TOKEN; + let authorized: boolean = request.headers['x-proctoru-signature'] === AUTH_TOKEN; // body of POST is JSON: '{"examId":"proctor_u_id"}' switch (true) { - // match /event/pause* + // match /event/pause* case /^\/event\/pause([/]+.*)*$/.test(endpoint): - if (authorized) { - let amsg:ArchimedesMessage = JSON.parse(Buffer.concat(body).toString()); - if (this.relayEvent("pauseExam", amsg.examId)) { - returnVal = [200, "pause event was successfully relayed"]; + if (authorized) { + let amsg: ArchimedesMessage = JSON.parse(Buffer.concat(body).toString()); + if (this.relayEvent("pauseExam", amsg.examId)) { + returnVal = [200, "pause event was successfully relayed"]; } else { - logger.errorLog.info(`XhrListener: could not relay pause event "${amsg}" to Exam UI; body: "${body}"`); - returnVal = [400, "error while relaying pause event"]; - } + logger.errorLog.info(`XhrListener: could not relay pause event "${amsg}" to Exam UI; body: "${body}"`); + returnVal = [400, "error while relaying pause event"]; + } } - break; + break; - // match /event/resume* + // match /event/resume* case /^\/event\/resume([/]+.*)*$/.test(endpoint): - if (authorized) { - let amsg:ArchimedesMessage = JSON.parse(Buffer.concat(body).toString()); - if (this.relayEvent("resumeExam", amsg.examId)) { - returnVal = [200, "resume event was successfully relayed"]; + if (authorized) { + let amsg: ArchimedesMessage = JSON.parse(Buffer.concat(body).toString()); + if (this.relayEvent("resumeExam", amsg.examId)) { + returnVal = [200, "resume event was successfully relayed"]; } else { - logger.errorLog.info(`XhrListener: could not relay resume event "${amsg}" to Exam UI; body: "${body}"`); - returnVal = [400, "error while relaying resume event"]; - } + logger.errorLog.info(`XhrListener: could not relay resume event "${amsg}" to Exam UI; body: "${body}"`); + returnVal = [400, "error while relaying resume event"]; + } } - break; + break; - default: - logger.errorLog.info(`XhrListener: bad event or other request; body: "${body}"`); - returnVal = [400, "Bad request"]; - break; + default: + logger.errorLog.info(`XhrListener: bad event or other request; body: "${body}"`); + returnVal = [400, "Bad request"]; + break; }; if (-1 == returnVal[0]) { - response.writeHead(authorized ? 400 : 401); - response.end(); + response.writeHead(authorized ? 400 : 401); + response.end(); } else { - response.writeHead(returnVal[0], {'Content-Type': 'application/json'}); + response.writeHead(returnVal[0], { 'Content-Type': 'application/json' }); response.end(JSON.stringify(returnVal[1])); } } } - private onRequest(request: IncomingMessage, response: ServerResponse):void { + private onRequest(request: IncomingMessage, response: ServerResponse): void { logger.debugLog.info("XhrListener:onRequest()"); - let body:Uint8Array[] = []; + let body: Uint8Array[] = []; request.on('data', post_block => body.push(post_block)); request.on('end', () => {