mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 01:38:19 +08:00
Hello yarn berry
This commit is contained in:
1 parent
04a4306895
commit
782f334a27
62 files changed
+448
-239
No files matched your search
@@ -1,7 +1,7 @@
|
||||
/* eslint-disable no-await-in-loop */
|
||||
/* eslint-disable import/no-dynamic-require */
|
||||
import { argv } from 'yargs';
|
||||
import { ObjectID } from 'mongodb';
|
||||
import cac from 'cac';
|
||||
import {
|
||||
lib, service, model, script,
|
||||
builtinLib, builtinModel, builtinScript,
|
||||
@@ -11,6 +11,7 @@ import { validate } from '../lib/validator';
|
||||
import * as bus from '../service/bus';
|
||||
import db from '../service/db';
|
||||
|
||||
const argv = cac().parse();
|
||||
const COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
|
||||
const ARR = /=>.*$/mg;
|
||||
function parseParameters(fn: Function) {
|
||||
@@ -29,7 +30,7 @@ async function runScript(name: string, arg: any) {
|
||||
}
|
||||
|
||||
async function cli() {
|
||||
const [, modelName, func, ...args] = argv._ as [string, string, string, ...any[]];
|
||||
const [, modelName, func, ...args] = argv.args as [string, string, string, ...any[]];
|
||||
if (modelName === 'script') {
|
||||
let arg: any;
|
||||
try {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
import os from 'os';
|
||||
import path from 'path';
|
||||
import fs from 'fs-extra';
|
||||
import { argv } from 'yargs';
|
||||
import cac from 'cac';
|
||||
import { builtinModel } from './common';
|
||||
import { Entry } from '../loader';
|
||||
import { Logger } from '../logger';
|
||||
@@ -11,13 +11,14 @@ import options from '../options';
|
||||
import * as bus from '../service/bus';
|
||||
import db from '../service/db';
|
||||
|
||||
const argv = cac().parse();
|
||||
const logger = new Logger('entry/master');
|
||||
const tmpdir = path.resolve(os.tmpdir(), 'hydro');
|
||||
const lockfile = path.resolve(tmpdir, 'lock.json');
|
||||
|
||||
export async function load(call: Entry) {
|
||||
fs.ensureDirSync(tmpdir);
|
||||
if (fs.existsSync(lockfile) && !argv.ignorelock) {
|
||||
if (fs.existsSync(lockfile) && !argv.options.ignorelock) {
|
||||
try {
|
||||
const file = require(lockfile);
|
||||
process.kill(file.pid, 0);
|
||||
|
||||
@@ -6,11 +6,11 @@ import Koa, { Context } from 'koa';
|
||||
import Body from 'koa-body';
|
||||
import cache from 'koa-static-cache';
|
||||
import mongodb from 'mongodb';
|
||||
import { argv } from 'yargs';
|
||||
import cac from 'cac';
|
||||
import { Logger } from '../logger';
|
||||
|
||||
const logger = new Logger('setup');
|
||||
const listenPort = argv.port || 8888;
|
||||
const listenPort = cac().parse().options.port || 8888;
|
||||
|
||||
async function get(ctx: Context) {
|
||||
ctx.body = `<!DOCTYPE html>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* eslint-disable no-await-in-loop */
|
||||
/* eslint-disable import/no-dynamic-require */
|
||||
import { argv } from 'yargs';
|
||||
import cac from 'cac';
|
||||
import {
|
||||
locale, template, lib, service, model, handler, script, setting, uistatic,
|
||||
builtinLib, builtinScript, builtinHandler, builtinModel,
|
||||
@@ -11,32 +11,33 @@ import db from '../service/db';
|
||||
import { Logger } from '../logger';
|
||||
|
||||
const logger = new Logger('loader/worker');
|
||||
const detail = cac().parse().options.loaderDetail;
|
||||
|
||||
export async function load() {
|
||||
const pending = global.addons;
|
||||
const fail = [];
|
||||
const active = [];
|
||||
if (argv.loaderDetail) logger.info('start');
|
||||
if (detail) logger.info('start');
|
||||
require('../lib/i18n');
|
||||
require('../utils');
|
||||
require('../error');
|
||||
require('../options');
|
||||
if (argv.loaderDetail) logger.info('finish: options');
|
||||
if (detail) logger.info('finish: options');
|
||||
await Promise.all([
|
||||
locale(pending, fail),
|
||||
template(pending, fail),
|
||||
uistatic(pending, fail),
|
||||
]);
|
||||
if (argv.loaderDetail) logger.info('finish: locale/template/static');
|
||||
if (detail) logger.info('finish: locale/template/static');
|
||||
const opts = options();
|
||||
await db.start(opts);
|
||||
if (argv.loaderDetail) logger.info('finish: db.connect');
|
||||
if (detail) logger.info('finish: db.connect');
|
||||
const modelSystem = require('../model/system');
|
||||
await modelSystem.runConfig();
|
||||
if (argv.loaderDetail) logger.info('finish: config');
|
||||
if (detail) logger.info('finish: config');
|
||||
const storage = require('../service/storage');
|
||||
await storage.start();
|
||||
if (argv.loaderDetail) logger.info('finish: storage.connect');
|
||||
if (detail) logger.info('finish: storage.connect');
|
||||
for (const i of builtinLib) {
|
||||
let t;
|
||||
try {
|
||||
@@ -46,40 +47,40 @@ export async function load() {
|
||||
}
|
||||
require(t);
|
||||
}
|
||||
if (argv.loaderDetail) logger.info('finish: lib.builtin');
|
||||
if (detail) logger.info('finish: lib.builtin');
|
||||
await lib(pending, fail);
|
||||
if (argv.loaderDetail) logger.info('finish: lib.extra');
|
||||
if (detail) logger.info('finish: lib.extra');
|
||||
require('../service/gridfs');
|
||||
require('../service/monitor');
|
||||
if (argv.loaderDetail) logger.info('finish: gridfs/monitor');
|
||||
if (detail) logger.info('finish: gridfs/monitor');
|
||||
const server = require('../service/server');
|
||||
await server.prepare();
|
||||
if (argv.loaderDetail) logger.info('finish: server');
|
||||
if (detail) logger.info('finish: server');
|
||||
await service(pending, fail);
|
||||
if (argv.loaderDetail) logger.info('finish: service.extra');
|
||||
if (detail) logger.info('finish: service.extra');
|
||||
for (const i of builtinModel) require(`../model/${i}`);
|
||||
if (argv.loaderDetail) logger.info('finish: model.builtin');
|
||||
if (detail) logger.info('finish: model.builtin');
|
||||
for (const i of builtinHandler) require(`../handler/${i}`);
|
||||
if (argv.loaderDetail) logger.info('finish: handler.builtin');
|
||||
if (detail) logger.info('finish: handler.builtin');
|
||||
await model(pending, fail);
|
||||
if (argv.loaderDetail) logger.info('finish: model.extra');
|
||||
if (detail) logger.info('finish: model.extra');
|
||||
const modelSetting = require('../model/setting');
|
||||
await setting(pending, fail, modelSetting);
|
||||
if (argv.loaderDetail) logger.info('finish: setting');
|
||||
if (detail) logger.info('finish: setting');
|
||||
await handler(pending, fail);
|
||||
if (argv.loaderDetail) logger.info('finish: handler.extra');
|
||||
if (detail) logger.info('finish: handler.extra');
|
||||
for (const i in global.Hydro.handler) await global.Hydro.handler[i]();
|
||||
if (argv.loaderDetail) logger.info('finish: handler.apply');
|
||||
if (detail) logger.info('finish: handler.apply');
|
||||
const notfound = require('../handler/notfound');
|
||||
await notfound.apply();
|
||||
for (const i of builtinScript) require(`../script/${i}`);
|
||||
if (argv.loaderDetail) logger.info('finish: script.builtin');
|
||||
if (detail) logger.info('finish: script.builtin');
|
||||
await script(pending, fail, active);
|
||||
if (argv.loaderDetail) logger.info('finish: script.extra');
|
||||
if (detail) logger.info('finish: script.extra');
|
||||
await bus.serial('app/started');
|
||||
if (argv.loaderDetail) logger.info('finish: bus.serial(start)');
|
||||
if (detail) logger.info('finish: bus.serial(start)');
|
||||
await server.start();
|
||||
if (argv.loaderDetail) logger.info('finish: server.start');
|
||||
if (detail) logger.info('finish: server.start');
|
||||
setInterval(() => {
|
||||
process.send({ event: 'stat', count: global.Hydro.stat.reqCount });
|
||||
global.Hydro.stat.reqCount = 0;
|
||||
|
||||
@@ -8,6 +8,15 @@ import 'reflect-metadata';
|
||||
const versionNum = +process.version.replace(/v/gim, '').split('.')[0];
|
||||
if (versionNum < 14) throw new Error('NodeJS >=v14 required');
|
||||
|
||||
import cac from 'cac';
|
||||
|
||||
const argv = cac().parse();
|
||||
|
||||
if (argv.options.debug) {
|
||||
process.env.NODE_ENV = 'development';
|
||||
process.env.DEV = 'on';
|
||||
} else process.env.NODE_ENV = process.env.NODE_ENV || 'production';
|
||||
|
||||
if (!global.Hydro) {
|
||||
global.Hydro = {
|
||||
version: {
|
||||
@@ -44,7 +53,6 @@ import os from 'os';
|
||||
import path from 'path';
|
||||
import cluster from 'cluster';
|
||||
import fs from 'fs-extra';
|
||||
import { argv } from 'yargs';
|
||||
import './utils';
|
||||
import { Logger } from './logger';
|
||||
import './ui';
|
||||
@@ -95,7 +103,7 @@ async function stopWorker() {
|
||||
}
|
||||
|
||||
async function startWorker(cnt: number, createFirst = true) {
|
||||
if (argv.single) {
|
||||
if (argv.options.single) {
|
||||
await entry({ entry: 'worker' });
|
||||
} else {
|
||||
await fork(createFirst ? ['--firstWorker'] : undefined);
|
||||
@@ -154,7 +162,7 @@ export function addon(addonPath: string, prepend = false) {
|
||||
export async function load() {
|
||||
addon(path.resolve(__dirname, '..'), true);
|
||||
Error.stackTraceLimit = 50;
|
||||
if (cluster.isMaster || argv.startAsMaster) {
|
||||
if (cluster.isMaster || argv.options.startAsMaster) {
|
||||
logger.info(`Master ${process.pid} Starting`);
|
||||
const cnt = await entry({ entry: 'master' });
|
||||
logger.info('Master started');
|
||||
@@ -173,14 +181,14 @@ export async function load() {
|
||||
});
|
||||
await startWorker(cnt);
|
||||
} else {
|
||||
global.addons = JSON.parse(Buffer.from(argv.addons as string, 'base64').toString());
|
||||
global.addons = JSON.parse(Buffer.from(argv.options.addons as string, 'base64').toString());
|
||||
logger.info('%o', global.addons);
|
||||
if (argv.entry) {
|
||||
logger.info(`Worker ${process.pid} Starting as ${argv.entry}`);
|
||||
await entry({ entry: argv.entry as string });
|
||||
logger.success(`Worker ${process.pid} Started as ${argv.entry}`);
|
||||
if (argv.options.entry) {
|
||||
logger.info(`Worker ${process.pid} Starting as ${argv.options.entry}`);
|
||||
await entry({ entry: argv.options.entry });
|
||||
logger.success(`Worker ${process.pid} Started as ${argv.options.entry}`);
|
||||
} else {
|
||||
if (argv.firstWorker) global.Hydro.isFirstWorker = true;
|
||||
if (argv.options.firstWorker) global.Hydro.isFirstWorker = true;
|
||||
else global.Hydro.isFirstWorker = false;
|
||||
logger.info(`Worker ${process.pid} Starting`);
|
||||
await entry({ entry: 'worker' });
|
||||
@@ -195,8 +203,8 @@ export async function loadCli() {
|
||||
process.kill(process.pid, 'SIGINT');
|
||||
}
|
||||
|
||||
if (argv.pandora || require.main === module) {
|
||||
const func = argv._[0] === 'cli' ? load : loadCli;
|
||||
if (argv.options.pandora || require.main === module) {
|
||||
const func = argv.args[0] === 'cli' ? load : loadCli;
|
||||
func().catch((e) => {
|
||||
logger.error(e);
|
||||
process.exit(1);
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import { inspect, format, InspectOptions } from 'util';
|
||||
import { argv } from 'yargs';
|
||||
import { Time } from './utils';
|
||||
|
||||
const colors = [
|
||||
@@ -20,7 +19,7 @@ export class Logger {
|
||||
static readonly INFO = 2;
|
||||
static readonly WARN = 2;
|
||||
static readonly DEBUG = 3;
|
||||
static baseLevel = argv.debug ? 3 : 2;
|
||||
static baseLevel = process.env.DEV ? 3 : 2;
|
||||
static showDiff = false;
|
||||
static levels: Record<string, number> = {};
|
||||
static lastTime = 0;
|
||||
|
||||
@@ -16,7 +16,7 @@ class BlackListModel {
|
||||
const res = await coll.findOneAndUpdate(
|
||||
{ _id: id },
|
||||
{ $set: { expireAt } },
|
||||
{ upsert: true, returnOriginal: false },
|
||||
{ upsert: true, returnDocument: 'after' },
|
||||
);
|
||||
return res.value;
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ export async function set<K extends keyof DocType>(
|
||||
const res = await coll.findOneAndUpdate(
|
||||
{ domainId, docType, docId },
|
||||
update,
|
||||
{ returnOriginal: false, upsert: true },
|
||||
{ returnDocument: 'after', upsert: true },
|
||||
);
|
||||
return res.value;
|
||||
}
|
||||
@@ -141,7 +141,7 @@ export async function inc<K extends keyof DocType>(
|
||||
const res = await coll.findOneAndUpdate(
|
||||
{ domainId, docType, docId },
|
||||
{ $inc: { [key]: value } },
|
||||
{ returnOriginal: false },
|
||||
{ returnDocument: 'after' },
|
||||
);
|
||||
return res.value;
|
||||
}
|
||||
@@ -153,7 +153,7 @@ export async function incAndSet<K extends keyof DocType>(
|
||||
const res = await coll.findOneAndUpdate(
|
||||
{ domainId, docType, docId },
|
||||
{ $inc: { [key]: value }, $set: args },
|
||||
{ returnOriginal: false },
|
||||
{ returnDocument: 'after' },
|
||||
);
|
||||
return res.value;
|
||||
}
|
||||
@@ -183,7 +183,7 @@ export async function push(
|
||||
const doc = await coll.findOneAndUpdate(
|
||||
{ domainId, docType, docId },
|
||||
{ $push: { [key]: v } },
|
||||
{ returnOriginal: false },
|
||||
{ returnDocument: 'after' },
|
||||
);
|
||||
return [doc.value, _id];
|
||||
}
|
||||
@@ -195,7 +195,7 @@ export async function pull<K extends keyof DocType, T extends ArrayKeys<DocType[
|
||||
const res = await coll.findOneAndUpdate(
|
||||
{ domainId, docType, docId },
|
||||
{ $pull: { [setKey]: { $in: contents } } },
|
||||
{ returnOriginal: false },
|
||||
{ returnDocument: 'after' },
|
||||
);
|
||||
return res.value;
|
||||
}
|
||||
@@ -208,7 +208,7 @@ export async function deleteSub<T extends keyof DocType, K extends ArrayKeys<Doc
|
||||
const res = await coll.findOneAndUpdate(
|
||||
{ domainId, docType, docId },
|
||||
{ $pull: { [key]: { _id: { $in: subId } } } },
|
||||
{ returnOriginal: false },
|
||||
{ returnDocument: 'after' },
|
||||
);
|
||||
return res.value;
|
||||
}
|
||||
@@ -244,7 +244,7 @@ export async function setSub<T extends keyof DocType, K extends ArrayKeys<DocTyp
|
||||
[key]: { $elemMatch: { _id: subId } },
|
||||
},
|
||||
{ $set },
|
||||
{ returnOriginal: false },
|
||||
{ returnDocument: 'after' },
|
||||
);
|
||||
return res.value;
|
||||
}
|
||||
@@ -256,7 +256,7 @@ export async function addToSet<T extends keyof DocType, K extends ArrayKeys<DocT
|
||||
const res = await coll.findOneAndUpdate(
|
||||
{ domainId, docType, docId },
|
||||
{ $addToSet: { [setKey]: content } },
|
||||
{ returnOriginal: false },
|
||||
{ returnDocument: 'after' },
|
||||
);
|
||||
return res.value;
|
||||
}
|
||||
@@ -285,7 +285,7 @@ export async function setStatus<K extends keyof DocStatusType>(
|
||||
const res = await collStatus.findOneAndUpdate(
|
||||
{ domainId, docType, docId, uid },
|
||||
{ $set: args },
|
||||
{ upsert: true, returnOriginal: false },
|
||||
{ upsert: true, returnDocument: 'after' },
|
||||
);
|
||||
return res.value;
|
||||
}
|
||||
@@ -308,7 +308,7 @@ export async function setIfNotStatus<T extends keyof DocStatusType, K extends ke
|
||||
const res = await collStatus.findOneAndUpdate(
|
||||
{ domainId, docType, docId, uid },
|
||||
{ $set: { [key]: value, ...args } },
|
||||
{ upsert: true, returnOriginal: false },
|
||||
{ upsert: true, returnDocument: 'after' },
|
||||
);
|
||||
return res.value;
|
||||
}
|
||||
@@ -322,7 +322,7 @@ export async function setStatusIfNotCondition<T extends keyof DocStatusType>(
|
||||
const res = await collStatus.findOneAndUpdate(
|
||||
{ domainId, docType, docId, uid },
|
||||
{ $set: args },
|
||||
{ upsert: true, returnOriginal: false },
|
||||
{ upsert: true, returnDocument: 'after' },
|
||||
);
|
||||
return res.value;
|
||||
}
|
||||
@@ -336,7 +336,7 @@ export async function cappedIncStatus<T extends keyof DocStatusType>(
|
||||
const res = await collStatus.findOneAndUpdate(
|
||||
{ domainId, docType, docId, uid, [key]: { $not } },
|
||||
{ $inc: { [key]: value } },
|
||||
{ upsert: true, returnOriginal: false },
|
||||
{ upsert: true, returnDocument: 'after' },
|
||||
);
|
||||
return res.value;
|
||||
}
|
||||
@@ -348,7 +348,7 @@ export async function incStatus<T extends keyof DocStatusType>(
|
||||
const res = await collStatus.findOneAndUpdate(
|
||||
{ domainId, docType, docId, uid },
|
||||
{ $inc: { [key]: value } },
|
||||
{ upsert: true, returnOriginal: false },
|
||||
{ upsert: true, returnDocument: 'after' },
|
||||
);
|
||||
return res.value;
|
||||
}
|
||||
@@ -360,13 +360,13 @@ export async function revPushStatus<T extends keyof DocStatusType>(
|
||||
let res = await collStatus.findOneAndUpdate(
|
||||
{ domainId, docType, docId, uid, [`${key}.${id}`]: value[id] },
|
||||
{ $set: { [`${key}.$`]: value }, $inc: { rev: 1 } },
|
||||
{ returnOriginal: false },
|
||||
{ returnDocument: 'after' },
|
||||
);
|
||||
if (!res.value) {
|
||||
res = await collStatus.findOneAndUpdate(
|
||||
{ domainId, docType, docId, uid },
|
||||
{ $push: { [key]: value }, $inc: { rev: 1 } },
|
||||
{ upsert: true, returnOriginal: false },
|
||||
{ upsert: true, returnDocument: 'after' },
|
||||
);
|
||||
}
|
||||
return res.value;
|
||||
@@ -378,7 +378,7 @@ export async function revInitStatus<T extends keyof DocStatusType>(
|
||||
const res = await collStatus.findOneAndUpdate(
|
||||
{ domainId, docType, docId, uid },
|
||||
{ $inc: { rev: 1 } },
|
||||
{ upsert: true, returnOriginal: false },
|
||||
{ upsert: true, returnDocument: 'after' },
|
||||
);
|
||||
return res.value;
|
||||
}
|
||||
@@ -389,7 +389,7 @@ export async function revSetStatus<T extends keyof DocStatusType>(
|
||||
): Promise<any> {
|
||||
const filter = { domainId, docType, docId, uid, rev };
|
||||
const update = { $set: args, $inc: { rev: 1 } };
|
||||
const res = await collStatus.findOneAndUpdate(filter, update, { returnOriginal: false });
|
||||
const res = await collStatus.findOneAndUpdate(filter, update, { returnDocument: 'after' });
|
||||
return res.value;
|
||||
}
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ class DomainModel {
|
||||
|
||||
static async edit(domainId: string, $set: Partial<DomainDoc>) {
|
||||
await bus.serial('domain/before-update', domainId, $set);
|
||||
const result = await coll.findOneAndUpdate({ _id: domainId }, { $set }, { returnOriginal: false });
|
||||
const result = await coll.findOneAndUpdate({ _id: domainId }, { $set }, { returnDocument: 'after' });
|
||||
await bus.serial('domain/update', domainId, $set, result.value);
|
||||
return result.value;
|
||||
}
|
||||
@@ -92,7 +92,7 @@ class DomainModel {
|
||||
// FIXME
|
||||
// @ts-expect-error
|
||||
{ $inc: { [field]: n } },
|
||||
{ returnOriginal: false },
|
||||
{ returnDocument: 'after' },
|
||||
);
|
||||
return res.value[field];
|
||||
}
|
||||
@@ -113,7 +113,7 @@ class DomainModel {
|
||||
@ArgMethod
|
||||
static async setUserRole(domainId: string, uid: MaybeArray<number>, role: string) {
|
||||
if (!(uid instanceof Array)) {
|
||||
const res = await collUser.findOneAndUpdate({ domainId, uid }, { $set: { role } }, { upsert: true, returnOriginal: false });
|
||||
const res = await collUser.findOneAndUpdate({ domainId, uid }, { $set: { role } }, { upsert: true, returnDocument: 'after' });
|
||||
const udoc = await UserModel.getById(domainId, uid);
|
||||
deleteUserCache(udoc);
|
||||
return res;
|
||||
|
||||
@@ -46,7 +46,7 @@ class MessageModel {
|
||||
const result = await coll.findOneAndUpdate(
|
||||
{ _id: messageId },
|
||||
{ $bit: { flag: { xor: flag } } },
|
||||
{ returnOriginal: false },
|
||||
{ returnDocument: 'after' },
|
||||
);
|
||||
return result.value;
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ class OauthModel {
|
||||
const res = await coll.findOneAndUpdate(
|
||||
{ _id },
|
||||
{ $set: { value } },
|
||||
{ upsert: true, returnOriginal: false },
|
||||
{ upsert: true, returnDocument: 'after' },
|
||||
);
|
||||
return res.value.uid;
|
||||
}
|
||||
|
||||
@@ -132,7 +132,7 @@ class RecordModel {
|
||||
const res = await RecordModel.coll.findOneAndUpdate(
|
||||
{ _id, domainId },
|
||||
$update,
|
||||
{ returnOriginal: false },
|
||||
{ returnDocument: 'after' },
|
||||
);
|
||||
return res.value;
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ export class StorageModel {
|
||||
}
|
||||
|
||||
static async get(path: string, savePath?: string) {
|
||||
const { value } = await StorageModel.coll.findOneAndUpdate({ path }, { $set: { lastUsage: new Date() } }, { returnOriginal: false });
|
||||
const { value } = await StorageModel.coll.findOneAndUpdate({ path }, { $set: { lastUsage: new Date() } }, { returnDocument: 'after' });
|
||||
if (value) return await storage.get(value._id, savePath);
|
||||
return await storage.get(path, savePath);
|
||||
}
|
||||
@@ -61,7 +61,7 @@ export class StorageModel {
|
||||
}
|
||||
|
||||
static async getMeta(path: string) {
|
||||
const { value } = await StorageModel.coll.findOneAndUpdate({ path }, { $set: { lastUsage: new Date() } }, { returnOriginal: false });
|
||||
const { value } = await StorageModel.coll.findOneAndUpdate({ path }, { $set: { lastUsage: new Date() } }, { returnDocument: 'after' });
|
||||
if (!value) return null;
|
||||
return {
|
||||
...value.meta,
|
||||
|
||||
@@ -15,22 +15,22 @@ export function get(key: string): any {
|
||||
|
||||
export function getMany<
|
||||
A extends keyof SystemKeys, B extends keyof SystemKeys,
|
||||
>(keys: [A, B]): [SystemKeys[A], SystemKeys[B]];
|
||||
>(keys: [A, B]): [SystemKeys[A], SystemKeys[B]];
|
||||
export function getMany<
|
||||
A extends keyof SystemKeys, B extends keyof SystemKeys, C extends keyof SystemKeys,
|
||||
>(keys: [A, B, C]): [SystemKeys[A], SystemKeys[B], SystemKeys[C]];
|
||||
>(keys: [A, B, C]): [SystemKeys[A], SystemKeys[B], SystemKeys[C]];
|
||||
export function getMany<
|
||||
A extends keyof SystemKeys, B extends keyof SystemKeys, C extends keyof SystemKeys,
|
||||
D extends keyof SystemKeys,
|
||||
>(keys: [A, B, C, D]): [SystemKeys[A], SystemKeys[B], SystemKeys[C], SystemKeys[D]];
|
||||
>(keys: [A, B, C, D]): [SystemKeys[A], SystemKeys[B], SystemKeys[C], SystemKeys[D]];
|
||||
export function getMany<
|
||||
A extends keyof SystemKeys, B extends keyof SystemKeys, C extends keyof SystemKeys,
|
||||
D extends keyof SystemKeys, E extends keyof SystemKeys,
|
||||
>(keys: [A, B, C, D, E]): [SystemKeys[A], SystemKeys[B], SystemKeys[C], SystemKeys[D], SystemKeys[E]];
|
||||
>(keys: [A, B, C, D, E]): [SystemKeys[A], SystemKeys[B], SystemKeys[C], SystemKeys[D], SystemKeys[E]];
|
||||
export function getMany<
|
||||
A extends keyof SystemKeys, B extends keyof SystemKeys, C extends keyof SystemKeys,
|
||||
D extends keyof SystemKeys, E extends keyof SystemKeys, F extends keyof SystemKeys,
|
||||
>(keys: [A, B, C, D, E, F]): [SystemKeys[A], SystemKeys[B], SystemKeys[C], SystemKeys[D], SystemKeys[E], SystemKeys[F]];
|
||||
>(keys: [A, B, C, D, E, F]): [SystemKeys[A], SystemKeys[B], SystemKeys[C], SystemKeys[D], SystemKeys[E], SystemKeys[F]];
|
||||
export function getMany(keys: (keyof SystemKeys)[]): any[];
|
||||
export function getMany(keys: string[]): any[] {
|
||||
return keys.map((key) => cache[key]);
|
||||
@@ -43,7 +43,7 @@ export async function set(_id: string, value: any, boardcast = true) {
|
||||
const res = await coll.findOneAndUpdate(
|
||||
{ _id },
|
||||
{ $set: { value } },
|
||||
{ upsert: true, returnOriginal: false },
|
||||
{ upsert: true, returnDocument: 'after' },
|
||||
);
|
||||
cache[_id] = res.value.value;
|
||||
return res.value.value;
|
||||
@@ -55,7 +55,7 @@ export async function inc<K extends NumberKeys<SystemKeys>>(_id: K) {
|
||||
// FIXME NumberKeys<>
|
||||
// @ts-ignore
|
||||
{ $inc: { value: 1 } },
|
||||
{ upsert: true, returnOriginal: false },
|
||||
{ upsert: true, returnDocument: 'after' },
|
||||
);
|
||||
cache[_id] = res.value.value;
|
||||
return res.value.value;
|
||||
|
||||
@@ -53,7 +53,7 @@ class TokenModel {
|
||||
tokenType,
|
||||
},
|
||||
},
|
||||
{ returnOriginal: false },
|
||||
{ returnDocument: 'after' },
|
||||
);
|
||||
return res.value;
|
||||
}
|
||||
|
||||
@@ -204,7 +204,7 @@ class UserModel {
|
||||
const op: any = {};
|
||||
if ($set && Object.keys($set).length) op.$set = $set;
|
||||
if ($unset && Object.keys($unset).length) op.$unset = $unset;
|
||||
const res = await coll.findOneAndUpdate({ _id: uid }, op, { returnOriginal: false });
|
||||
const res = await coll.findOneAndUpdate({ _id: uid }, op, { returnDocument: 'after' });
|
||||
deleteUserCache(res.value);
|
||||
return res;
|
||||
}
|
||||
@@ -220,7 +220,7 @@ class UserModel {
|
||||
const res = await coll.findOneAndUpdate(
|
||||
{ _id: uid },
|
||||
{ $set: { salt, hash: pwhash(password, salt), hashType: 'hydro' } },
|
||||
{ returnOriginal: false },
|
||||
{ returnDocument: 'after' },
|
||||
);
|
||||
deleteUserCache(res.value);
|
||||
return res.value;
|
||||
@@ -290,7 +290,7 @@ class UserModel {
|
||||
const res = await coll.findOneAndUpdate(
|
||||
{ _id: uid },
|
||||
{ $set: { priv } },
|
||||
{ returnOriginal: false },
|
||||
{ returnDocument: 'after' },
|
||||
);
|
||||
deleteUserCache(res.value);
|
||||
return res.value;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* eslint-disable no-await-in-loop */
|
||||
import cluster from 'cluster';
|
||||
import serialize from 'serialize-javascript';
|
||||
import { argv } from 'yargs';
|
||||
import cac from 'cac';
|
||||
import type { Db, FilterQuery, OnlyFieldsOfType } from 'mongodb';
|
||||
import type { Handler } from './server';
|
||||
import { Logger } from '../logger';
|
||||
@@ -16,6 +16,7 @@ import type { UserRegisterHandler } from '../handler/user';
|
||||
|
||||
const _hooks: Record<keyof any, Array<(...args: any[]) => any>> = {};
|
||||
const logger = new Logger('bus', true);
|
||||
const argv = cac().parse();
|
||||
|
||||
function isBailed(value: any) {
|
||||
return value !== null && value !== false && value !== undefined;
|
||||
@@ -146,9 +147,9 @@ export function off<K extends keyof EventMap>(name: K, listener: EventMap[K]) {
|
||||
|
||||
export async function parallel<K extends keyof EventMap>(name: K, ...args: Parameters<EventMap[K]>): Promise<void> {
|
||||
const tasks: Promise<any>[] = [];
|
||||
if (argv.showBus) logger.debug('parallel: %s %o', name, args);
|
||||
if (argv.options.showBus) logger.debug('parallel: %s %o', name, args);
|
||||
for (const callback of _hooks[name] || []) {
|
||||
if (argv.busDetail) logger.debug(callback.toString());
|
||||
if (argv.options.busDetail) logger.debug(callback.toString());
|
||||
tasks.push(callback.apply(this, args));
|
||||
}
|
||||
await Promise.all(tasks);
|
||||
@@ -159,16 +160,16 @@ export function emit<K extends keyof EventMap>(name: K, ...args: Parameters<Even
|
||||
}
|
||||
|
||||
export async function serial<K extends keyof EventMap>(name: K, ...args: Parameters<EventMap[K]>): Promise<void> {
|
||||
if (argv.showBus) logger.debug('serial: %s %o', name, args);
|
||||
if (argv.options.showBus) logger.debug('serial: %s %o', name, args);
|
||||
const hooks = Array.from(_hooks[name] || []);
|
||||
for (const callback of hooks) {
|
||||
if (argv.busDetail) logger.debug(callback.toString());
|
||||
if (argv.options.busDetail) logger.debug(callback.toString());
|
||||
await callback.apply(this, args);
|
||||
}
|
||||
}
|
||||
|
||||
export function bail<K extends keyof EventMap>(name: K, ...args: Parameters<EventMap[K]>): ReturnType<EventMap[K]> {
|
||||
if (argv.showBus) logger.debug('bail: %s %o', name, args);
|
||||
if (argv.options.showBus) logger.debug('bail: %s %o', name, args);
|
||||
const hooks = Array.from(_hooks[name] || []);
|
||||
for (const callback of hooks) {
|
||||
const result = callback.apply(this, args);
|
||||
|
||||
@@ -15,7 +15,7 @@ import Router from 'koa-router';
|
||||
import proxy from 'koa-proxies';
|
||||
import cache from 'koa-static-cache';
|
||||
import sockjs from 'sockjs';
|
||||
import { argv } from 'yargs';
|
||||
import cac from 'cac';
|
||||
import { createHash } from 'crypto';
|
||||
import type { SetOption } from 'cookies';
|
||||
import * as bus from './bus';
|
||||
@@ -38,6 +38,7 @@ import token from '../model/token';
|
||||
import * as opcount from '../model/opcount';
|
||||
import { PERM, PRIV } from '../model/builtin';
|
||||
|
||||
const argv = cac().parse();
|
||||
const logger = new Logger('server');
|
||||
export const app = new Koa();
|
||||
export const server = http.createServer(app.callback());
|
||||
@@ -248,8 +249,8 @@ export async function prepare() {
|
||||
rewrite: (p) => p.replace('/fs', ''),
|
||||
}));
|
||||
app.use(Compress());
|
||||
if (argv.public) {
|
||||
app.use(cache(argv.public, {
|
||||
if (argv.options.public) {
|
||||
app.use(cache(argv.options.public, {
|
||||
maxAge: 0,
|
||||
}));
|
||||
} else {
|
||||
@@ -257,7 +258,7 @@ export async function prepare() {
|
||||
maxAge: 30 * 24 * 60 * 60,
|
||||
}));
|
||||
}
|
||||
if (argv.debug) {
|
||||
if (process.env.DEV) {
|
||||
app.use(async (ctx: Context, next: Function) => {
|
||||
const startTime = new Date().getTime();
|
||||
await next();
|
||||
@@ -482,7 +483,7 @@ export class Handler extends HandlerCommon {
|
||||
}
|
||||
|
||||
async init({ domainId }) {
|
||||
if (!argv.benchmark) await this.limitRate('global', 10, 88);
|
||||
if (!argv.options.benchmark) await this.limitRate('global', 10, 88);
|
||||
const [absoluteDomain, inferDomain, bdoc] = await Promise.all([
|
||||
domain.get(domainId),
|
||||
domain.getByHost(this.request.host),
|
||||
@@ -844,8 +845,8 @@ export function start() {
|
||||
if (started) return;
|
||||
const port = system.get('server.port');
|
||||
app.use(router.routes()).use(router.allowedMethods());
|
||||
server.listen(argv.port || port);
|
||||
logger.success('Server listening at: %d', argv.port || port);
|
||||
server.listen(argv.options.port || port);
|
||||
logger.success('Server listening at: %d', argv.options.port || port);
|
||||
started = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
/* eslint-disable @typescript-eslint/no-shadow */
|
||||
import cluster from 'cluster';
|
||||
import { argv } from 'yargs';
|
||||
import * as bus from './service/bus';
|
||||
|
||||
const disabledTerminal = argv.legacy || argv._.length || process.env.NODE_ENV === 'test';
|
||||
|
||||
export namespace Progress {
|
||||
export class Progress {
|
||||
constructor(public args) {
|
||||
@@ -40,7 +37,6 @@ async function terminate() {
|
||||
}
|
||||
process.on('SIGINT', terminate);
|
||||
if (cluster.isMaster) {
|
||||
if (!disabledTerminal) console.log('Not running in a terminal environment. Interactive mode disabled.');
|
||||
bus.on('message/log', (message) => {
|
||||
process.stdout.write(`${message}\n`);
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user