@bunt/unit
Advanced tools
Comparing version 0.21.0 to 0.21.1
@@ -1,9 +0,4 @@ | ||
import { DisposableType, IDisposable } from "../Runtime"; | ||
import { Disposer } from "./Disposer"; | ||
export declare class Disposable { | ||
static get size(): number; | ||
static attach(target: IDisposable, disposable: DisposableType): void; | ||
static dispose(target: IDisposable): Promise<void>; | ||
static disposeAll(): Promise<void>; | ||
static resolve(target: IDisposable): Disposer; | ||
import { IDisposable } from "../Runtime"; | ||
export declare abstract class Disposable implements IDisposable { | ||
abstract dispose(): Promise<void>; | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.Disposable = void 0; | ||
const Runtime_1 = require("../Runtime"); | ||
const Disposer_1 = require("./Disposer"); | ||
const collection = new Map(); | ||
class Disposable { | ||
static get size() { | ||
return collection.size; | ||
} | ||
static attach(target, disposable) { | ||
const disposer = this.resolve(target); | ||
disposer.attach(disposable); | ||
} | ||
static dispose(target) { | ||
const disposer = this.resolve(target); | ||
const finish = (error) => { | ||
if ((0, Runtime_1.isRunnable)(target)) { | ||
const heartbeat = target.getHeartbeat(); | ||
heartbeat.destroy(error); | ||
} | ||
}; | ||
return disposer.dispose() | ||
.then(() => finish()) | ||
.catch((error) => finish(error)) | ||
.finally(() => collection.delete(target)); | ||
} | ||
static async disposeAll() { | ||
const pending = []; | ||
for (const target of collection.keys()) { | ||
pending.push(this.dispose(target)); | ||
} | ||
await Promise.allSettled(pending); | ||
} | ||
static resolve(target) { | ||
const disposer = collection.get(target); | ||
if (!disposer) { | ||
const finish = target.dispose; | ||
const newDisposer = new Disposer_1.Disposer(target.constructor.name, () => finish.call(target)); | ||
collection.set(target, newDisposer); | ||
Reflect.defineProperty(target, "dispose", { | ||
value: () => newDisposer.dispose(), | ||
}); | ||
return newDisposer; | ||
} | ||
return disposer; | ||
} | ||
} | ||
exports.Disposable = Disposable; | ||
//# sourceMappingURL=Disposable.js.map |
import { Logger } from "@bunt/util"; | ||
import { DisposableFn, DisposableType, IDisposedHistory } from "../Runtime"; | ||
export declare class Disposer { | ||
import { DisposableType, IDisposable } from "../Runtime"; | ||
export declare abstract class Disposer implements IDisposable { | ||
#private; | ||
protected readonly logger: Logger; | ||
constructor(label: string, finish: DisposableFn); | ||
get label(): string; | ||
get disposed(): boolean; | ||
get history(): IDisposedHistory[]; | ||
attach(disposable: DisposableType): void; | ||
onDispose(disposable: DisposableType): void; | ||
dispose(): Promise<void>; | ||
private disposeAll; | ||
} |
@@ -8,8 +8,2 @@ "use strict"; | ||
}; | ||
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { | ||
if (kind === "m") throw new TypeError("Private method is not writable"); | ||
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); | ||
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); | ||
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; | ||
}; | ||
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { | ||
@@ -20,3 +14,3 @@ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); | ||
}; | ||
var _Disposer_disposable, _Disposer_disposeHistory, _Disposer_state, _Disposer_label; | ||
var _Disposer_disposables; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -27,59 +21,15 @@ exports.Disposer = void 0; | ||
class Disposer { | ||
constructor(label, finish) { | ||
_Disposer_disposable.set(this, []); | ||
_Disposer_disposeHistory.set(this, []); | ||
_Disposer_state.set(this, void 0); | ||
_Disposer_label.set(this, void 0); | ||
this.logger.setLabel(`Disposer(${label})`); | ||
__classPrivateFieldSet(this, _Disposer_label, label, "f"); | ||
__classPrivateFieldGet(this, _Disposer_disposable, "f").push(finish); | ||
constructor() { | ||
_Disposer_disposables.set(this, []); | ||
} | ||
get label() { | ||
return __classPrivateFieldGet(this, _Disposer_label, "f"); | ||
onDispose(disposable) { | ||
this.logger.debug("onDispose(%s)", disposable.constructor.name); | ||
__classPrivateFieldGet(this, _Disposer_disposables, "f").push(disposable); | ||
} | ||
get disposed() { | ||
return !!__classPrivateFieldGet(this, _Disposer_state, "f"); | ||
async dispose() { | ||
this.logger.debug("dispose(%o)", __classPrivateFieldGet(this, _Disposer_disposables, "f").map(({ constructor: { name } }) => name)); | ||
await (0, util_1.safeMap)(__classPrivateFieldGet(this, _Disposer_disposables, "f"), functions_1.dispose); | ||
} | ||
get history() { | ||
return __classPrivateFieldGet(this, _Disposer_disposeHistory, "f"); | ||
} | ||
attach(disposable) { | ||
var _a, _b; | ||
this.logger.debug("add", { label: this.label, target: (_b = (_a = disposable === null || disposable === void 0 ? void 0 : disposable.constructor) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : "Unknown" }); | ||
if (this.disposed) { | ||
(0, functions_1.dispose)(disposable); | ||
return; | ||
} | ||
__classPrivateFieldGet(this, _Disposer_disposable, "f").push(disposable); | ||
} | ||
dispose() { | ||
if (__classPrivateFieldGet(this, _Disposer_state, "f")) { | ||
return __classPrivateFieldGet(this, _Disposer_state, "f"); | ||
} | ||
this.logger.debug("dispose", this.label); | ||
__classPrivateFieldSet(this, _Disposer_state, util_1.AsyncState.acquire(), "f"); | ||
return this.disposeAll(); | ||
} | ||
async disposeAll() { | ||
var _a, _b; | ||
while (__classPrivateFieldGet(this, _Disposer_disposable, "f").length > 0) { | ||
for (const disposable of __classPrivateFieldGet(this, _Disposer_disposable, "f").splice(0).reverse()) { | ||
const date = new Date(); | ||
const target = (_b = (_a = disposable === null || disposable === void 0 ? void 0 : disposable.constructor) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : "Unknown"; | ||
const { label } = this; | ||
try { | ||
await (0, functions_1.dispose)(disposable); | ||
this.logger.debug("dispose", { label, target, date, timeout: Date.now() - date.getTime() }); | ||
__classPrivateFieldGet(this, _Disposer_disposeHistory, "f").push({ label, target, date, timeout: Date.now() - date.getTime() }); | ||
} | ||
catch (error) { | ||
this.logger.warning("dispose", { target, error, date, timeout: Date.now() - date.getTime() }); | ||
__classPrivateFieldGet(this, _Disposer_disposeHistory, "f").push({ label, target, error, date, timeout: Date.now() - date.getTime() }); | ||
} | ||
} | ||
} | ||
util_1.AsyncState.resolve(__classPrivateFieldGet(this, _Disposer_state, "f")); | ||
} | ||
} | ||
_Disposer_disposable = new WeakMap(), _Disposer_disposeHistory = new WeakMap(), _Disposer_state = new WeakMap(), _Disposer_label = new WeakMap(); | ||
_Disposer_disposables = new WeakMap(); | ||
__decorate([ | ||
@@ -86,0 +36,0 @@ util_1.logger |
@@ -1,3 +0,3 @@ | ||
import { Promisify } from "@bunt/util"; | ||
import { DisposableType } from "../Runtime"; | ||
export declare function dispose(disposable: DisposableType): Promisify<void>; | ||
export declare function dispose(disposable: DisposableType): Promise<void>; | ||
export declare function disposeAll(disposables: DisposableType[]): Promise<void>; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.dispose = void 0; | ||
exports.disposeAll = exports.dispose = void 0; | ||
const util_1 = require("@bunt/util"); | ||
const Disposable_1 = require("./Disposable"); | ||
function dispose(disposable) { | ||
if ((0, util_1.isFunction)(disposable)) { | ||
return disposable(); | ||
const Runtime_1 = require("../Runtime"); | ||
async function dispose(disposable) { | ||
const { constructor: { name } } = disposable; | ||
const perf = Runtime_1.SystemLogger.perf("disposed %s", name); | ||
try { | ||
if ((0, util_1.isFunction)(disposable)) { | ||
Runtime_1.SystemLogger.debug("dispose %s()", name); | ||
return Promise.resolve(disposable()); | ||
} | ||
if ((0, Runtime_1.isRunnable)(disposable)) { | ||
Runtime_1.SystemLogger.debug("destroy %s().getHeartbeat()", name); | ||
disposable | ||
.getHeartbeat() | ||
.destroy(); | ||
} | ||
Runtime_1.SystemLogger.debug("%s.dispose()", name); | ||
await disposable.dispose(); | ||
} | ||
return Disposable_1.Disposable.dispose(disposable); | ||
catch (error) { | ||
Runtime_1.SystemLogger.error((0, util_1.toError)(error, "Unexpected error").message, error); | ||
} | ||
finally { | ||
perf(); | ||
} | ||
} | ||
exports.dispose = dispose; | ||
async function disposeAll(disposables) { | ||
const ops = []; | ||
for (const disposable of disposables) { | ||
ops.push(Promise.resolve(dispose(disposable))); | ||
} | ||
await (0, util_1.all)(ops); | ||
} | ||
exports.disposeAll = disposeAll; | ||
//# sourceMappingURL=functions.js.map |
@@ -42,3 +42,3 @@ "use strict"; | ||
} | ||
return (value !== null && value !== void 0 ? value : opt); | ||
return (value ?? opt); | ||
} | ||
@@ -45,0 +45,0 @@ } |
@@ -8,8 +8,2 @@ "use strict"; | ||
}; | ||
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { | ||
if (kind === "m") throw new TypeError("Private method is not writable"); | ||
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); | ||
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); | ||
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; | ||
}; | ||
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { | ||
@@ -20,3 +14,3 @@ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); | ||
}; | ||
var _Heartbeat_pending; | ||
var _Heartbeat_life; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -29,5 +23,4 @@ exports.Heartbeat = void 0; | ||
constructor(label, disposer) { | ||
_Heartbeat_pending.set(this, void 0); | ||
_Heartbeat_life.set(this, new util_1.Defer()); | ||
this.logger.debug("create", { label }); | ||
__classPrivateFieldSet(this, _Heartbeat_pending, util_1.AsyncState.acquire(), "f"); | ||
if (disposer) { | ||
@@ -38,3 +31,3 @@ disposer((error) => this.destroy(error)); | ||
get beats() { | ||
return !util_1.AsyncState.isReleased(__classPrivateFieldGet(this, _Heartbeat_pending, "f")); | ||
return !__classPrivateFieldGet(this, _Heartbeat_life, "f").settled; | ||
} | ||
@@ -48,4 +41,6 @@ /** | ||
static create(target, disposer) { | ||
var _a; | ||
const heartbeat = (_a = registry.get(target)) !== null && _a !== void 0 ? _a : new Heartbeat(target.constructor.name, disposer); | ||
const heartbeat = registry.get(target) ?? new Heartbeat(target.constructor.name, (resolve) => { | ||
registry.delete(target); | ||
disposer?.(resolve); | ||
}); | ||
if (!registry.has(target)) { | ||
@@ -58,24 +53,26 @@ registry.set(target, heartbeat); | ||
if ((0, internal_1.isRunnable)(runnable)) { | ||
const heartbeat = runnable.getHeartbeat(); | ||
return heartbeat.watch(); | ||
return runnable | ||
.getHeartbeat() | ||
.watch(); | ||
} | ||
} | ||
static destroy(target) { | ||
const heartbeat = registry.get(target); | ||
heartbeat === null || heartbeat === void 0 ? void 0 : heartbeat.destroy(); | ||
registry | ||
.get(target) | ||
?.destroy(); | ||
} | ||
destroy(error) { | ||
if (!this.beats) { | ||
if (__classPrivateFieldGet(this, _Heartbeat_life, "f").settled) { | ||
return; | ||
} | ||
if (error) { | ||
return util_1.AsyncState.reject(__classPrivateFieldGet(this, _Heartbeat_pending, "f"), error); | ||
return __classPrivateFieldGet(this, _Heartbeat_life, "f").reject(error); | ||
} | ||
util_1.AsyncState.resolve(__classPrivateFieldGet(this, _Heartbeat_pending, "f")); | ||
__classPrivateFieldGet(this, _Heartbeat_life, "f").resolve(); | ||
} | ||
watch() { | ||
return __classPrivateFieldGet(this, _Heartbeat_pending, "f"); | ||
return Promise.resolve(__classPrivateFieldGet(this, _Heartbeat_life, "f")); | ||
} | ||
} | ||
_Heartbeat_pending = new WeakMap(); | ||
_Heartbeat_life = new WeakMap(); | ||
__decorate([ | ||
@@ -82,0 +79,0 @@ util_1.logger |
/// <reference types="node" /> | ||
import { Promisify } from "@bunt/util"; | ||
import { Logger, Promisify } from "@bunt/util"; | ||
import { IDisposable, IRunnable } from "./interfaces"; | ||
@@ -8,1 +8,2 @@ export declare const Signals: NodeJS.Signals[]; | ||
export declare function main(...chain: (() => Promisify<unknown>)[]): void; | ||
export declare const SystemLogger: Logger; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.main = exports.isRunnable = exports.isDisposable = exports.Signals = void 0; | ||
exports.SystemLogger = exports.main = exports.isRunnable = exports.isDisposable = exports.Signals = void 0; | ||
const util_1 = require("@bunt/util"); | ||
@@ -21,2 +21,3 @@ const Runtime_1 = require("./Runtime"); | ||
exports.main = main; | ||
exports.SystemLogger = new util_1.Logger("System"); | ||
//# sourceMappingURL=internal.js.map |
import { Logger, Promisify } from "@bunt/util"; | ||
import { Disposer } from "../Dispose"; | ||
import { Heartbeat } from "./Heartbeat"; | ||
import { DisposableFn, IDisposable } from "./interfaces"; | ||
export declare class Runtime implements IDisposable { | ||
import { DisposableFn } from "./interfaces"; | ||
export declare class Runtime extends Disposer { | ||
readonly logger: Logger; | ||
@@ -16,5 +17,4 @@ protected readonly queue: Heartbeat[]; | ||
static createQueue(chain: (() => Promisify<unknown>)[]): Promise<unknown>[]; | ||
dispose(): Promise<void>; | ||
private watch; | ||
private handle; | ||
} |
@@ -16,4 +16,5 @@ "use strict"; | ||
const ENV = process.env.NODE_ENV || "production"; | ||
class Runtime { | ||
class Runtime extends Dispose_1.Disposer { | ||
constructor() { | ||
super(); | ||
this.queue = []; | ||
@@ -29,3 +30,4 @@ this.created = new Date(); | ||
static on(event, callback) { | ||
Dispose_1.Disposable.attach(ref.ensure(), callback); | ||
const runtime = ref.ensure(); | ||
runtime.onDispose(callback); | ||
} | ||
@@ -46,4 +48,4 @@ static isDebugEnable() { | ||
const queue = this.createQueue(chain); | ||
return ref.create(() => new Runtime()) | ||
.watch(queue); | ||
const runtime = ref.create(() => new Runtime()); | ||
return runtime.watch(queue); | ||
} | ||
@@ -57,10 +59,2 @@ static createQueue(chain) { | ||
} | ||
async dispose() { | ||
this.logger.info("dispose"); | ||
setImmediate(async () => { | ||
await Dispose_1.Disposable.disposeAll() | ||
.finally(() => this.logger.info("exit")) | ||
.finally(() => process.nextTick(() => process.exit(0))); | ||
}); | ||
} | ||
async watch(chain) { | ||
@@ -92,3 +86,3 @@ const finish = this.logger.perf("run"); | ||
if ((0, internal_1.isDisposable)(object)) { | ||
Dispose_1.Disposable.attach(this, object); | ||
this.onDispose(object); | ||
} | ||
@@ -95,0 +89,0 @@ } |
{ | ||
"name": "@bunt/unit", | ||
"version": "0.21.0", | ||
"version": "0.21.1", | ||
"keywords": [ | ||
@@ -29,6 +29,6 @@ "typescript" | ||
"dependencies": { | ||
"@bunt/util": "^0.21.0" | ||
"@bunt/util": "^0.21.1" | ||
}, | ||
"license": "MIT", | ||
"gitHead": "b392d4e501e82223a764537d758d0519c087eb0d" | ||
"gitHead": "d17cc6a86e22560c30e673d9425d4ca023e53894" | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
74
57753
915
Updated@bunt/util@^0.21.1