Skip to content

Commit 045487d

Browse files
committed
Decouple event bus from router. Make Event bus lazy
1 parent 40503f9 commit 045487d

File tree

11 files changed

+71
-84
lines changed

11 files changed

+71
-84
lines changed

@types/namespace.d.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ import {
9393
import { RestService as TRestService } from "./services/rest/rest.js";
9494
import { ServiceProvider as TServiceProvider } from "./interface.ts";
9595
import { NgModelController as TNgModelController } from "./directive/model/model.js";
96-
import { RouterProvider } from "./router/router.ts";
96+
import { RouterProvider as TRouterProvider } from "./router/router.ts";
9797
import { TransitionProvider as TTransitionProvider } from "./router/transition/transition-service.js";
9898
import { AnimateProvider as TAnimateProvider } from "./animations/animate.js";
9999
import { UrlService as TUrlService } from "./router/url/url-service.js";
@@ -142,6 +142,7 @@ declare global {
142142
type SceProvider = TSceProvider;
143143
type SceDelegateProvider = TSceDelegateProvider;
144144
type TransitionProvider = TTransitionProvider;
145+
type RouterProvider = TRouterProvider;
145146
type AnchorScrollService = TAnchorScrollService;
146147
type AnimateService = TAnimateService;
147148
type CompileService = TCompileFn;
@@ -162,7 +163,7 @@ declare global {
162163
type PubSubService = TPubSub;
163164
type RootElementService = Element;
164165
type RootScopeService = TScope & Record<string, any>;
165-
type RouterService = RouterProvider;
166+
type RouterService = TRouterProvider;
166167
type StateService = TStateProvider;
167168
type StateRegistryService = TStateRegistryProvider;
168169
type SseService = TSseService;

@types/router/state/state-service.d.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,15 @@ export class StateProvider {
77
static $inject: string[];
88
/**
99
*
10-
* @param {ng.RouterService} globals
11-
* @param {*} transitionService
10+
* @param {ng.RouterProvider} globals
11+
* @param {ng.TransitionProvider} transitionService
12+
* @param {ng.ExceptionHandlerProvider} exceptionHandlerProvider
1213
*/
13-
constructor(globals: ng.RouterService, transitionService: any);
14+
constructor(
15+
globals: ng.RouterProvider,
16+
transitionService: ng.TransitionProvider,
17+
exceptionHandlerProvider: ng.ExceptionHandlerProvider,
18+
);
1419
/**
1520
* The latest successful state parameters
1621
*
@@ -30,14 +35,15 @@ export class StateProvider {
3035
*/
3136
get $current(): import("./state-object.js").StateObject;
3237
globals: import("../router.js").RouterProvider;
33-
transitionService: any;
38+
transitionService: import("../transition/transition-service.js").TransitionProvider;
3439
stateRegistry: any;
3540
/** @type {ng.UrlService} */
3641
urlService: ng.UrlService;
3742
/** @type {ng.InjectorService} */
3843
$injector: ng.InjectorService;
3944
invalidCallbacks: any[];
40-
_defaultErrorHandler: ($error$: any) => never;
45+
/** @type {ng.ExceptionHandlerService} */
46+
_defaultErrorHandler: ng.ExceptionHandlerService;
4147
$get: (
4248
| string
4349
| (($injector: ng.InjectorService, $url: any) => StateProvider)

@types/router/transition/transition.d.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,20 @@ export class Transition implements HookRegistry {
1616
* @param {Array<import('../path/path-node.js').PathNode>} fromPath The path of [[PathNode]]s from which the transition is leaving. The last node in the `fromPath`
1717
* encapsulates the "from state".
1818
* @param {import('../state/target-state.js').TargetState} targetState The target state and parameters being transitioned to (also, the transition options)
19-
* @param {ng.TransitionService} transitionService The [[TransitionService]] instance
19+
* @param {ng.TransitionProvider} transitionService The [[TransitionService]] instance
2020
* @param {ng.RouterService} globals
2121
*/
2222
constructor(
2323
fromPath: Array<import("../path/path-node.js").PathNode>,
2424
targetState: import("../state/target-state.js").TargetState,
25-
transitionService: ng.TransitionService,
25+
transitionService: ng.TransitionProvider,
2626
globals: ng.RouterService,
2727
);
2828
/**
2929
* @type {import('../router.js').RouterProvider}
3030
*/
3131
_globals: import("../router.js").RouterProvider;
32-
_transitionService: ng.TransitionService;
32+
_transitionService: import("./transition-service.js").TransitionProvider;
3333
_deferred: any;
3434
/**
3535
* This promise is resolved or rejected based on the outcome of the Transition.

@types/services/pubsub/pubsub.d.ts

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,32 @@
33
* @implements {ng.ServiceProvider}
44
*/
55
export class PubSubProvider implements ng.ServiceProvider {
6+
static $inject: string[];
7+
/**
8+
* @param {ng.ExceptionHandlerProvider} $exceptionHandler
9+
* @param {ng.ServiceProvider} angularProvider
10+
*/
11+
constructor(
12+
$exceptionHandler: ng.ExceptionHandlerProvider,
13+
angularProvider: ng.ServiceProvider,
14+
);
615
/**
716
* @type {PubSub}
817
*/
918
eventBus: PubSub;
10-
$get: (
11-
| string
12-
| (($exceptionHandler: ng.ExceptionHandlerService) => PubSub)
13-
)[];
19+
$get: () => PubSub;
1420
}
1521
export class PubSub {
22+
/**
23+
* @param {ng.ExceptionHandlerService} $exceptionHandler
24+
*/
25+
constructor($exceptionHandler: ng.ExceptionHandlerService);
1626
/** @private {Object<string, Array<{fn: Function, context: any}>>} */
1727
private _topics;
1828
/** @private */
1929
private _disposed;
20-
/** @public @type {ng.ExceptionHandlerService | undefined} */
21-
public $exceptionHandler: ng.ExceptionHandlerService | undefined;
30+
/** @public @type {ng.ExceptionHandlerService} */
31+
public $exceptionHandler: ng.ExceptionHandlerService;
2232
/**
2333
* Set instance to initial state
2434
*/
@@ -73,5 +83,3 @@ export class PubSub {
7383
*/
7484
publish(topic: string, ...args: any[]): boolean;
7585
}
76-
/** @private */
77-
export const EventBus: PubSub;

src/angular.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import { createInjector } from "./core/di/injector.js";
1616
import { NgModule } from "./core/di/ng-module/ng-module.js";
1717
import { registerNgModule } from "./ng.js";
1818
import { unnestR } from "./shared/common.js";
19-
import { EventBus } from "./services/pubsub/pubsub.js";
2019
import { $injectTokens as $t } from "./injection-tokens.js";
2120
import { annotate } from "./core/di/di.js";
2221
import { validateIsString } from "./shared/validate.js";
@@ -38,7 +37,7 @@ export class Angular {
3837
this._bootsrappedModules = [];
3938

4039
/** @public @type {ng.PubSubService} */
41-
this.$eventBus = EventBus;
40+
this.$eventBus;
4241

4342
/** @public @type {ng.InjectorService} */
4443
this.$injector;

src/namespace.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ import {
9898
import { RestService as TRestService } from "./services/rest/rest.js";
9999
import { ServiceProvider as TServiceProvider } from "./interface.ts";
100100
import { NgModelController as TNgModelController } from "./directive/model/model.js";
101-
import { RouterProvider } from "./router/router.ts";
101+
import { RouterProvider as TRouterProvider } from "./router/router.ts";
102102
import { TransitionProvider as TTransitionProvider } from "./router/transition/transition-service.js";
103103
import { AnimateProvider as TAnimateProvider } from "./animations/animate.js";
104104
import { UrlService as TUrlService } from "./router/url/url-service.js";
@@ -154,6 +154,7 @@ declare global {
154154
export type SceProvider = TSceProvider;
155155
export type SceDelegateProvider = TSceDelegateProvider;
156156
export type TransitionProvider = TTransitionProvider;
157+
export type RouterProvider = TRouterProvider;
157158

158159
// Services
159160
export type AnchorScrollService = TAnchorScrollService;
@@ -176,7 +177,7 @@ declare global {
176177
export type PubSubService = TPubSub;
177178
export type RootElementService = Element;
178179
export type RootScopeService = TScope & Record<string, any>;
179-
export type RouterService = RouterProvider;
180+
export type RouterService = TRouterProvider;
180181
export type StateService = TStateProvider;
181182
export type StateRegistryService = TStateRegistryProvider;
182183
export type SseService = TSseService;

src/router/state/state-service.js

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import { TargetState } from "./target-state.js";
1414
import { Param } from "../params/param.js";
1515
import { Glob } from "../glob/glob.js";
1616
import { lazyLoadState } from "../hooks/lazy-load.js";
17-
import { EventBus } from "../../services/pubsub/pubsub.js";
1817
import { $injectTokens, provider } from "../../injection-tokens.js";
1918

2019
const stdErr = minErr("$stateProvider");
@@ -55,14 +54,16 @@ export class StateProvider {
5554
/* @ignore */ static $inject = provider([
5655
$injectTokens._router,
5756
$injectTokens._transitions,
57+
$injectTokens._exceptionHandler,
5858
]);
5959

6060
/**
6161
*
62-
* @param {ng.RouterService} globals
63-
* @param {*} transitionService
62+
* @param {ng.RouterProvider} globals
63+
* @param {ng.TransitionProvider} transitionService
64+
* @param {ng.ExceptionHandlerProvider} exceptionHandlerProvider
6465
*/
65-
constructor(globals, transitionService) {
66+
constructor(globals, transitionService, exceptionHandlerProvider) {
6667
this.globals = globals;
6768
this.transitionService = transitionService;
6869
this.stateRegistry = undefined;
@@ -73,19 +74,8 @@ export class StateProvider {
7374
this.$injector = undefined;
7475
this.invalidCallbacks = [];
7576

76-
this._defaultErrorHandler = function $defaultErrorHandler($error$) {
77-
if ($error$ instanceof Error && $error$.stack) {
78-
throw $error$;
79-
} else if ($error$ instanceof Rejection) {
80-
throw new Error($error$.toString());
81-
} else {
82-
throw new Error($error$);
83-
}
84-
};
85-
86-
EventBus.subscribe("$stateService:defaultErrorHandler", (error) =>
87-
this.defaultErrorHandler()(error),
88-
);
77+
/** @type {ng.ExceptionHandlerService} */
78+
this._defaultErrorHandler = exceptionHandlerProvider.handler;
8979
}
9080

9181
$get = [

src/router/transition/transition.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export class Transition {
4747
* @param {Array<import('../path/path-node.js').PathNode>} fromPath The path of [[PathNode]]s from which the transition is leaving. The last node in the `fromPath`
4848
* encapsulates the "from state".
4949
* @param {import('../state/target-state.js').TargetState} targetState The target state and parameters being transitioned to (also, the transition options)
50-
* @param {ng.TransitionService} transitionService The [[TransitionService]] instance
50+
* @param {ng.TransitionProvider} transitionService The [[TransitionService]] instance
5151
* @param {ng.RouterService} globals
5252
*/
5353
constructor(fromPath, targetState, transitionService, globals) {

src/services/log/log.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ export class LogProvider {
3232
arg.message && arg.stack.indexOf(arg.message) === -1
3333
? `Error: ${arg.message}\n${arg.stack}`
3434
: arg.stack;
35-
} else if (arg.sourceURL) {
36-
arg = `${arg.message}\n${arg.sourceURL}:${arg.line}`;
3735
}
3836
}
3937

src/services/pubsub/pubsub.js

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,44 @@
1-
import { $injectTokens } from "../../injection-tokens.js";
1+
import { $injectTokens, provider } from "../../injection-tokens.js";
22

33
/**
44
* Configurable provider for an injectable event bus
55
* @implements {ng.ServiceProvider}
66
*/
77
export class PubSubProvider {
8-
constructor() {
8+
static $inject = provider([
9+
$injectTokens._exceptionHandler,
10+
$injectTokens._angular,
11+
]);
12+
13+
/**
14+
* @param {ng.ExceptionHandlerProvider} $exceptionHandler
15+
* @param {ng.ServiceProvider} angularProvider
16+
*/
17+
constructor($exceptionHandler, angularProvider) {
918
/**
1019
* @type {PubSub}
1120
*/
12-
this.eventBus = EventBus;
21+
this.eventBus = new PubSub($exceptionHandler.handler);
22+
/** @type {ng.Angular} */ (angularProvider.$get()).$eventBus =
23+
this.eventBus;
1324
}
1425

15-
$get = [
16-
$injectTokens._exceptionHandler,
17-
/**
18-
* @param {ng.ExceptionHandlerService} $exceptionHandler
19-
* @returns {PubSub}
20-
*/
21-
($exceptionHandler) => {
22-
this.eventBus.$exceptionHandler = $exceptionHandler;
23-
24-
return this.eventBus;
25-
},
26-
];
26+
$get = () => this.eventBus;
2727
}
2828

2929
export class PubSub {
30-
constructor() {
30+
/**
31+
* @param {ng.ExceptionHandlerService} $exceptionHandler
32+
*/
33+
constructor($exceptionHandler) {
3134
/** @private {Object<string, Array<{fn: Function, context: any}>>} */
3235
this._topics = Object.create(null);
3336

3437
/** @private */
3538
this._disposed = false;
3639

37-
/** @public @type {ng.ExceptionHandlerService | undefined} */
38-
this.$exceptionHandler = undefined;
40+
/** @public @type {ng.ExceptionHandlerService} */
41+
this.$exceptionHandler = $exceptionHandler;
3942
}
4043

4144
/**
@@ -183,6 +186,3 @@ export class PubSub {
183186
return true;
184187
}
185188
}
186-
187-
/** @private */
188-
export const EventBus = new PubSub();

0 commit comments

Comments
 (0)