123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- /**
- 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.
- */
-
- const EventEmitter = require('events').EventEmitter;
-
- const MAX_LISTENERS = 20;
-
- const INSTANCE_KEY = Symbol.for('org.apache.cordova.common.CordovaEvents');
-
- let EVENTS_RECEIVER = null;
-
- class CordovaEventEmitter extends EventEmitter {
- /**
- * Sets up current instance to forward emitted events to another EventEmitter
- * instance.
- *
- * @param {EventEmitter} [eventEmitter] The emitter instance to forward
- * events to. Falsy value, when passed, disables forwarding.
- */
- forwardEventsTo (eventEmitter) {
- // If no argument is specified disable events forwarding
- if (!eventEmitter) {
- EVENTS_RECEIVER = undefined;
- return;
- }
-
- if (!(eventEmitter instanceof EventEmitter)) {
- throw new Error('Cordova events can be redirected to another EventEmitter instance only');
- }
-
- // CB-10940 Skipping forwarding to self to avoid infinite recursion.
- // This is the case when the modules are npm-linked.
- if (this !== eventEmitter) {
- EVENTS_RECEIVER = eventEmitter;
- } else {
- // Reset forwarding if we are subscribing to self
- EVENTS_RECEIVER = undefined;
- }
- }
-
- /**
- * Sets up current instance to forward emitted events to another EventEmitter
- * instance.
- *
- * @param {EventEmitter} [eventEmitter] The emitter instance to forward
- * events to. Falsy value, when passed, disables forwarding.
- */
- emit (eventName, ...args) {
- if (EVENTS_RECEIVER) {
- EVENTS_RECEIVER.emit(eventName, ...args);
- }
-
- return super.emit(eventName, ...args);
- }
- }
-
- // This singleton instance pattern is based on the ideas from
- // https://derickbailey.com/2016/03/09/creating-a-true-singleton-in-node-js-with-es6-symbols/
- if (Object.getOwnPropertySymbols(global).indexOf(INSTANCE_KEY) === -1) {
- const events = new CordovaEventEmitter();
- events.setMaxListeners(MAX_LISTENERS);
- global[INSTANCE_KEY] = events;
- }
-
- module.exports = global[INSTANCE_KEY];
|