mirror of
https://github.com/sern-handler/handler
synced 2026-06-06 01:16:55 +00:00
finish ioc transition
This commit is contained in:
@@ -35,6 +35,7 @@
|
||||
"author": "SernDevs",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@sern/ioc": "^1.0.2",
|
||||
"callsites": "^3.1.0",
|
||||
"node-cron": "^3.0.3",
|
||||
"rxjs": "^7.8.0",
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Container } from './container';
|
||||
import { Container } from '@sern/ioc';
|
||||
import * as __Services from '../structures/default-services';
|
||||
import type { Logging } from '../interfaces';
|
||||
import { __add_container, __add_wiredcontainer, __init_container, __swap_container, useContainerRaw } from './global';
|
||||
@@ -34,8 +34,7 @@ const dependencyBuilder = (container: Container) => {
|
||||
* Swap out a preexisting dependency.
|
||||
*/
|
||||
swap(key: keyof Dependencies, v: Insertable) {
|
||||
//todo in container
|
||||
this.add(key, v);
|
||||
this.swap(key, v);
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,77 +0,0 @@
|
||||
/**
|
||||
* A semi-generic container that provides error handling, emitter, and module store.
|
||||
* For the handler to operate correctly, The only user provided dependency needs to be @sern/client
|
||||
*/
|
||||
function hasCallableMethod(obj: object, name: PropertyKey) {
|
||||
//@ts-ignore
|
||||
return typeof obj[name] == 'function';
|
||||
}
|
||||
/**
|
||||
* A Depedency injection container capable of adding singletons, firing hooks, and managing IOC within an application
|
||||
*/
|
||||
export class Container {
|
||||
private __singletons = new Map<PropertyKey, any>();
|
||||
private hooks= new Map<string, Function[]>();
|
||||
private finished_init = false;
|
||||
constructor(options: { autowire: boolean; path?: string }) {
|
||||
if(options.autowire) { /* noop */ }
|
||||
}
|
||||
|
||||
addHook(name: string, callback: Function) {
|
||||
if (!this.hooks.has(name)) {
|
||||
this.hooks.set(name, []);
|
||||
}
|
||||
this.hooks.get(name)!.push(callback);
|
||||
}
|
||||
private registerHooks(hookname: string, insert: object) {
|
||||
|
||||
if(hasCallableMethod(insert, hookname)) {
|
||||
//@ts-ignore
|
||||
this.addHook(hookname, () => insert[hookname]())
|
||||
}
|
||||
}
|
||||
|
||||
addSingleton(key: string, insert: object) {
|
||||
if(typeof insert !== 'object') {
|
||||
throw Error("Inserted object must be an object");
|
||||
}
|
||||
if(!this.__singletons.has(key)) {
|
||||
this.registerHooks('init', insert)
|
||||
this.registerHooks('dispose', insert)
|
||||
this.__singletons.set(key, insert);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
addWiredSingleton(key: string, fn: (c: Record<string,unknown>) => object) {
|
||||
const insert = fn(this.deps());
|
||||
return this.addSingleton(key, insert);
|
||||
}
|
||||
|
||||
async disposeAll() {
|
||||
await this.executeHooks('dispose');
|
||||
this.hooks.delete('dispose');
|
||||
}
|
||||
|
||||
isReady() { return this.finished_init; }
|
||||
hasKey(key: string) { return this.__singletons.has(key); }
|
||||
get<T>(key: PropertyKey) : T|undefined { return this.__singletons.get(key); }
|
||||
|
||||
async ready() {
|
||||
await this.executeHooks('init');
|
||||
this.hooks.delete('init');
|
||||
this.finished_init = true;
|
||||
}
|
||||
|
||||
deps<T extends Record<string,any>>(): T {
|
||||
return Object.fromEntries(this.__singletons) as T
|
||||
}
|
||||
|
||||
async executeHooks(name: string) {
|
||||
const hookFunctions = this.hooks.get(name) || [];
|
||||
for (const hookFunction of hookFunctions) {
|
||||
await hookFunction();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Container } from '@sern/ioc';
|
||||
import { UnpackedDependencies } from '../../types/utility';
|
||||
import { Container } from './container';
|
||||
|
||||
//SIDE EFFECT: GLOBAL DI
|
||||
let containerSubject: Container;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { IntoDependencies } from '../../types/ioc';
|
||||
import type { IntoDependencies } from '../../types/ioc';
|
||||
import { Service as __Service, Services as __Services } from './global'
|
||||
export { makeDependencies } from './base';
|
||||
|
||||
|
||||
@@ -553,6 +553,7 @@ __metadata:
|
||||
resolution: "@sern/handler@workspace:."
|
||||
dependencies:
|
||||
"@faker-js/faker": ^8.0.1
|
||||
"@sern/ioc": ^1.0.2
|
||||
"@types/node": ^20.0.0
|
||||
"@types/node-cron": ^3.0.11
|
||||
"@typescript-eslint/eslint-plugin": 5.58.0
|
||||
@@ -568,6 +569,13 @@ __metadata:
|
||||
languageName: unknown
|
||||
linkType: soft
|
||||
|
||||
"@sern/ioc@npm:^1.0.2":
|
||||
version: 1.0.2
|
||||
resolution: "@sern/ioc@npm:1.0.2"
|
||||
checksum: 7e127e07c3f7eb2eefa77eb5f7c48ba37a259f089cbadfd91e1f6d448a5083cd7f38d4d3c5a2c6efada1b62120d310a3854ba2ba6444fb6a7279a11e2a0b4705
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sinclair/typebox@npm:^0.27.8":
|
||||
version: 0.27.8
|
||||
resolution: "@sinclair/typebox@npm:0.27.8"
|
||||
|
||||
Reference in New Issue
Block a user