s3si.ts/src/daemon.ts

137 lines
3.3 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";
2023-03-08 12:03:57 -05:00
import { ExportOpts, Log } from "./jsonrpc/types.ts";
import { App } from "./app.ts";
import { InMemoryStateBackend, Profile, State } from "./state.ts";
2023-03-08 12:03:57 -05:00
import { MemoryCache } from "./cache.ts";
import { Splatnet3 } from "./splatnet3.ts";
2023-03-05 07:01:48 -05:00
class S3SIServiceImplement implements S3SIService, Service {
loginMap: Map<string, {
step1: (url: string) => void;
promise: Promise<string>;
}> = new Map();
2023-03-08 12:03:57 -05:00
loggerQueue: Queue<Log> = new Queue();
2023-03-05 07:01:48 -05:00
env: Env = {
prompts: {
promptLogin: () => {
return Promise.reject("Not implemented");
},
prompt: () => {
return Promise.reject("Not implemented");
},
},
logger: {
2023-03-08 12:03:57 -05:00
debug: (...msg) => this.loggerQueue.push({ level: "debug", msg }),
log: (...msg) => this.loggerQueue.push({ level: "log", msg }),
warn: (...msg) => this.loggerQueue.push({ level: "warn", msg }),
error: (...msg) => this.loggerQueue.push({ level: "error", msg }),
2023-03-05 07:01:48 -05:00
},
newFetcher: DEFAULT_ENV.newFetcher,
};
2023-03-04 08:10:30 -05:00
hello(): Promise<RPCResult<string>> {
return Promise.resolve({
result: "world",
});
}
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
}
async ensureTokenValid(state: State): Promise<
RPCResult<State>
> {
const stateBackend = new InMemoryStateBackend(state);
const profile = new Profile({ stateBackend, env: this.env });
await profile.readState();
const splatnet3 = new Splatnet3({ profile, env: this.env });
if (!await splatnet3.checkToken()) {
return {
error: {
code: 101,
message: "SessionToken is invalid",
},
};
}
return {
result: stateBackend.state,
};
}
2023-03-08 12:03:57 -05:00
async getLogs(): Promise<RPCResult<Log[]>> {
const log = await this.loggerQueue.pop();
return {
result: log ? [log] : [],
};
}
async run(state: State, opts: ExportOpts): Promise<RPCResult<State>> {
const stateBackend = new InMemoryStateBackend(state);
const app = new App({
...opts,
noProgress: true,
env: this.env,
profilePath: "",
stateBackend,
cache: new MemoryCache(),
});
await app.run();
return {
result: stateBackend.state,
};
}
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
}