| 'use strict'; |
| |
| const { |
| ObjectSetPrototypeOf, |
| } = primordials; |
| |
| const { |
| getContinuationPreservedEmbedderData, |
| setContinuationPreservedEmbedderData, |
| } = internalBinding('async_context_frame'); |
| |
| let enabled_; |
| |
| class ActiveAsyncContextFrame extends Map { |
| static get enabled() { |
| return true; |
| } |
| |
| static current() { |
| return getContinuationPreservedEmbedderData(); |
| } |
| |
| static set(frame) { |
| setContinuationPreservedEmbedderData(frame); |
| } |
| |
| static exchange(frame) { |
| const prior = this.current(); |
| this.set(frame); |
| return prior; |
| } |
| |
| static disable(store) { |
| const frame = this.current(); |
| frame?.disable(store); |
| } |
| } |
| |
| function checkEnabled() { |
| const enabled = require('internal/options') |
| .getOptionValue('--async-context-frame'); |
| |
| // If enabled, swap to active prototype so we don't need to check status |
| // on every interaction with the async context frame. |
| if (enabled) { |
| // eslint-disable-next-line no-use-before-define |
| ObjectSetPrototypeOf(AsyncContextFrame, ActiveAsyncContextFrame); |
| } |
| |
| return enabled; |
| } |
| |
| class InactiveAsyncContextFrame extends Map { |
| static get enabled() { |
| enabled_ ??= checkEnabled(); |
| return enabled_; |
| } |
| |
| static current() {} |
| static set(frame) {} |
| static exchange(frame) {} |
| static disable(store) {} |
| } |
| |
| class AsyncContextFrame extends InactiveAsyncContextFrame { |
| constructor(store, data) { |
| super(AsyncContextFrame.current()); |
| this.set(store, data); |
| } |
| |
| disable(store) { |
| this.delete(store); |
| } |
| } |
| |
| module.exports = AsyncContextFrame; |