s3si.ts/src/daemon.ts

95 lines
2.1 KiB
TypeScript
Raw Normal View History

2023-03-05 07:01:48 -05:00
import {
JSONRPCServer,
RPCResult,
2023-03-05 12:56:07 -05:00
S3SIService,
2023-03-05 07:01:48 -05:00
Service,
} from "./jsonrpc/mod.ts";
import { DenoIO } from "./jsonrpc/deno.ts";
import { loginSteps } from "./iksm.ts";
import { DEFAULT_ENV, Env } from "./env.ts";
import { Queue } from "./jsonrpc/channel.ts";
enum LoggerLevel {
Debug = "debug",
Log = "log",
Warn = "warn",
Error = "error",
}
class S3SIServiceImplement implements S3SIService, Service {
loginMap: Map<string, {
step1: (url: string) => void;
promise: Promise<string>;
}> = new Map();
loggerQueue: Queue<{ level: LoggerLevel; msg: unknown[] }> = new Queue();
env: Env = {
prompts: {
promptLogin: () => {
return Promise.reject("Not implemented");
},
prompt: () => {
return Promise.reject("Not implemented");
},
},
logger: {
debug: (...msg) =>
this.loggerQueue.push({ level: LoggerLevel.Debug, msg }),
log: (...msg) => this.loggerQueue.push({ level: LoggerLevel.Log, msg }),
warn: (...msg) => this.loggerQueue.push({ level: LoggerLevel.Warn, msg }),
error: (...msg) =>
this.loggerQueue.push({ level: LoggerLevel.Error, msg }),
},
newFetcher: DEFAULT_ENV.newFetcher,
};
2023-03-04 08:10:30 -05:00
2023-03-05 07:01:48 -05:00
loginSteps(): Promise<
2023-03-05 12:56:07 -05:00
RPCResult<{
authCodeVerifier: string;
url: string;
}>
2023-03-05 07:01:48 -05:00
>;
loginSteps(step2: {
authCodeVerifier: string;
login: string;
}): Promise<
2023-03-05 12:56:07 -05:00
RPCResult<{ sessionToken: string }>
2023-03-05 07:01:48 -05:00
>;
async loginSteps(step2?: {
authCodeVerifier: string;
login: string;
}): Promise<
RPCResult<
{
authCodeVerifier: string;
url: string;
} | {
sessionToken: string;
2023-03-05 12:56:07 -05:00
}
2023-03-05 07:01:48 -05:00
>
> {
if (!step2) {
return {
result: await loginSteps(this.env),
};
2023-03-04 08:10:30 -05:00
}
2023-03-05 07:01:48 -05:00
return {
result: await loginSteps(this.env, step2),
};
2023-03-04 08:10:30 -05:00
}
2023-03-05 07:01:48 -05:00
// deno-lint-ignore no-explicit-any
[key: string]: any;
}
if (import.meta.main) {
const service = new S3SIServiceImplement();
const server = new JSONRPCServer({
transport: new DenoIO({
reader: Deno.stdin,
writer: Deno.stdout,
}),
service,
});
await server.serve();
2023-03-04 08:10:30 -05:00
}