Commit eadddc08 authored by nanahira's avatar nanahira

fix subscribe

parent bf361ba9
......@@ -14,7 +14,7 @@ import {
} from './utility';
import { DoRegister } from './registry';
import _ from 'lodash';
import { isObservable, Observable } from 'rxjs';
import { isObservable, Observable, of } from 'rxjs';
export interface DoRegisterResult<T> extends DoRegister.Config {
key: keyof T & string;
......@@ -82,34 +82,37 @@ export class Registrar<T = any> {
ctx: Context,
cb: ContextFunction<R>,
layers: ContextCallbackLayer[],
) {
): Observable<R extends Observable<infer U> ? U : Awaited<R>> {
const rest = [...layers];
const layer = rest.pop();
return new Observable<R extends Observable<infer U> ? U : Awaited<R>>(
(subscriber) => {
layer(ctx, async (nextCtx) => {
if (!rest.length) {
const result = cb(nextCtx);
if (result instanceof Promise) {
try {
subscriber.next(await result);
} catch (e) {
subscriber.error(e);
}
} else if (isObservable(result)) {
(result as Observable<any>).subscribe({
next: (value) => subscriber.next(value),
error: (error) => subscriber.error(error),
});
} else {
subscriber.next(result as any);
if (!layer) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
return of(cb(ctx));
}
return new Observable((subscriber) => {
layer(ctx, async (nextCtx) => {
if (!rest.length) {
const result = cb(nextCtx);
if (result instanceof Promise) {
try {
subscriber.next(await result);
} catch (e) {
subscriber.error(e);
}
} else if (isObservable(result)) {
(result as Observable<any>).subscribe({
next: (value) => subscriber.next(value),
error: (error) => subscriber.error(error),
});
} else {
this.runLayersWith(nextCtx, cb, rest).subscribe(subscriber);
subscriber.next(result as any);
}
});
},
);
} else {
this.runLayersWith(nextCtx, cb, rest).subscribe(subscriber);
}
});
});
}
runLayers<R>(ctx: Context, cb: ContextFunction<R>, key?: keyof T) {
......
......@@ -149,11 +149,13 @@ describe('Register', () => {
});
it('should work with layers', () => {
registrar.runLayers(
app,
(ctx) => registrar.register(app, 'unUnderwear'),
'unUnderwear',
);
registrar
.runLayers(
app,
(ctx) => registrar.register(app, 'unUnderwear'),
'unUnderwear',
)
.subscribe();
expect(app['foo']).toBe(1);
expect(app['bar']).toBe(2);
});
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment