From 778b8d492ada7dc36604476eedd082739c9e803f Mon Sep 17 00:00:00 2001 From: Heinous Tugboat Date: Fri, 30 Sep 2022 20:10:49 -0400 Subject: [PATCH] Converts JS files to TS Closes bitburner-official/bitburner-filesync#12 --- src/{config.js => config.ts} | 0 src/{eventTypes.js => eventTypes.ts} | 0 src/{fileWatch.js => fileWatch.ts} | 12 +++++----- src/{index.js => index.ts} | 22 +++++++++---------- src/interfaces.ts | 16 ++++++++++++++ ...sageGenerators.js => messageGenerators.ts} | 21 +++++++++--------- .../{messageHandler.js => messageHandler.ts} | 20 +++++++++-------- .../{messageTracker.js => messageTracker.ts} | 14 +++++++----- src/networking/{webSocket.js => webSocket.ts} | 16 ++++++++------ src/signals.d.ts | 10 +++++++++ 10 files changed, 83 insertions(+), 48 deletions(-) rename src/{config.js => config.ts} (100%) rename src/{eventTypes.js => eventTypes.ts} (100%) rename src/{fileWatch.js => fileWatch.ts} (79%) rename src/{index.js => index.ts} (75%) create mode 100644 src/interfaces.ts rename src/networking/{messageGenerators.js => messageGenerators.ts} (61%) rename src/networking/{messageHandler.js => messageHandler.ts} (64%) rename src/networking/{messageTracker.js => messageTracker.ts} (55%) rename src/networking/{webSocket.js => webSocket.ts} (52%) create mode 100644 src/signals.d.ts diff --git a/src/config.js b/src/config.ts similarity index 100% rename from src/config.js rename to src/config.ts diff --git a/src/eventTypes.js b/src/eventTypes.ts similarity index 100% rename from src/eventTypes.js rename to src/eventTypes.ts diff --git a/src/fileWatch.js b/src/fileWatch.ts similarity index 79% rename from src/fileWatch.js rename to src/fileWatch.ts index 8d38414..dc05eb3 100644 --- a/src/fileWatch.js +++ b/src/fileWatch.ts @@ -1,9 +1,11 @@ import CheapWatch from "cheap-watch"; -import { config } from "./config.js"; -import { EventType } from "./eventTypes.js"; +import { config } from "./config"; +import { EventType } from "./eventTypes"; import { resolve } from "path"; +import type { Signal } from 'signal-js'; +import type { File } from './interfaces'; -function fileFilter(file) { +function fileFilter(file: File) { if (config.get("allowedFiletypes").some(extension => file.path.endsWith(extension))) return true; if (file.stats.isDirectory()) @@ -11,7 +13,7 @@ function fileFilter(file) { return false; } -export async function setupWatch(signaller) { +export async function setupWatch(signaller: Signal) { const watch = new CheapWatch({ dir: config.get("scriptsFolder"), filter: fileFilter, @@ -32,4 +34,4 @@ export async function setupWatch(signaller) { } return watch; -} \ No newline at end of file +} diff --git a/src/index.js b/src/index.ts similarity index 75% rename from src/index.js rename to src/index.ts index 6308f22..8813f89 100644 --- a/src/index.js +++ b/src/index.ts @@ -1,11 +1,11 @@ -"use strict" -import { setupWatch } from "./fileWatch.js"; -import { config, loadConfig } from "./config.js"; -import { setupSocket } from "./networking/webSocket.js"; +import { setupWatch } from "./fileWatch"; +import { config, loadConfig } from "./config"; +import { setupSocket } from "./networking/webSocket"; import signal from "signal-js"; -import { fileChangeEventToMsg, fileRemovalEventToMsg, requestFilenames, requestDefinitionFile } from "./networking/messageGenerators.js"; -import { EventType } from "./eventTypes.js"; -import { messageHandler } from "./networking/messageHandler.js"; +import { fileChangeEventToMsg, fileRemovalEventToMsg, requestFilenames, requestDefinitionFile } from "./networking/messageGenerators"; +import { EventType } from "./eventTypes"; +import { messageHandler } from "./networking/messageHandler"; +import { FileEvent, Message } from './interfaces'; export async function start() { loadConfig(); @@ -13,7 +13,7 @@ export async function start() { const socket = setupSocket(signal); // Add a handler for received messages. - signal.on(EventType.MessageReceived, msg => messageHandler(signal, msg, watch.paths)); + signal.on(EventType.MessageReceived, (msg: Message) => messageHandler(signal, msg, watch.paths)); // Add a handler for when a connection to a game is made. signal.on(EventType.ConnectionMade, () => { @@ -27,7 +27,7 @@ export async function start() { const extensions = config.get("allowedFiletypes"); for (const path of watch.paths.keys()) { if (extensions.some(extension => path.endsWith(extension))) - signal.emit(EventType.MessageSend, fileChangeEventToMsg({ path: path })) + signal.emit(EventType.MessageSend, fileChangeEventToMsg({ path })) } } else { // Upload missing files to the game. @@ -36,14 +36,14 @@ export async function start() { }) // Add a handler for changed files. - signal.on(EventType.FileChanged, fileEvent => { + signal.on(EventType.FileChanged, (fileEvent: FileEvent) => { if (!config.get("quiet")) console.log(fileEvent.path + " changed"); signal.emit(EventType.MessageSend, fileChangeEventToMsg(fileEvent)) }); // Add a handler for removed files, if allowed. if (config.get("allowDeletingFiles")) - signal.on(EventType.FileDeleted, fileEvent => + signal.on(EventType.FileDeleted, (fileEvent: FileEvent) => signal.emit(EventType.MessageSend, fileRemovalEventToMsg(fileEvent))); console.log(`Server is ready, running on ${config.get("port")}!`) diff --git a/src/interfaces.ts b/src/interfaces.ts new file mode 100644 index 0000000..0ba9544 --- /dev/null +++ b/src/interfaces.ts @@ -0,0 +1,16 @@ +import type { Stats } from 'fs'; + +export interface Message { + id: string; + method?: string; + jsonrpc: string; + params?: object; +} + +export interface FileEvent { + path: string; +} + +export interface File extends FileEvent { + stats: Stats +} diff --git a/src/networking/messageGenerators.js b/src/networking/messageGenerators.ts similarity index 61% rename from src/networking/messageGenerators.js rename to src/networking/messageGenerators.ts index f7c311c..59579fd 100644 --- a/src/networking/messageGenerators.js +++ b/src/networking/messageGenerators.ts @@ -1,10 +1,11 @@ import { readFileSync } from "fs"; -import { config } from "../config.js"; +import { config } from "../config"; import { join } from "path"; +import type { FileEvent, Message } from '../interfaces'; let messageCounter = 0; -export function fileChangeEventToMsg({ path }) { +export function fileChangeEventToMsg({ path }: FileEvent): Message { return { "jsonrpc": "2.0", "method": "pushFile", @@ -13,11 +14,11 @@ export function fileChangeEventToMsg({ path }) { "filename": addLeadingSlash(path), "content": readFileSync(join(config.get("scriptsFolder"), path)).toString() }, - "id": messageCounter++ + "id": (messageCounter++).toString() } } -export function fileRemovalEventToMsg({ path }) { +export function fileRemovalEventToMsg({ path }: FileEvent): Message { return { "jsonrpc": "2.0", "method": "deleteFile", @@ -25,30 +26,30 @@ export function fileRemovalEventToMsg({ path }) { "server": "home", "filename": addLeadingSlash(path), }, - "id": messageCounter++ + "id": (messageCounter++).toString() } } -export function requestDefinitionFile() { +export function requestDefinitionFile(): Message { return { "jsonrpc": "2.0", "method": "getDefinitionFile", - "id": messageCounter++ + "id": (messageCounter++).toString() } } -export function requestFilenames() { +export function requestFilenames(): Message { return { "jsonrpc": "2.0", "method": "getFileNames", "params": { "server": "home", }, - "id": messageCounter++ + "id": (messageCounter++).toString() } } -function addLeadingSlash(path){ +function addLeadingSlash(path: string): string { const slashes = path.match('/'); if (slashes) return `/${path}` diff --git a/src/networking/messageHandler.js b/src/networking/messageHandler.ts similarity index 64% rename from src/networking/messageHandler.js rename to src/networking/messageHandler.ts index c07d8a8..1eb534c 100644 --- a/src/networking/messageHandler.js +++ b/src/networking/messageHandler.ts @@ -1,10 +1,12 @@ -import { messageTracker } from "./messageTracker.js"; -import { writeFile } from "fs"; -import { config } from "../config.js"; -import { EventType } from "../eventTypes.js"; -import { fileChangeEventToMsg } from "./messageGenerators.js"; +import { messageTracker } from "./messageTracker"; +import { Stats, writeFile } from "fs"; +import { config } from "../config"; +import { EventType } from "../eventTypes"; +import { fileChangeEventToMsg } from "./messageGenerators"; +import type { Signal } from 'signal-js'; +import { Message } from '../interfaces'; -export function messageHandler(signaller, msg, paths) { +export function messageHandler(signaller: Signal, msg: Message, paths: Map) { let incoming; try { incoming = JSON.parse(msg.toString()); } @@ -25,7 +27,7 @@ export function messageHandler(signaller, msg, paths) { if (request?.method && request.method == "getFileNames" && incoming.result) { - const gameFiles = incoming.result.map(file => removeLeadingSlash(file)); + const gameFiles = incoming.result.map((file: string) => removeLeadingSlash(file)); paths.forEach((stats, fileName) => { if (!stats.isDirectory() && !gameFiles.includes(fileName)) @@ -35,7 +37,7 @@ export function messageHandler(signaller, msg, paths) { } } -function removeLeadingSlash(path) { +function removeLeadingSlash(path: string) { const reg = /^\//; return path.replace(reg, "") -} \ No newline at end of file +} diff --git a/src/networking/messageTracker.js b/src/networking/messageTracker.ts similarity index 55% rename from src/networking/messageTracker.js rename to src/networking/messageTracker.ts index 37a8469..104de9d 100644 --- a/src/networking/messageTracker.js +++ b/src/networking/messageTracker.ts @@ -1,8 +1,10 @@ -class MessageTracker { - data = new Map() - #maxLength = 200 +import type { Message } from '../interfaces'; - push(msg) { +class MessageTracker { + data = new Map(); + #maxLength = 200; + + push(msg: Message) { this.data.set(msg.id, msg); if (this.data.size > this.#maxLength) { @@ -11,9 +13,9 @@ class MessageTracker { } } - get(index) { + get(index: string) { return this.data.get(index); } } -export const messageTracker = new MessageTracker(); \ No newline at end of file +export const messageTracker = new MessageTracker(); diff --git a/src/networking/webSocket.js b/src/networking/webSocket.ts similarity index 52% rename from src/networking/webSocket.js rename to src/networking/webSocket.ts index b40b2b6..20c10b5 100644 --- a/src/networking/webSocket.js +++ b/src/networking/webSocket.ts @@ -1,16 +1,18 @@ +import type { Signal } from 'signal-js'; import { WebSocketServer } from 'ws'; -import { config } from "../config.js"; -import { EventType } from "../eventTypes.js" -import { requestDefinitionFile } from './messageGenerators.js'; -import { messageTracker } from "./messageTracker.js" +import { config } from "../config"; +import { EventType } from "../eventTypes" +import { Message } from '../interfaces'; +import { requestDefinitionFile } from './messageGenerators'; +import { messageTracker } from "./messageTracker" -export function setupSocket(signaller) { +export function setupSocket(signaller: Signal) { const wss = new WebSocketServer({ port: config.get("port") }); wss.on('connection', function connection(ws) { - function sendMessage(msg) { + function sendMessage(msg: Message) { messageTracker.push(msg); ws.send(JSON.stringify(msg)); } @@ -19,7 +21,7 @@ export function setupSocket(signaller) { signaller.emit(EventType.MessageReceived, msg); }); - signaller.on(EventType.MessageSend, msg => { + signaller.on(EventType.MessageSend, (msg: Message) => { sendMessage(msg); }); diff --git a/src/signals.d.ts b/src/signals.d.ts new file mode 100644 index 0000000..da168e6 --- /dev/null +++ b/src/signals.d.ts @@ -0,0 +1,10 @@ +declare module 'signal-js' { + + export type Signal = typeof signal; + export default class signal { + static on(event: string, callback: (data: T) => void): void + static emit(event: string, data: T): void + static trigger(event: string): void + } +} +