Port some amount of code to typescript
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="main.js" type="NodeJSConfigurationType" nameIsGenerated="true" path-to-js-file="main.js" working-dir="$PROJECT_DIR$">
|
<configuration default="false" name="main.js" type="NodeJSConfigurationType" nameIsGenerated="true" path-to-js-file="$PROJECT_DIR$/main.js" working-dir="$PROJECT_DIR$">
|
||||||
<method v="2" />
|
<method v="2" />
|
||||||
</configuration>
|
</configuration>
|
||||||
</component>
|
</component>
|
30
WebsocketTest.ts
Normal file
30
WebsocketTest.ts
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
// @ts-ignore
|
||||||
|
const Websocket = require('ws');
|
||||||
|
|
||||||
|
const ws = new Websocket('ws://localhost:8191');
|
||||||
|
ws.on('open', function open() {
|
||||||
|
ws.send('something');
|
||||||
|
});
|
||||||
|
|
||||||
|
interface Animal {
|
||||||
|
doNoise(): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Dog implements Animal {
|
||||||
|
doNoise(): void {
|
||||||
|
console.log("woof");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Cat implements Animal {
|
||||||
|
doNoise(): void {
|
||||||
|
console.log("meow");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const dog = new Dog();
|
||||||
|
dog.doNoise();
|
||||||
|
const cat = new Cat();
|
||||||
|
cat.doNoise();
|
||||||
|
let animals: Animal[] = [dog, cat];
|
||||||
|
animals.forEach(animal => animal.doNoise());
|
@@ -10,6 +10,7 @@
|
|||||||
"author": "",
|
"author": "",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@types/node": "^18.15.10",
|
||||||
"body-parser": "^1.20.2",
|
"body-parser": "^1.20.2",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
"nanotimer": "^0.3.15",
|
"nanotimer": "^0.3.15",
|
||||||
|
118
src/client.ts
Normal file
118
src/client.ts
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
import {SmppSession} from "./smppSession";
|
||||||
|
import {Job} from "./job";
|
||||||
|
import Logger from "./logger";
|
||||||
|
import ClientStatus from "./clientStatus";
|
||||||
|
import EventEmitter from "events";
|
||||||
|
|
||||||
|
export class Client implements SmppSession {
|
||||||
|
set username(value: string) {
|
||||||
|
this._username = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
set password(value: string) {
|
||||||
|
this._password = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
set url(value: string) {
|
||||||
|
this._url = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
set status(value: ClientStatus) {
|
||||||
|
this._status = value;
|
||||||
|
this.eventEmitter.emit(Client.ClientEvents.STATUS_CHANGED, this._status);
|
||||||
|
this.eventEmitter.emit(Client.ClientEvents.STATE_CHANGED, this.serialize());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ClientEvents = {
|
||||||
|
STATUS_CHANGED: "STATUS_CHANGED",
|
||||||
|
STATE_CHANGED: "STATE_CHANGED",
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly eventEmitter: EventEmitter;
|
||||||
|
private readonly logger: object;
|
||||||
|
private readonly id: number;
|
||||||
|
private _username: string;
|
||||||
|
private _password: string;
|
||||||
|
private _url: string;
|
||||||
|
private session?: object;
|
||||||
|
private _status: ClientStatus = ClientStatus.NOT_CONNECTED;
|
||||||
|
|
||||||
|
defaultSingleJob?: Job;
|
||||||
|
defaultMultipleJob?: Job;
|
||||||
|
|
||||||
|
private promises: any = {
|
||||||
|
connect: null,
|
||||||
|
close: null,
|
||||||
|
bind: null
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(id: number, url: string, username: string, password: string) {
|
||||||
|
this.id = id;
|
||||||
|
this._url = url;
|
||||||
|
this._username = username;
|
||||||
|
this._password = password;
|
||||||
|
|
||||||
|
this.eventEmitter = new EventEmitter();
|
||||||
|
this.logger = new Logger(`Client-${id}`);
|
||||||
|
this.setStatus(ClientStatus.NOT_CONNECTED)
|
||||||
|
|
||||||
|
this.initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
setStatus(status: ClientStatus): void {
|
||||||
|
this._status = status;
|
||||||
|
this.eventEmitter.emit("status", status);
|
||||||
|
}
|
||||||
|
|
||||||
|
initialize(): void {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(): Promise<void> {
|
||||||
|
this.promises.connect = new Promise((resolve, reject) => {
|
||||||
|
if (this._status !== ClientStatus.NOT_CONNECTED) {
|
||||||
|
this.logger.log1("Client already connected");
|
||||||
|
reject("Client already connected");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.logger.log1(`Client connecting to ${this._url}`);
|
||||||
|
this.setStatus(ClientStatus.CONNECTING);
|
||||||
|
try {
|
||||||
|
this.session = smpp.connect({
|
||||||
|
url: this._url,
|
||||||
|
auto_enquire_link_period: this.auto_enquire_link_period,
|
||||||
|
}, this.connected.bind(this));
|
||||||
|
this.session.on('error', this.error.bind(this));
|
||||||
|
this.session.on('close', this.closed.bind(this));
|
||||||
|
} catch (e) {
|
||||||
|
this.logger.log1("Client connection failed to " + this._url);
|
||||||
|
this.setStatus(ClientStatus.NOT_CONNECTED);
|
||||||
|
this.session.close();
|
||||||
|
reject("Client connection failed to " + this._url);
|
||||||
|
}
|
||||||
|
this.connectingPromise.resolve = resolve;
|
||||||
|
this.connectingPromise.reject = reject;
|
||||||
|
});
|
||||||
|
return this.connectingPromise.promise;
|
||||||
|
}
|
||||||
|
|
||||||
|
serialize(): string {
|
||||||
|
throw new Error("Method not implemented.");
|
||||||
|
}
|
||||||
|
|
||||||
|
close(): Promise<void> {
|
||||||
|
throw new Error("Method not implemented.");
|
||||||
|
}
|
||||||
|
|
||||||
|
sendMultiple(Job: object): Promise<object> {
|
||||||
|
throw new Error("Method not implemented.");
|
||||||
|
}
|
||||||
|
|
||||||
|
sendPdu(pdu: object): Promise<object> {
|
||||||
|
throw new Error("Method not implemented.");
|
||||||
|
}
|
||||||
|
|
||||||
|
sendSingle(Job: object): Promise<object> {
|
||||||
|
throw new Error("Method not implemented.");
|
||||||
|
}
|
||||||
|
}
|
8
src/clientStatus.ts
Normal file
8
src/clientStatus.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
export default class ClientStatus {
|
||||||
|
static readonly CONNECTING: string = "CONNECTING";
|
||||||
|
static readonly CONNECTED: string = "CONNECTED";
|
||||||
|
static readonly BUSY: string = "BUSY";
|
||||||
|
static readonly BINDING: string = "BINDING";
|
||||||
|
static readonly BOUND: string = "BOUND";
|
||||||
|
static readonly NOT_CONNECTED: string = "NOT CONNECTED";
|
||||||
|
}
|
9
src/job.ts
Normal file
9
src/job.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
export class Job {
|
||||||
|
pdu: object;
|
||||||
|
perSecond?: number;
|
||||||
|
count?: number;
|
||||||
|
|
||||||
|
serialize(): string {
|
||||||
|
return JSON.stringify(this);
|
||||||
|
}
|
||||||
|
}
|
72
src/logger.ts
Normal file
72
src/logger.ts
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
// @ts-ignore
|
||||||
|
import {WriteStream} from "fs";
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
const LOG_LEVEL: number = process.env.LOG_LEVEL || 6;
|
||||||
|
// @ts-ignore
|
||||||
|
const LOG_FILE: string = process.env.LOG_FILE || "";
|
||||||
|
|
||||||
|
export default class Logger {
|
||||||
|
private clazz: string;
|
||||||
|
private readonly logLevel: number;
|
||||||
|
private readonly logFile: string;
|
||||||
|
private readonly logFileWriteStream: WriteStream | null = null;
|
||||||
|
|
||||||
|
constructor(clazz: string) {
|
||||||
|
this.clazz = clazz;
|
||||||
|
this.logLevel = LOG_LEVEL;
|
||||||
|
this.logFile = LOG_FILE;
|
||||||
|
|
||||||
|
if (!!this.logFile) {
|
||||||
|
this.logFileWriteStream = fs.createWriteStream(this.logFile, {flags: 'a'});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
leftPad(str: string, len: number, char: string): string {
|
||||||
|
str = String(str);
|
||||||
|
let i: number = -1;
|
||||||
|
len = len - str.length;
|
||||||
|
if (char === undefined) {
|
||||||
|
char = " ";
|
||||||
|
}
|
||||||
|
while (++i < len) {
|
||||||
|
str = char + str;
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
log(logLevel: number, data: any): void {
|
||||||
|
if (typeof data === "object") {
|
||||||
|
data = JSON.stringify(data);
|
||||||
|
}
|
||||||
|
let date = new Date();
|
||||||
|
|
||||||
|
let year: string = this.leftPad(String(date.getFullYear()), 4, '0');
|
||||||
|
let month: string = this.leftPad(String(date.getMonth() + 1), 2, '0');
|
||||||
|
let day: string = this.leftPad(String(date.getDate()), 2, '0');
|
||||||
|
|
||||||
|
let hours: string = this.leftPad(String(date.getHours()), 2, '0');
|
||||||
|
let minutes: string = this.leftPad(String(date.getMinutes()), 2, '0');
|
||||||
|
let seconds: string = this.leftPad(String(date.getSeconds()), 2, '0');
|
||||||
|
let milliseconds: string = this.leftPad(String(date.getMilliseconds()), 3, '0');
|
||||||
|
|
||||||
|
let datePrefix: string = `[${day}/${month}/${year}-${hours}:${minutes}:${seconds}:${milliseconds}]`
|
||||||
|
|
||||||
|
let out: string = datePrefix.padEnd(30, ' ') + `[${this.clazz}]`.padEnd(28, ' ') + `(${logLevel})`.padEnd(8, ' ') + data;
|
||||||
|
if (logLevel <= this.logLevel) {
|
||||||
|
console.log(out);
|
||||||
|
}
|
||||||
|
if (!!this.logFileWriteStream) {
|
||||||
|
this.logFileWriteStream.write(out + "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log1 = this.log.bind(this, 1);
|
||||||
|
log2 = this.log.bind(this, 2);
|
||||||
|
log3 = this.log.bind(this, 3);
|
||||||
|
log4 = this.log.bind(this, 4);
|
||||||
|
log5 = this.log.bind(this, 5);
|
||||||
|
log6 = this.log.bind(this, 6);
|
||||||
|
}
|
1685
src/main.ts
Normal file
1685
src/main.ts
Normal file
File diff suppressed because it is too large
Load Diff
16
src/smppSession.ts
Normal file
16
src/smppSession.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
export interface SmppSession {
|
||||||
|
username: string,
|
||||||
|
password: string,
|
||||||
|
|
||||||
|
sendPdu(pdu: object): Promise<object>;
|
||||||
|
|
||||||
|
sendSingle(Job: object): Promise<object>;
|
||||||
|
|
||||||
|
sendMultiple(Job: object): Promise<object>;
|
||||||
|
|
||||||
|
close(): Promise<void>;
|
||||||
|
|
||||||
|
initialize(): void;
|
||||||
|
|
||||||
|
serialize(): string;
|
||||||
|
}
|
14
tsconfig.json
Normal file
14
tsconfig.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "es6",
|
||||||
|
"module": "commonjs",
|
||||||
|
"outDir": "./dist",
|
||||||
|
"rootDir": "./src",
|
||||||
|
"strict": true,
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"esModuleInterop": true
|
||||||
|
},
|
||||||
|
"exclude": [
|
||||||
|
"./node_modules"
|
||||||
|
]
|
||||||
|
}
|
Reference in New Issue
Block a user