UNPKG

relution-sdk

Version:

Relution Software Development Kit for TypeScript and JavaScript

200 lines 28.2 kB
/* * @file push/cordova.ts * Relution SDK * * Created by Thomas Beckmann on 08.07.2016 * Copyright 2016 M-Way Solutions GmbH * * Licensed 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. */ /** * @module push */ /** */ "use strict"; var Q = require('q'); var diag = require('../core/diag'); var device = require('../core/device'); var init = require('../core/init'); var push = require('./push'); // just keep track of plugin instance and callback var pushPlugin; var pushCallback; // executed when the pushNotification plugin fails internally. function onPushNotificationError(error) { Q(pushCallback(error)).done(undefined, function (e) { diag.debug.assert(e === error, 'push callback failed: ' + e.message); }); } // following sets up a promise of the registration var resolveRegistrationEventResponse; var rejectRegistrationEventResponse; var promiseRegistrationEventResponse; // executed when registration at 3rd party push server succeeded and a registration was issued, // or a registration is renewed meaning this may be called several times. function onPushNotificationRegistration(response) { if (resolveRegistrationEventResponse) { diag.debug.assert(!!rejectRegistrationEventResponse); resolveRegistrationEventResponse(response); resolveRegistrationEventResponse = undefined; rejectRegistrationEventResponse = undefined; } else { promiseRegistrationEventResponse = Q.resolve(response); } return promiseRegistrationEventResponse.done(); } // executed on each incoming push notification message calling the pushCallback in an // error-agnostic fashion. function onPushNotificationNotification(response) { // assignments avoiding changes of implementation state during promise chain var plugin = pushPlugin; var callback = pushCallback; return Q(response).then(function (r) { diag.debug.assert(r === response, 'just begins promise chain avoiding explicit try-catch'); return callback(undefined, response) || response; }).then(function (r) { diag.debug.assert(r === response, 'push callback must respond same object'); return Q.Promise(function (resolve, reject) { try { if ('notId' in response.additionalData) { plugin.finish(resolve, reject, response.additionalData.notId); } else { plugin.finish(resolve, reject); } } catch (error) { reject(error); } }); }).done(undefined, function (error) { return Q(callback(error, response) || response).catch(function (e) { diag.debug.assert(e === error, 'push callback failed: ' + e.message); return response; }); }); } /** * default implementation of PushCallback reporting errors and incoming messages to the console. * * @param error cause of failure. * @param pushMessage incoming notification data. * * @return {PushMessage} same value as parameter causing confirmation of message. */ function defaultPushCallback(error, pushMessage) { if (error) { diag.debug.error('push failure', error); } else if (pushMessage && pushMessage.message) { diag.debug.info('push received', pushMessage.message); } return pushMessage; } /** * installs a callback for receiving push notification messages, and registers the device with the * 3rd party push service provider. * * Usually push configuration is provided to `init()` and a call to this method is chained passing * the sink callback. Application using an explicit login then call `configurePushDevice()` as part * of the `LogonCallback` while anonymous applications call the latter directly. * * In general it is not wise to unregister from push messages. However, this functionality is * available by passing `null` as callback. * * @param callback to install, or explicitly null to unregister. * @return promise of registration, for informal purposes. */ function listenPushNotification(callback) { if (callback === void 0) { callback = defaultPushCallback; } if (resolveRegistrationEventResponse) { diag.debug.assert(!!rejectRegistrationEventResponse); resolveRegistrationEventResponse(undefined); resolveRegistrationEventResponse = undefined; rejectRegistrationEventResponse = undefined; } if (callback) { // perform registration promiseRegistrationEventResponse = device.ready.then(function (info) { var pushInitOptions = init.initOptions.push; var pushPlatform = info.platform.id; if (pushPlatform === 'windowsphone') { pushPlatform = 'windows'; } if (!pushInitOptions || !pushPlatform || !(pushPlatform in pushInitOptions)) { // no push configuration for current platform promiseRegistrationEventResponse = Q.resolve(undefined); return promiseRegistrationEventResponse; } // init or reinit push var pushStatic = global['PushNotification']; var pushImpl = pushStatic.init(pushInitOptions); if (pushPlugin !== pushImpl) { if (pushPlugin) { // turn off existing event handlers (in reverse order of registration) pushPlugin.off('notification', onPushNotificationNotification); pushPlugin.off('registration', onPushNotificationRegistration); pushPlugin.off('error', onPushNotificationError); } // set up new registration results promiseRegistrationEventResponse = Q.Promise(function (resolve, reject) { resolveRegistrationEventResponse = resolve; rejectRegistrationEventResponse = reject; }); // activation of new implementation pushCallback = callback; pushPlugin = pushImpl; // turn on event handlers (in order of relevance) pushPlugin.on('error', onPushNotificationError); pushPlugin.on('registration', onPushNotificationRegistration); pushPlugin.on('notification', onPushNotificationNotification); } return promiseRegistrationEventResponse; }); } else if (pushPlugin) { // perform unregistration promiseRegistrationEventResponse = Q.Promise(function (resolve, reject) { try { pushPlugin.unregister(resolve, reject); } catch (error) { reject(error); } }); } else { // nothing to unregister promiseRegistrationEventResponse = Q.resolve(undefined); } return promiseRegistrationEventResponse; } exports.listenPushNotification = listenPushNotification; /** * authorizes current Relution server logged onto to send push notifications by transmitting the * registration token. */ function configurePushDevice(options) { return Q.when(promiseRegistrationEventResponse, function (registrationEventResponse) { if (!registrationEventResponse) { // either there is no configuration or since this method was called, // registration was canceled return Q.resolve(undefined); } // remaining implementation in push.ts as this is independent of Cordova... return push.registerPushDevice(registrationEventResponse.registrationId, options); }); } exports.configurePushDevice = configurePushDevice; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZG92YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdXNoL2NvcmRvdmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNIOztHQUVHO0FBQ0gsTUFBTTs7QUFFTixJQUFZLENBQUMsV0FBTSxHQUFHLENBQUMsQ0FBQTtBQUV2QixJQUFZLElBQUksV0FBTSxjQUFjLENBQUMsQ0FBQTtBQUNyQyxJQUFZLE1BQU0sV0FBTSxnQkFBZ0IsQ0FBQyxDQUFBO0FBQ3pDLElBQVksSUFBSSxXQUFNLGNBQWMsQ0FBQyxDQUFBO0FBQ3JDLElBQVksSUFBSSxXQUFNLFFBQVEsQ0FBQyxDQUFBO0FBOEIvQixrREFBa0Q7QUFDbEQsSUFBSSxVQUErQyxDQUFDO0FBQ3BELElBQUksWUFBMEIsQ0FBQztBQUUvQiw4REFBOEQ7QUFDOUQsaUNBQWlDLEtBQVk7SUFDM0MsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsd0JBQXdCLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELGtEQUFrRDtBQUNsRCxJQUFJLGdDQUErRixDQUFDO0FBQ3BHLElBQUksK0JBQXdELENBQUM7QUFDN0QsSUFBSSxnQ0FBeUYsQ0FBQztBQUU5RiwrRkFBK0Y7QUFDL0YseUVBQXlFO0FBQ3pFLHdDQUF3QyxRQUFzRDtJQUM1RixFQUFFLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDckQsZ0NBQWdDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFD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Q0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsSUFBSSxDQUFDLENBQUM7UUFDTix3QkFBd0I7UUFDeEIsZ0NBQWdDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBK0MsU0FBUyxDQUFDLENBQUM7SUFDeEcsQ0FBQztJQUNELE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQztBQUMxQyxDQUFDO0FBakVlLDhCQUFzQix5QkFpRXJDLENBQUE7QUFFRDs7O0dBR0c7QUFDSCw2QkFBb0MsT0FBa0M7SUFDcEUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsVUFBQyx5QkFBeUI7UUFDeEUsRUFBRSxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUM7WUFDL0Isb0VBQW9FO1lBQ3BFLDRCQUE0QjtZQUM1QixNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBYyxTQUFTLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQsMkVBQTJFO1FBQzNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMseUJBQXlCLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQVhlLDJCQUFtQixzQkFXbEMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBAZmlsZSBwdXNoL2NvcmRvdmEudHNcbiAqIFJlbHV0aW9uIFNES1xuICpcbiAqIENyZWF0ZWQgYnkgVGhvbWFzIEJlY2ttYW5uIG9uIDA4LjA3LjIwMTZcbiAqIENvcHlyaWdodCAyMDE2IE0tV2F5IFNvbHV0aW9ucyBHbWJIXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQG1vZHVsZSBwdXNoXG4gKi9cbi8qKiAqL1xuXG5pbXBvcnQgKiBhcyBRIGZyb20gJ3EnO1xuXG5pbXBvcnQgKiBhcyBkaWFnIGZyb20gJy4uL2NvcmUvZGlhZyc7XG5pbXBvcnQgKiBhcyBkZXZpY2UgZnJvbSAnLi4vY29yZS9kZXZpY2UnO1xuaW1wb3J0ICogYXMgaW5pdCBmcm9tICcuLi9jb3JlL2luaXQnO1xuaW1wb3J0ICogYXMgcHVzaCBmcm9tICcuL3B1c2gnO1xuXG4vKipcbiAqIGFuIGluY29taW5nIHB1c2ggbm90aWZpY2F0aW9uIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIFB1c2hNZXNzYWdlID0gUGhvbmVnYXBQbHVnaW5QdXNoLk5vdGlmaWNhdGlvbkV2ZW50UmVzcG9uc2U7XG5cbi8qKlxuICogcmVjZWl2ZXMgaW5jb21pbmcgcHVzaCBub3RpZmljYXRpb24gbWVzc2FnZXMgb25jZSByZWdpc3RlcmVkIHVzaW5nIGBsaXN0ZW5QdXNoTm90aWZpY2F0aW9uKClgLlxuICpcbiAqIEZvciBlYWNoIGluY29taW5nIHB1c2ggbm90aWZpY2F0aW9uIG1lc3NhZ2UgdGhlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIHBlcmZvcm1pbmcgc29tZVxuICogYXBwLXNwZWNpZmljIGFjdGlvbi4gVGhlIGNhbGxlciB3aWxsIHdhaXQgdW50aWwgdGhlIG9wdGlvbmFsbHkgcmV0dXJuZWQgcHJvbWlzZSBnZXRzXG4gKiByZXNvbHZlZCwgYmVmb3JlIHNpZ25hbGxpbmcgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdGhlIG1lc3NhZ2UgZ290IHByb2Nlc3NlZCBjb21wbGV0ZWx5LlxuICpcbiAqIE5vdGljZSwgdGhlIG5leHQgcHVzaCBub3RpZmljYXRpb24gbWVzc2FnZSBtYXkgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBldmVuIGJlZm9yZSB0aGVcbiAqIHJldHVybmVkIHByb21pc2UgY29tcGxldGVkLiBUaGlzIGlzLCB0aGUgb3B0aW9uYWwgcHJvbWlzZSByZXR1cm5lZCBqdXN0IGNvbnRyb2xzIHdoZW4gdGhlXG4gKiBlbmQgb2YgcHJvY2Vzc2luZyBnZXRzIHNpZ25hbGxlZCB0byB0aGUgb3BlcmF0aW5nIHN5c3RlbSwgYnV0IG5vdCB3aGVuIHRoZSBhcHAgaXMgcmVhZHkuXG4gKlxuICogQWxzbywgY2FyZSBtdXN0IGJlIHRha2VuIGFzIHByb2Nlc3Npbmcgb2YgYSBwdXNoIG5vdGlmaWNhdGlvbiBtZXNzYWdlIG11c3Qgbm90IGV4Y2VlZFxuICogbW9yZSB0aGFuIDMwcyBhY2NvcmRpbmcgdG8gcHVzaCBwbHVnaW4gZG9jdW1lbnRhdGlvbiBhdFxuICogaHR0cHM6Ly9naXRodWIuY29tL3Bob25lZ2FwL3Bob25lZ2FwLXBsdWdpbi1wdXNoL2Jsb2IvbWFzdGVyL2RvY3MvUEFZTE9BRC5tZC5cbiAqIEZvciB0aGF0IHJlYXNvbiBpdCBtYWtlcyBubyBzZW5zZSB0byBkaXNwbGF5IHNvbWUgYmxvY2tpbmcgdXNlciBpbnRlcmZhY2UgaGVyZSFcbiAqXG4gKiBJZiBkdXJpbmcgYW55IG9mIHRoZXNlIHN0ZXBzIHNvbWUgZXJyb3IgaXMgZGV0ZWN0ZWQsIHRoZSBjYWxsYmFjayBpcyBleGVjdXRlZC4gVGhpcyBob2xkc1xuICogZXZlbiB3aGVuIGR1cmluZyBwcm9jZXNzaW5nIG9mIGEgcHVzaCBub3RpZmljYXRpb24gbWVzc2FnZSB0aGUgY2FsbGJhY2sgaXRzZWxmIHNpZ25hbGxlZFxuICogYW4gZXJyb3IuIEluIHRoaXMgY2FzZSwgYm90aCBwYXJhbWV0ZXJzIGFyZSBzdXBwbGllZC5cbiAqL1xuZXhwb3J0IHR5cGUgUHVzaENhbGxiYWNrID1cbiAgKGVycm9yOiBFcnJvciwgcHVzaE1lc3NhZ2U/OiBQdXNoTWVzc2FnZSkgPT4gUHVzaE1lc3NhZ2UgfCBRLlByb21pc2U8UHVzaE1lc3NhZ2U+O1xuXG4vLyBqdXN0IGtlZXAgdHJhY2sgb2YgcGx1Z2luIGluc3RhbmNlIGFuZCBjYWxsYmFja1xubGV0IHB1c2hQbHVnaW46IFBob25lZ2FwUGx1Z2luUHVzaC5QdXNoTm90aWZpY2F0aW9uO1xubGV0IHB1c2hDYWxsYmFjazogUHVzaENhbGxiYWNrO1xuXG4vLyBleGVjdXRlZCB3aGVuIHRoZSBwdXNoTm90aWZpY2F0aW9uIHBsdWdpbiBmYWlscyBpbnRlcm5hbGx5LlxuZnVuY3Rpb24gb25QdXNoTm90aWZpY2F0aW9uRXJyb3IoZXJyb3I6IEVycm9yKSB7XG4gIFEocHVzaENhbGxiYWNrKGVycm9yKSkuZG9uZSh1bmRlZmluZWQsIChlKSA9PiB7XG4gICAgZGlhZy5kZWJ1Zy5hc3NlcnQoZSA9PT0gZXJyb3IsICdwdXNoIGNhbGxiYWNrIGZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gIH0pO1xufVxuXG4vLyBmb2xsb3dpbmcgc2V0cyB1cCBhIHByb21pc2Ugb2YgdGhlIHJlZ2lzdHJhdGlvblxubGV0IHJlc29sdmVSZWdpc3RyYXRpb25FdmVudFJlc3BvbnNlOiAodmFsdWU6IFBob25lZ2FwUGx1Z2luUHVzaC5SZWdpc3RyYXRpb25FdmVudFJlc3BvbnNlKSA9PiB2b2lkO1xubGV0IHJlamVjdFJlZ2lzdHJhdGlvbkV2ZW50UmVzcG9uc2U6IChyZWFzb246IEVycm9yKSA9PiB2b2lkO1xubGV0IHByb21pc2VSZWdpc3RyYXRpb25FdmVudFJlc3BvbnNlOiBRLlByb21pc2U8UGhvbmVnYXBQbHVnaW5QdXNoLlJlZ2lzdHJhdGlvbkV2ZW50UmVzcG9uc2U+O1xuXG4vLyBleGVjdXRlZCB3aGVuIHJlZ2lzdHJhdGlvbiBhdCAzcmQgcGFydHkgcHVzaCBzZXJ2ZXIgc3VjY2VlZGVkIGFuZCBhIHJlZ2lzdHJhdGlvbiB3YXMgaXNzdWVkLFxuLy8gb3IgYSByZWdpc3RyYXRpb24gaXMgcmVuZXdlZCBtZWFuaW5nIHRoaXMgbWF5IGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzLlxuZnVuY3Rpb24gb25QdXNoTm90aWZpY2F0aW9uUmVnaXN0cmF0aW9uKHJlc3BvbnNlOiBQaG9uZWdhcFBsdWdpblB1c2guUmVnaXN0cmF0aW9uRXZlbnRSZXNwb25zZSkge1xuICBpZiAocmVzb2x2ZVJlZ2lzdHJhdGlvbkV2ZW50UmVzcG9uc2UpIHtcbiAgICBkaWFnLmRlYnVnLmFzc2VydCghIXJlamVjdFJlZ2lzdHJhdGlvbkV2ZW50UmVzcG9uc2UpO1xuICAgIHJlc29sdmVSZWdpc3RyYXRpb25FdmVudFJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICByZXNvbHZlUmVnaXN0cmF0aW9uRXZlbnRSZXNwb25zZSA9IHVuZGVmaW5lZDtcbiAgICByZWplY3RSZWdpc3RyYXRpb25FdmVudFJlc3BvbnNlID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHByb21pc2VSZWdpc3RyYXRpb25FdmVudFJlc3BvbnNlID0gUS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgfVxuICByZXR1cm4gcHJvbWlzZVJlZ2lzdHJhdGlvbkV2ZW50UmVzcG9uc2UuZG9uZSgpO1xufVxuXG4vLyBleGVjdXRlZCBvbiBlYWNoIGluY29taW5nIHB1c2ggbm90aWZpY2F0aW9uIG1lc3NhZ2UgY2FsbGluZyB0aGUgcHVzaENhbGxiYWNrIGluIGFuXG4vLyBlcnJvci1hZ25vc3RpYyBmYXNoaW9uLlxuZnVuY3Rpb24gb25QdXNoTm90aWZpY2F0aW9uTm90aWZpY2F0aW9uKHJlc3BvbnNlOiBQaG9uZWdhcFBsdWdpblB1c2guTm90aWZpY2F0aW9uRXZlbnRSZXNwb25zZSkge1xuICAvLyBhc3NpZ25tZW50cyBhdm9pZGluZyBjaGFuZ2VzIG9mIGltcGxlbWVudGF0aW9uIHN0YXRlIGR1cmluZyBwcm9taXNlIGNoYWluXG4gIGNvbnN0IHBsdWdpbiA9IHB1c2hQbHVnaW47XG4gIGNvbnN0IGNhbGxiYWNrID0gcHVzaENhbGxiYWNrO1xuICByZXR1cm4gUShyZXNwb25zZSkudGhlbigocikgPT4ge1xuICAgIGRpYWcuZGVidWcuYXNzZXJ0KHIgPT09IHJlc3BvbnNlLCAnanVzdCBiZWdpbnMgcHJvbWlzZSBjaGFpbiBhdm9pZGluZyBleHBsaWNpdCB0cnktY2F0Y2gnKTtcbiAgICByZXR1cm4gY2FsbGJhY2sodW5kZWZpbmVkLCByZXNwb25zZSkgfHwgcmVzcG9uc2U7XG4gIH0pLnRoZW4oKHIpID0+IHtcbiAgICBkaWFnLmRlYnVnLmFzc2VydChyID09PSByZXNwb25zZSwgJ3B1c2ggY2FsbGJhY2sgbXVzdCByZXNwb25kIHNhbWUgb2JqZWN0Jyk7XG4gICAgcmV0dXJuIFEuUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoJ25vdElkJyBpbiByZXNwb25zZS5hZGRpdGlvbmFsRGF0YSkge1xuICAgICAgICAgIHBsdWdpbi5maW5pc2goPGFueT5yZXNvbHZlLCA8YW55PnJlamVjdCwgcmVzcG9uc2UuYWRkaXRpb25hbERhdGEubm90SWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBsdWdpbi5maW5pc2goPGFueT5yZXNvbHZlLCA8YW55PnJlamVjdCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pLmRvbmUodW5kZWZpbmVkLCAoZXJyb3IpID0+IHtcbiAgICByZXR1cm4gUShjYWxsYmFjayhlcnJvciwgcmVzcG9uc2UpIHx8IHJlc3BvbnNlKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgZGlhZy5kZWJ1Zy5hc3NlcnQoZSA9PT0gZXJyb3IsICdwdXNoIGNhbGxiYWNrIGZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgUHVzaENhbGxiYWNrIHJlcG9ydGluZyBlcnJvcnMgYW5kIGluY29taW5nIG1lc3NhZ2VzIHRvIHRoZSBjb25zb2xlLlxuICpcbiAqIEBwYXJhbSBlcnJvciBjYXVzZSBvZiBmYWlsdXJlLlxuICogQHBhcmFtIHB1c2hNZXNzYWdlIGluY29taW5nIG5vdGlmaWNhdGlvbiBkYXRhLlxuICpcbiAqIEByZXR1cm4ge1B1c2hNZXNzYWdlfSBzYW1lIHZhbHVlIGFzIHBhcmFtZXRlciBjYXVzaW5nIGNvbmZpcm1hdGlvbiBvZiBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0UHVzaENhbGxiYWNrKGVycm9yOiBFcnJvciwgcHVzaE1lc3NhZ2U/OiBQdXNoTWVzc2FnZSkge1xuICBpZiAoZXJyb3IpIHtcbiAgICBkaWFnLmRlYnVnLmVycm9yKCdwdXNoIGZhaWx1cmUnLCBlcnJvcik7XG4gIH0gZWxzZSBpZiAocHVzaE1lc3NhZ2UgJiYgcHVzaE1lc3NhZ2UubWVzc2FnZSkge1xuICAgIGRpYWcuZGVidWcuaW5mbygncHVzaCByZWNlaXZlZCcsIHB1c2hNZXNzYWdlLm1lc3NhZ2UpO1xuICB9XG4gIHJldHVybiBwdXNoTWVzc2FnZTtcbn1cblxuLyoqXG4gKiBpbnN0YWxscyBhIGNhbGxiYWNrIGZvciByZWNlaXZpbmcgcHVzaCBub3RpZmljYXRpb24gbWVzc2FnZXMsIGFuZCByZWdpc3RlcnMgdGhlIGRldmljZSB3aXRoIHRoZVxuICogM3JkIHBhcnR5IHB1c2ggc2VydmljZSBwcm92aWRlci5cbiAqXG4gKiBVc3VhbGx5IHB1c2ggY29uZmlndXJhdGlvbiBpcyBwcm92aWRlZCB0byBgaW5pdCgpYCBhbmQgYSBjYWxsIHRvIHRoaXMgbWV0aG9kIGlzIGNoYWluZWQgcGFzc2luZ1xuICogdGhlIHNpbmsgY2FsbGJhY2suIEFwcGxpY2F0aW9uIHVzaW5nIGFuIGV4cGxpY2l0IGxvZ2luIHRoZW4gY2FsbCBgY29uZmlndXJlUHVzaERldmljZSgpYCBhcyBwYXJ0XG4gKiBvZiB0aGUgYExvZ29uQ2FsbGJhY2tgIHdoaWxlIGFub255bW91cyBhcHBsaWNhdGlvbnMgY2FsbCB0aGUgbGF0dGVyIGRpcmVjdGx5LlxuICpcbiAqIEluIGdlbmVyYWwgaXQgaXMgbm90IHdpc2UgdG8gdW5yZWdpc3RlciBmcm9tIHB1c2ggbWVzc2FnZXMuIEhvd2V2ZXIsIHRoaXMgZnVuY3Rpb25hbGl0eSBpc1xuICogYXZhaWxhYmxlIGJ5IHBhc3NpbmcgYG51bGxgIGFzIGNhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSBjYWxsYmFjayB0byBpbnN0YWxsLCBvciBleHBsaWNpdGx5IG51bGwgdG8gdW5yZWdpc3Rlci5cbiAqIEByZXR1cm4gcHJvbWlzZSBvZiByZWdpc3RyYXRpb24sIGZvciBpbmZvcm1hbCBwdXJwb3Nlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlblB1c2hOb3RpZmljYXRpb24oY2FsbGJhY2s6IFB1c2hDYWxsYmFjayA9IGRlZmF1bHRQdXNoQ2FsbGJhY2spOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUS5Qcm9taXNlPFBob25lZ2FwUGx1Z2luUHVzaC5SZWdpc3RyYXRpb25FdmVudFJlc3BvbnNlPiB7XG4gIGlmIChyZXNvbHZlUmVnaXN0cmF0aW9uRXZlbnRSZXNwb25zZSkge1xuICAgIGRpYWcuZGVidWcuYXNzZXJ0KCEhcmVqZWN0UmVnaXN0cmF0aW9uRXZlbnRSZXNwb25zZSk7XG4gICAgcmVzb2x2ZVJlZ2lzdHJhdGlvbkV2ZW50UmVzcG9uc2UodW5kZWZpbmVkKTtcbiAgICByZXNvbHZlUmVnaXN0cmF0aW9uRXZlbnRSZXNwb25zZSA9IHVuZGVmaW5lZDtcbiAgICByZWplY3RSZWdpc3RyYXRpb25FdmVudFJlc3BvbnNlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgLy8gcGVyZm9ybSByZWdpc3RyYXRpb25cbiAgICBwcm9taXNlUmVnaXN0cmF0aW9uRXZlbnRSZXNwb25zZSA9IGRldmljZS5yZWFkeS50aGVuKChpbmZvKSA9PiB7XG4gICAgICBjb25zdCBwdXNoSW5pdE9wdGlvbnMgPSBpbml0LmluaXRPcHRpb25zLnB1c2g7XG4gICAgICBsZXQgcHVzaFBsYXRmb3JtOiBzdHJpbmcgPSBpbmZvLnBsYXRmb3JtLmlkO1xuICAgICAgaWYgKHB1c2hQbGF0Zm9ybSA9PT0gJ3dpbmRvd3NwaG9uZScpIHtcbiAgICAgICAgcHVzaFBsYXRmb3JtID0gJ3dpbmRvd3MnO1xuICAgICAgfVxuICAgICAgaWYgKCFwdXNoSW5pdE9wdGlvbnMgfHwgIXB1c2hQbGF0Zm9ybSB8fCAhKHB1c2hQbGF0Zm9ybSBpbiBwdXNoSW5pdE9wdGlvbnMpKSB7XG4gICAgICAgIC8vIG5vIHB1c2ggY29uZmlndXJhdGlvbiBmb3IgY3VycmVudCBwbGF0Zm9ybVxuICAgICAgICBwcm9taXNlUmVnaXN0cmF0aW9uRXZlbnRSZXNwb25zZSA9IFEucmVzb2x2ZTxQaG9uZWdhcFBsdWdpblB1c2guUmVnaXN0cmF0aW9uRXZlbnRSZXNwb25zZT4odW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZWdpc3RyYXRpb25FdmVudFJlc3BvbnNlO1xuICAgICAgfVxuXG4gICAgICAvLyBpbml0IG9yIHJlaW5pdCBwdXNoXG4gICAgICBjb25zdCBwdXNoU3RhdGljOiBQaG9uZWdhcFBsdWdpblB1c2guUHVzaE5vdGlmaWNhdGlvblN0YXRpYyA9IGdsb2JhbFsnUHVzaE5vdGlmaWNhdGlvbiddO1xuICAgICAgY29uc3QgcHVzaEltcGwgPSBwdXNoU3RhdGljLmluaXQocHVzaEluaXRPcHRpb25zKTtcbiAgICAgIGlmIChwdXNoUGx1Z2luICE9PSBwdXNoSW1wbCkge1xuICAgICAgICBpZiAocHVzaFBsdWdpbikge1xuICAgICAgICAgIC8vIHR1cm4gb2ZmIGV4aXN0aW5nIGV2ZW50IGhhbmRsZXJzIChpbiByZXZlcnNlIG9yZGVyIG9mIHJlZ2lzdHJhdGlvbilcbiAgICAgICAgICBwdXNoUGx1Z2luLm9mZignbm90aWZpY2F0aW9uJywgb25QdXNoTm90aWZpY2F0aW9uTm90aWZpY2F0aW9uKTtcbiAgICAgICAgICBwdXNoUGx1Z2luLm9mZigncmVnaXN0cmF0aW9uJywgb25QdXNoTm90aWZpY2F0aW9uUmVnaXN0cmF0aW9uKTtcbiAgICAgICAgICBwdXNoUGx1Z2luLm9mZignZXJyb3InLCBvblB1c2hOb3RpZmljYXRpb25FcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgdXAgbmV3IHJlZ2lzdHJhdGlvbiByZXN1bHRzXG4gICAgICAgIHByb21pc2VSZWdpc3RyYXRpb25FdmVudFJlc3BvbnNlID0gUS5Qcm9taXNlPFBob25lZ2FwUGx1Z2luUHVzaC5SZWdpc3RyYXRpb25FdmVudFJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZVJlZ2lzdHJhdGlvbkV2ZW50UmVzcG9uc2UgPSByZXNvbHZlO1xuICAgICAgICAgIHJlamVjdFJlZ2lzdHJhdGlvbkV2ZW50UmVzcG9uc2UgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGFjdGl2YXRpb24gb2YgbmV3IGltcGxlbWVudGF0aW9uXG4gICAgICAgIHB1c2hDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICBwdXNoUGx1Z2luID0gcHVzaEltcGw7XG5cbiAgICAgICAgLy8gdHVybiBvbiBldmVudCBoYW5kbGVycyAoaW4gb3JkZXIgb2YgcmVsZXZhbmNlKVxuICAgICAgICBwdXNoUGx1Z2luLm9uKCdlcnJvcicsIG9uUHVzaE5vdGlmaWNhdGlvbkVycm9yKTtcbiAgICAgICAgcHVzaFBsdWdpbi5vbigncmVnaXN0cmF0aW9uJywgb25QdXNoTm90aWZpY2F0aW9uUmVnaXN0cmF0aW9uKTtcbiAgICAgICAgcHVzaFBsdWdpbi5vbignbm90aWZpY2F0aW9uJywgb25QdXNoTm90aWZpY2F0aW9uTm90aWZpY2F0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9taXNlUmVnaXN0cmF0aW9uRXZlbnRSZXNwb25zZTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChwdXNoUGx1Z2luKSB7XG4gICAgLy8gcGVyZm9ybSB1bnJlZ2lzdHJhdGlvblxuICAgIHByb21pc2VSZWdpc3RyYXRpb25FdmVudFJlc3BvbnNlID0gUS5Qcm9taXNlPFBob25lZ2FwUGx1Z2luUHVzaC5SZWdpc3RyYXRpb25FdmVudFJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBwdXNoUGx1Z2luLnVucmVnaXN0ZXIoPGFueT5yZXNvbHZlLCA8YW55PnJlamVjdCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG5vdGhpbmcgdG8gdW5yZWdpc3RlclxuICAgIHByb21pc2VSZWdpc3RyYXRpb25FdmVudFJlc3BvbnNlID0gUS5yZXNvbHZlPFBob25lZ2FwUGx1Z2luUHVzaC5SZWdpc3RyYXRpb25FdmVudFJlc3BvbnNlPih1bmRlZmluZWQpO1xuICB9XG4gIHJldHVybiBwcm9taXNlUmVnaXN0cmF0aW9uRXZlbnRSZXNwb25zZTtcbn1cblxuLyoqXG4gKiBhdXRob3JpemVzIGN1cnJlbnQgUmVsdXRpb24gc2VydmVyIGxvZ2dlZCBvbnRvIHRvIHNlbmQgcHVzaCBub3RpZmljYXRpb25zIGJ5IHRyYW5zbWl0dGluZyB0aGVcbiAqIHJlZ2lzdHJhdGlvbiB0b2tlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZVB1c2hEZXZpY2Uob3B0aW9ucz86IHB1c2guUmVnaXN0cmF0aW9uT3B0aW9ucyk6IFEuUHJvbWlzZTxwdXNoLkRldmljZT4ge1xuICByZXR1cm4gUS53aGVuKHByb21pc2VSZWdpc3RyYXRpb25FdmVudFJlc3BvbnNlLCAocmVnaXN0cmF0aW9uRXZlbnRSZXNwb25zZSkgPT4ge1xuICAgIGlmICghcmVnaXN0cmF0aW9uRXZlbnRSZXNwb25zZSkge1xuICAgICAgLy8gZWl0aGVyIHRoZXJlIGlzIG5vIGNvbmZpZ3VyYXRpb24gb3Igc2luY2UgdGhpcyBtZXRob2Qgd2FzIGNhbGxlZCxcbiAgICAgIC8vIHJlZ2lzdHJhdGlvbiB3YXMgY2FuY2VsZWRcbiAgICAgIHJldHVybiBRLnJlc29sdmU8cHVzaC5EZXZpY2U+KHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLy8gcmVtYWluaW5nIGltcGxlbWVudGF0aW9uIGluIHB1c2gudHMgYXMgdGhpcyBpcyBpbmRlcGVuZGVudCBvZiBDb3Jkb3ZhLi4uXG4gICAgcmV0dXJuIHB1c2gucmVnaXN0ZXJQdXNoRGV2aWNlKHJlZ2lzdHJhdGlvbkV2ZW50UmVzcG9uc2UucmVnaXN0cmF0aW9uSWQsIG9wdGlvbnMpO1xuICB9KTtcbn1cbiJdfQ==