修正了triggerExecutor的声明

This commit is contained in:
Xu Chang 2022-11-26 14:29:30 +08:00
parent be2b39622b
commit 919183d75f
2 changed files with 24 additions and 25 deletions

View File

@ -4,30 +4,29 @@ import { Logger } from "../types/Logger";
import { Checker } from '../types/Auth';
import { Trigger, CheckerType } from "../types/Trigger";
import { AsyncContext } from './AsyncRowStore';
import { SyncContext } from './SyncRowStore';
/**
* update可能会传入多种不同的actionupdate trigger
*/
export declare class TriggerExecutor<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED> | SyncContext<ED>> {
export declare class TriggerExecutor<ED extends EntityDict & BaseEntityDict> {
private counter;
private triggerMap;
private triggerNameMap;
private volatileEntities;
private logger;
private contextBuilder;
constructor(contextBuilder: (cxtString: string) => Promise<Cxt>, logger?: Logger);
registerChecker<T extends keyof ED>(checker: Checker<ED, T, Cxt>): void;
getCheckers<T extends keyof ED>(entity: T, action: ED[T]['Action'], checkerTypes?: CheckerType[]): Trigger<ED, T, Cxt>[] | undefined;
registerTrigger<T extends keyof ED>(trigger: Trigger<ED, T, Cxt>): void;
unregisterTrigger<T extends keyof ED>(trigger: Trigger<ED, T, Cxt>): void;
constructor(contextBuilder: (cxtString: string) => Promise<AsyncContext<ED>>, logger?: Logger);
registerChecker<T extends keyof ED, Cxt extends AsyncContext<ED>>(checker: Checker<ED, T, Cxt>): void;
getCheckers<T extends keyof ED>(entity: T, action: ED[T]['Action'], checkerTypes?: CheckerType[]): Trigger<ED, T, AsyncContext<ED>>[] | undefined;
registerTrigger<T extends keyof ED, Cxt extends AsyncContext<ED>>(trigger: Trigger<ED, T, Cxt>): void;
unregisterTrigger<T extends keyof ED, Cxt extends AsyncContext<ED>>(trigger: Trigger<ED, T, Cxt>): void;
private preCommitTrigger;
preOperation<T extends keyof ED>(entity: T, operation: ED[T]['Operation'] | ED[T]['Selection'] & {
preOperation<T extends keyof ED, Cxt extends AsyncContext<ED>>(entity: T, operation: ED[T]['Operation'] | ED[T]['Selection'] & {
action: 'select';
}, context: Cxt, option: OperateOption | SelectOption): Promise<void> | void;
private onCommit;
private postCommitTrigger;
postOperation<T extends keyof ED>(entity: T, operation: ED[T]['Operation'] | ED[T]['Selection'] & {
postOperation<T extends keyof ED, Cxt extends AsyncContext<ED>>(entity: T, operation: ED[T]['Operation'] | ED[T]['Selection'] & {
action: 'select';
}, context: Cxt, option: OperateOption | SelectOption, result?: Partial<ED[T]['Schema']>[]): Promise<void> | void;
checkpoint(context: Cxt, timestamp: number): Promise<number>;
checkpoint<Cxt extends AsyncContext<ED>>(context: Cxt, timestamp: number): Promise<number>;
}

View File

@ -25,22 +25,22 @@ import { translateCheckerInAsyncContext } from './checker';
'stat': 'select',
}; */
export class TriggerExecutor<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED> | SyncContext<ED>> {
export class TriggerExecutor<ED extends EntityDict & BaseEntityDict> {
private counter: number;
private triggerMap: {
[T in keyof ED]?: {
[A: string]: Array<Trigger<ED, T, Cxt>>;
[A: string]: Array<Trigger<ED, T, AsyncContext<ED>>>;
};
};
private triggerNameMap: {
[N: string]: Trigger<ED, keyof ED, Cxt>;
[N: string]: Trigger<ED, keyof ED, AsyncContext<ED>>;
};
private volatileEntities: Array<keyof ED>;
private logger: Logger;
private contextBuilder: (cxtString: string) => Promise<Cxt>;
private contextBuilder: (cxtString: string) => Promise<AsyncContext<ED>>;
constructor(contextBuilder: (cxtString: string) => Promise<Cxt>, logger: Logger = console) {
constructor(contextBuilder: (cxtString: string) => Promise<AsyncContext<ED>>, logger: Logger = console) {
this.contextBuilder = contextBuilder;
this.logger = logger;
this.triggerMap = {};
@ -49,7 +49,7 @@ export class TriggerExecutor<ED extends EntityDict & BaseEntityDict, Cxt extends
this.counter = 0;
}
registerChecker<T extends keyof ED>(checker: Checker<ED, T, Cxt>): void {
registerChecker<T extends keyof ED, Cxt extends AsyncContext<ED>>(checker: Checker<ED, T, Cxt>): void {
const { entity, action, type } = checker;
const triggerName = `${String(entity)}${action}权限检查-${this.counter++}`;
const fn = translateCheckerInAsyncContext(checker);
@ -73,7 +73,7 @@ export class TriggerExecutor<ED extends EntityDict & BaseEntityDict, Cxt extends
return triggers;
}
registerTrigger<T extends keyof ED>(trigger: Trigger<ED, T, Cxt>): void {
registerTrigger<T extends keyof ED, Cxt extends AsyncContext<ED>>(trigger: Trigger<ED, T, Cxt>): void {
// trigger的两种访问方式: by name, by entity/action
if (this.triggerNameMap.hasOwnProperty(trigger.name)) {
throw new Error(`不可有同名的触发器「${trigger.name}`);
@ -95,7 +95,7 @@ export class TriggerExecutor<ED extends EntityDict & BaseEntityDict, Cxt extends
break;
}
}
triggers.splice(idx, 0, trigger);
triggers.splice(idx, 0, trigger as Trigger<ED, T, AsyncContext<ED>>);
}
else if (this.triggerMap[trigger.entity]) {
Object.assign(this.triggerMap[trigger.entity]!, {
@ -126,7 +126,7 @@ export class TriggerExecutor<ED extends EntityDict & BaseEntityDict, Cxt extends
}
}
unregisterTrigger<T extends keyof ED>(trigger: Trigger<ED, T, Cxt>): void {
unregisterTrigger<T extends keyof ED, Cxt extends AsyncContext<ED>>(trigger: Trigger<ED, T, Cxt>): void {
assert(trigger.when !== 'commit' || trigger.strict !== 'makeSure', 'could not remove strict volatile triggers');
const removeTrigger = (action: string) => {
@ -147,7 +147,7 @@ export class TriggerExecutor<ED extends EntityDict & BaseEntityDict, Cxt extends
}
}
private async preCommitTrigger<T extends keyof ED>(
private async preCommitTrigger<T extends keyof ED, Cxt extends AsyncContext<ED>>(
entity: T,
operation: ED[T]['Operation'] | ED[T]['Selection'] & { action: 'select' },
trigger: Trigger<ED, T, Cxt>,
@ -202,7 +202,7 @@ export class TriggerExecutor<ED extends EntityDict & BaseEntityDict, Cxt extends
}
}
preOperation<T extends keyof ED>(
preOperation<T extends keyof ED, Cxt extends AsyncContext<ED>>(
entity: T,
operation: ED[T]['Operation'] | ED[T]['Selection'] & { action: 'select' },
context: Cxt,
@ -258,7 +258,7 @@ export class TriggerExecutor<ED extends EntityDict & BaseEntityDict, Cxt extends
}
}
private onCommit<T extends keyof ED>(
private onCommit<T extends keyof ED, Cxt extends AsyncContext<ED>>(
trigger: Trigger<ED, T, Cxt>, operation: ED[T]['Operation'] | ED[T]['Selection'] & { action: 'select' }, context: AsyncContext<ED>, option: OperateOption) {
return async () => {
await context.begin();
@ -301,7 +301,7 @@ export class TriggerExecutor<ED extends EntityDict & BaseEntityDict, Cxt extends
};
}
private async postCommitTrigger<T extends keyof ED>(
private async postCommitTrigger<T extends keyof ED, Cxt extends AsyncContext<ED>>(
operation: ED[T]['Operation'] | ED[T]['Selection'] & { action: 'select' },
trigger: Trigger<ED, T, Cxt>,
context: AsyncContext<ED>,
@ -310,7 +310,7 @@ export class TriggerExecutor<ED extends EntityDict & BaseEntityDict, Cxt extends
context.on('commit', this.onCommit(trigger, operation, context, option));
}
postOperation<T extends keyof ED>(
postOperation<T extends keyof ED, Cxt extends AsyncContext<ED>>(
entity: T,
operation: ED[T]['Operation'] | ED[T]['Selection'] & { action: 'select' },
context: Cxt,
@ -373,7 +373,7 @@ export class TriggerExecutor<ED extends EntityDict & BaseEntityDict, Cxt extends
}
}
async checkpoint(context: Cxt, timestamp: number): Promise<number> {
async checkpoint<Cxt extends AsyncContext<ED>>(context: Cxt, timestamp: number): Promise<number> {
let result = 0;
for (const entity of this.volatileEntities) {
const rows = await context.select(entity, {