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";
|
2023-03-09 09:08:42 -05:00
|
|
|
import { InMemoryStateBackend, Profile, State } from "./state.ts";
|
2023-03-08 12:03:57 -05:00
|
|
|
import { MemoryCache } from "./cache.ts";
|
2023-03-09 09:08:42 -05:00
|
|
|
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
|
|
|
|
2023-03-09 16:04:28 -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
|
|
|
}
|
2023-03-09 09:08:42 -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({
|
2024-01-30 01:30:56 -05:00
|
|
|
reader: Deno.stdin.readable,
|
|
|
|
|
writer: Deno.stdout.writable,
|
2023-03-05 07:01:48 -05:00
|
|
|
}),
|
|
|
|
|
service,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await server.serve();
|
2023-03-04 08:10:30 -05:00
|
|
|
}
|