UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

1 lines 7.7 kB
{"version":3,"sources":["../../../packages/core/data/disposable.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;CACnB;AAED,oBAAY,kBAAkB,GAAG,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC;AAE7D,MAAM,WAAW,0BAA0B;IACvC,CAAC,WAAW,EAAE,kBAAkB,EAAE,GAAG,mBAAmB,CAAC;IACzD,CAAC,UAAU,EAAE,kBAAkB,GAAG,mBAAmB,CAAC;CACzD;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAChC;;;;OAIG;IACH,kBAAkB,EAAE,0BAA0B,CAAC;CAClD;AAED,MAAM,WAAW,eAAgB,SAAQ,mBAAmB;IACxD;;;;OAIG;IACH,mBAAmB,IAAI,yBAAyB,CAAC;CACpD;AAED,MAAM,WAAW,yBAA0B,SAAQ,UAAU,EAAE,eAAe;IAC1E;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC;CACzB;AAqBD;;;GAGG;AACH,qBAAa,0BAA2B,YAAW,yBAAyB;IACxE,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,QAAQ,CAAoB;IAEpC;;OAEG;IACI,UAAU,IAAI,OAAO;IAI5B;;OAEG;IACI,kBAAkB,CAAC,UAAU,EAAE,GAAG,GAAG,0BAA0B;IAetE;;OAEG;IACI,mBAAmB,IAAI,yBAAyB;IAOvD;;;OAGG;IACI,OAAO,IAAI,IAAI;IA4BtB,OAAO,CAAC,yBAAyB;IAajC,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,0BAA0B;CAWrC;AAED;;GAEG;AACH,qBAAa,QAAS,YAAW,UAAU;IACvC,OAAO,CAAC,QAAQ,CAAa;IAE7B;;;;OAIG;gBACS,QAAQ,EAAE,MAAM,IAAI;IAIhC;;OAEG;IACI,OAAO,IAAI,IAAI;CAGzB","file":"disposable.d.ts","sourcesContent":["/**\r\n * An object that is disposable.\r\n */\r\nexport interface Disposable {\r\n /**\r\n * A function called on the object when it is disposed.\r\n */\r\n dispose(): void;\r\n}\r\n\r\nexport type ActionOrDisposable = MsftSme.Action | Disposable;\r\n\r\nexport interface RegisterForDisposeFunction {\r\n (disposables: ActionOrDisposable[]): LifetimeManagerBase;\r\n (disposable: ActionOrDisposable): LifetimeManagerBase;\r\n}\r\n\r\n/**\r\n * An object that can limit the lifetime of other objects. When a LifetimeManager object\r\n * is disposed, it will dispose all other objects that were registered for disposal.\r\n */\r\nexport interface LifetimeManagerBase {\r\n /**\r\n * Registers an object to be disposed. It will throw if the object doesn't have dispose method.\r\n *\r\n * @param disposable An object to be disposed once the LifetimeManager object itself is disposed.\r\n */\r\n registerForDispose: RegisterForDisposeFunction;\r\n}\r\n\r\nexport interface LifetimeManager extends LifetimeManagerBase {\r\n /**\r\n * Create a createChildLifetime to localize the LifetimeManager.\r\n * It will provide the function on tracking who create it and when it dispose,\r\n * it will remove itself from Container's lifetimeManager\r\n */\r\n createChildLifetime(): DisposableLifetimeManager;\r\n}\r\n\r\nexport interface DisposableLifetimeManager extends Disposable, LifetimeManager {\r\n /**\r\n * A value indicating whether or not the lifetime is disposed.\r\n */\r\n isDisposed(): boolean;\r\n}\r\n\r\nfunction checkDisposeFunc(disposable: any, executeDispose: boolean) {\r\n if (typeof disposable.dispose === 'function') {\r\n // NOTE : Don't null the lifetime manager or in race conditions registerForDispose() will throw a\r\n // null exception. Internal logic in the triggerable lifetime manager handles being disposed\r\n // and having disposables added to it.\r\n if (executeDispose) {\r\n disposable.dispose();\r\n }\r\n } else if (typeof disposable === 'function') {\r\n if (executeDispose) {\r\n disposable();\r\n }\r\n } else {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * An object that tracks and invokes disposal callbacks. This can be used\r\n * in other classes that wish to implement LifetimeManager.\r\n */\r\nexport class TriggerableLifetimeManager implements DisposableLifetimeManager {\r\n private disposables: Disposable[] = [];\r\n private isDisposedInternal = false;\r\n private isDisposing = false;\r\n private container: TriggerableLifetimeManager = null;\r\n private children: Disposable[] = [];\r\n\r\n /**\r\n * Gets a value indicating whether or not the lifetime is disposed.\r\n */\r\n public isDisposed(): boolean {\r\n return this.isDisposedInternal;\r\n }\r\n\r\n /**\r\n * See interface.\r\n */\r\n public registerForDispose(disposable: any): TriggerableLifetimeManager {\r\n let disposables: Disposable[];\r\n if (Array.isArray(disposable)) {\r\n disposables = disposable;\r\n } else {\r\n disposables = [disposable];\r\n }\r\n\r\n disposables.forEach((item) => {\r\n this.registerForDisposeInternal(item);\r\n });\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * See interface.\r\n */\r\n public createChildLifetime(): DisposableLifetimeManager {\r\n const triggerableLifeTimeManager = new TriggerableLifetimeManager();\r\n triggerableLifeTimeManager.container = this;\r\n this.children.push(triggerableLifeTimeManager);\r\n return triggerableLifeTimeManager;\r\n }\r\n\r\n /**\r\n * Causes the instance to regard itself as disposed, and to trigger any\r\n * callbacks that were already registered.\r\n */\r\n public dispose(): void {\r\n if (!this.isDisposedInternal) {\r\n this.isDisposedInternal = true;\r\n this.isDisposing = true;\r\n\r\n // remove all children and _disposable\r\n [this.disposables, this.children].forEach((disposables) => {\r\n while (disposables.length) {\r\n const disposable = disposables.pop();\r\n try {\r\n checkDisposeFunc(disposable, true);\r\n } catch (err) {\r\n // ignore errors when running the check dispose function\r\n }\r\n }\r\n });\r\n\r\n // check if we need to remove self from container\r\n const container = this.container;\r\n if (container) {\r\n this.container = null; // break the back link\r\n container.unregisterChildForDispose(this);\r\n }\r\n\r\n this.isDisposing = false;\r\n }\r\n }\r\n\r\n private unregisterChildForDispose(disposable: Disposable) {\r\n const children = this.children;\r\n if (!this.isDisposing) {\r\n const index = children.lastIndexOf(disposable);\r\n if (index === (children.length - 1)) {\r\n children.pop();\r\n } else {\r\n // take it self out of the container.\r\n children.splice(index, 1);\r\n }\r\n }\r\n }\r\n\r\n private isRegistered(disposable: Disposable) {\r\n return (this.disposables.lastIndexOf(disposable) >= 0 || this.children.lastIndexOf(disposable) >= 0);\r\n }\r\n\r\n private registerForDisposeInternal(disposable: Disposable): void {\r\n let valid = !this.isDisposedInternal;\r\n\r\n if (!disposable) {\r\n valid = false;\r\n }\r\n\r\n if (valid) {\r\n this.disposables.push(disposable);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Auto disposer class used with lifetime manager.\r\n */\r\nexport class Disposer implements Disposable {\r\n private callback: () => void;\r\n\r\n /**\r\n * Initializes a new instance of the Disposer class.\r\n *\r\n * @param callback the callback function.\r\n */\r\n constructor(callback: () => void) {\r\n this.callback = callback;\r\n }\r\n\r\n /**\r\n * dispose function called when lifetime is gone.\r\n */\r\n public dispose(): void {\r\n this.callback();\r\n }\r\n}\r\n"]}