/*!
 *
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

import Context from '../../trace/context/Context';
import SpanContext from '../../trace/context/SpanContext';
import { executionAsyncId, createHook } from 'async_hooks';

class ContextManager {
  contextKeyedByAsyncId: { [asyncId: number]: Context } = {};

  constructor() {
    createHook({
      destroy: (asyncId: number) => {
        delete this.contextKeyedByAsyncId[asyncId];
      },
    }).enable();
  }

  get current(): Context {
    const thisAsyncId = executionAsyncId();

    this.contextKeyedByAsyncId[thisAsyncId] = this.contextKeyedByAsyncId[thisAsyncId] || new SpanContext(thisAsyncId);

    return this.contextKeyedByAsyncId[thisAsyncId];
  }
}

export default new ContextManager();
