依赖文件
This commit is contained in:
+81
@@ -0,0 +1,81 @@
|
||||
/**
|
||||
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];
|
||||
Reference in New Issue
Block a user