UNPKG

relution-sdk

Version:

Relution Software Development Kit for TypeScript and JavaScript

172 lines 22.5 kB
/* * @file push/push.ts * Relution SDK * * Created by Thomas Beckmann on 06.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 _ = require('lodash'); var diag = require('../core/diag'); var device = require('../core/device'); var domain = require('../core/domain'); var init = require('../core/init'); var server = require('../security/server'); var web = require('../web'); /** * endpoint URL of push REST API set up by CLI project generation by default. * * @type {string} */ var pushUrl = 'api/v1/push'; ; /** * registers a target device with the current Relution server. * * The implementation relies on backend code generated by CLI. That code attempts fetching an * existing device using the metadata information send as request body data. If it finds one, that * device is updated. Otherwise a new device is created and stored in the database. The updated * device registration record then is sent as response body data. * * @param registrationId to register. * @return promise of registered device. * * @internal SDK client code must call configurePushDevice() which obtains the token. */ function registerPushDevice(registrationId, options) { if (options === void 0) { options = {}; } var user = server.getCurrentAuthorization().name; var pushInitOptions = init.initOptions.push; return device.ready.then(function (info) { var providerType; switch (info.platform.id) { case 'android': providerType = 'GCM'; break; case 'ios': // when a senderID is configured, // iOS device is registered at APNS which generates a token registered in turn at GCM, // so that pushes are send using GCM to either type of device. providerType = pushInitOptions.ios.senderID ? 'GCM' : 'APNS'; break; case 'windowsphone': providerType = 'WNS'; break; case 'blackberry': providerType = 'PAP'; break; default: providerType = 'MCAP'; break; } diag.debug.assert(!!info.device, 'The current implementation supports mobile devices only!'); return { uuid: null, providerType: providerType, token: registrationId, user: user, deviceIdentifier: info.uuid, vendor: info.device.manufacturer, name: info.device.name, osVersion: info.device.version, model: info.device.model, type: info.device.name, appPackageName: info.device.appIdentifier, appVersion: info.device.appVersionCode || info.device.appVersionName, attributes: options.attributes, tags: options.tags, badge: options.badge }; }).then(function (device) { diag.debug.assert(device.providerType !== 'PAP', 'Relution Server does not yet support this!'); diag.debug.assert(device.providerType !== 'MCAP', 'Relution SDK does not yet implement this!'); return web.post(pushUrl + '/registration', device); }); } exports.registerPushDevice = registerPushDevice; /** * posts push notification(s). * * Usually the server sends push notifications on its own behalf. However, this method may be used * by the client app itself to send push notifications either to other clients, or to itself which * can be used to test connectivity. * * The implementation relies on backend code generated by CLI which forwards the body JSON to the * server-side implementation of this method. * * @param message to deliver. * @returns promise of async execution resolving to UUIDs of jobs in asynchronous delivery, * empty when no apps or devices got selected by the message criteria or null when no * target apps or devices exist at all. */ function postPushNotification(message) { return web.post(pushUrl, message); } exports.postPushNotification = postPushNotification; /** * creates a device filter for the user attribute of push devices matching any of a given set of * users. * * @param users* to filter on. * @returns device filter matching devices of given users. */ function pushDeviceFilterByUsers() { var users = []; for (var _i = 0; _i < arguments.length; _i++) { users[_i - 0] = arguments[_i]; } if (users.length <= 0) { return { type: 'null', fieldName: 'user', isNull: true }; } else if (users.length === 1) { return { type: 'string', fieldName: 'user', value: domain.uuidOf(users[0]) }; } else { var uuids = users.map(function (user) { return domain.uuidOf(user); }); return { type: 'stringEnum', fieldName: 'user', values: uuids }; } } exports.pushDeviceFilterByUsers = pushDeviceFilterByUsers; /** * gets push notification status. * * The implementation relies on backend code generated by CLI which uses the server-side * PushService to query for Job by uuid. * * @param uuidOrMessage to query. * @returns promise of async execution resolving to push Job information. */ function fetchPushNotification(uuidOrMessage) { var uuid = _.isString(uuidOrMessage) ? uuidOrMessage : uuidOrMessage.uuid; return web.get(pushUrl + '/' + uuid); } exports.fetchPushNotification = fetchPushNotification; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdXNoL3B1c2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNIOztHQUVHO0FBQ0gsTUFBTTs7QUFFTixJQUFZLENBQUMsV0FBTSxRQUFRLENBQUMsQ0FBQTtBQUc1QixJQUFZLElBQUksV0FBTSxjQUFjLENBQUMsQ0FBQTtBQUNyQyxJQUFZLE1BQU0sV0FBTSxnQkFBZ0IsQ0FBQyxDQUFBO0FBQ3pDLElBQVksTUFBTSxXQUFNLGdCQUFnQixDQUFDLENBQUE7QUFDekMsSUFBWSxJQUFJLFdBQU0sY0FBYyxDQUFDLENBQUE7QUFDckMsSUFBWSxNQUFNLFdBQU0sb0JBQW9CLENBQUMsQ0FBQTtBQUM3QyxJQUFZLEdBQUcsV0FBTSxRQUFRLENBQUMsQ0FBQTtBQUs5Qjs7OztHQUlHO0FBQ0gsSUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDO0FBZ0g3QixDQUFDO0FBRUY7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsNEJBQW1DLGNBQXNCLEVBQ3RCLE9BQWlDO0lBQWpDLHVCQUFpQyxHQUFqQyxZQUFpQztJQUNsRSxJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDbkQsSUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUMsSUFBSTtRQUM1QixJQUFJLFlBQTBCLENBQUM7UUFDL0IsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLEtBQUssU0FBUztnQkFDWixZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixLQUFLLENBQUM7WUFDUixLQUFLLEtBQUs7Z0JBQ1IsaUNBQWlDO2dCQUNqQyxzRkFBc0Y7Z0JBQ3RG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U0FDL0IsQ0FBQztJQUNKLENBQUM7SUFBQyxJQUFJLENBQUMsQ0FBQztRQUNOLElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBQyxJQUFJLElBQUssT0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFuQixDQUFtQixDQUFDLENBQUM7UUFDdkQsTUFBTSxDQUFtQjtZQUN2QixJQUFJLEVBQUUsWUFBWTtZQUNsQixTQUFTLEVBQUUsTUFBTTtZQUNqQixNQUFNLEVBQUUsS0FBSztTQUNkLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQXJCZSwrQkFBdUIsMEJBcUJ0QyxDQUFBO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCwrQkFBc0MsYUFBMkI7SUFDL0QsSUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxhQUFhLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQztJQUM1RSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBTSxPQUFPLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFIZSw2QkFBcUIsd0JBR3BDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQGZpbGUgcHVzaC9wdXNoLnRzXG4gKiBSZWx1dGlvbiBTREtcbiAqXG4gKiBDcmVhdGVkIGJ5IFRob21hcyBCZWNrbWFubiBvbiAwNi4wNy4yMDE2XG4gKiBDb3B5cmlnaHQgMjAxNiBNLVdheSBTb2x1dGlvbnMgR21iSFxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBtb2R1bGUgcHVzaFxuICovXG4vKiogKi9cblxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgUSBmcm9tICdxJztcblxuaW1wb3J0ICogYXMgZGlhZyBmcm9tICcuLi9jb3JlL2RpYWcnO1xuaW1wb3J0ICogYXMgZGV2aWNlIGZyb20gJy4uL2NvcmUvZGV2aWNlJztcbmltcG9ydCAqIGFzIGRvbWFpbiBmcm9tICcuLi9jb3JlL2RvbWFpbic7XG5pbXBvcnQgKiBhcyBpbml0IGZyb20gJy4uL2NvcmUvaW5pdCc7XG5pbXBvcnQgKiBhcyBzZXJ2ZXIgZnJvbSAnLi4vc2VjdXJpdHkvc2VydmVyJztcbmltcG9ydCAqIGFzIHdlYiBmcm9tICcuLi93ZWInO1xuXG5pbXBvcnQge0ZpbHRlciwgTnVsbEZpbHRlciwgU3RyaW5nRmlsdGVyLCBTdHJpbmdFbnVtRmlsdGVyfSBmcm9tICcuLi9xdWVyeS9GaWx0ZXInO1xuaW1wb3J0IHtVc2VyfSBmcm9tICcuLi9zZWN1cml0eS9yb2xlcyc7XG5cbi8qKlxuICogZW5kcG9pbnQgVVJMIG9mIHB1c2ggUkVTVCBBUEkgc2V0IHVwIGJ5IENMSSBwcm9qZWN0IGdlbmVyYXRpb24gYnkgZGVmYXVsdC5cbiAqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBwdXNoVXJsID0gJ2FwaS92MS9wdXNoJztcblxuLyoqXG4gKiB0cmFuc21pc3Npb24gc3RhdHVzIG9mIGEgcHVzaCBKb2IuXG4gKlxuICogVGhpcyBtb2RlbHMgdGhlIEphdmEgZW51bSBgY29tLm13YXlzb2x1dGlvbnMuZ29mZXIyLnB1c2guZG9tYWluLlN0YXRlYC5cbiAqL1xuZXhwb3J0IHR5cGUgU3RhdGUgPSAnVU5VU0VEJyB8ICdRVUVVRUQnIHwgJ1JVTk5JTkcnIHwgJ0ZJTklTSEVEJztcblxuLyoqXG4gKiByZXByZXNlbnRzIGEgcHVzaCBtZXNzYWdlLlxuICpcbiAqIFRoaXMgbW9kZWxzIHRoZSBKYXZhIGNsYXNzIGBjb20ubXdheXNvbHV0aW9ucy5nb2ZlcjIucHVzaC5kb21haW4uSm9iYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2IgZXh0ZW5kcyBkb21haW4uUmVmZXJlbmNlYWJsZS8qLCBkb21haW4uSGFzTW9kaWZpZWQqLyB7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBzdGF0ZT86IFN0YXRlO1xuICBhcHA/OiBBcHA7XG5cbiAgbWVzc2FnZTogc3RyaW5nO1xuICBiYWRnZT86IHN0cmluZztcbiAgc291bmQ/OiBzdHJpbmc7XG4gIGV4dHJhcz86IF8uRGljdGlvbmFyeTxzdHJpbmc+O1xuXG4gIGRldmljZUZpbHRlcj86IEZpbHRlcjtcblxuICB0b3RhbD86IG51bWJlcjtcbiAgc2VudD86IG51bWJlcjtcbiAgZmFpbGVkPzogbnVtYmVyO1xuXG4gIC8vIGluY29tcGF0aWJsZSB0byBkb21haW4uSGFzTW9kaWZpZWQsXG4gIC8vIGxpa2VseSBjaGFuZ2VkIGluIHRoZSBmdXR1cmUgd2l0aG91dCBub3RpY2VcbiAgLy8gY3JlYXRlZEF0PzogRGF0ZTtcbiAgLy8gbW9kaWZpZWRBdD86IERhdGU7XG59XG5cbi8qKlxuICogcmVwcmVzZW50cyBhIHB1c2ggY29uZmlndXJhdGlvbiBvZiBhIHNwZWNpZmljIGNsaWVudCBhcHAuXG4gKlxuICogVGhpcyBtb2RlbHMgdGhlIEphdmEgY2xhc3MgYGNvbS5td2F5c29sdXRpb25zLmdvZmVyMi5wdXNoLmRvbWFpbi5BcHBgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcCBleHRlbmRzIGRvbWFpbi5SZWZlcmVuY2VhYmxlLCBkb21haW4uU2VjdXJlLCBkb21haW4uSGFzVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluLkhhc0J1bmRsZSwgZG9tYWluLkhhc0FwcGxpY2F0aW9uLyosIGRvbWFpbi5IYXNNb2RpZmllZCovIHtcbiAgb3JnYW5pc2F0aW9uVXVpZD86IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLy8gYXBuc1Byb3ZpZGVyPzogYW55OyAvLyBub3QgbW9kZWxsZWQgZXhwbGljaXRseSwgbm90IGV4cG9zZWQgdG8gY2xpZW50c1xuICAvLyBnY21Qcm92aWRlcj86IGFueTsgIC8vIG5vdCBtb2RlbGxlZCBleHBsaWNpdGx5LCBub3QgZXhwb3NlZCB0byBjbGllbnRzXG4gIC8vIHduc1Byb3ZpZGVyPzogYW55OyAgLy8gbm90IG1vZGVsbGVkIGV4cGxpY2l0bHksIG5vdCBleHBvc2VkIHRvIGNsaWVudHNcblxuICBkZXZpY2VzPzogRGV2aWNlW107ICAgIC8vICh1c3VhbGx5KSBub3QgZXhwb3NlZCB0byBjbGllbnRzXG4gIGpvYnM/OiBKb2JbXTsgICAgICAgICAgLy8gKHVzdWFsbHkpIG5vdCBleHBvc2VkIHRvIGNsaWVudHNcblxuICAvLyBpbmNvbXBhdGlibGUgdG8gZG9tYWluLkhhc01vZGlmaWVkLFxuICAvLyBsaWtlbHkgY2hhbmdlZCBpbiB0aGUgZnV0dXJlIHdpdGhvdXQgbm90aWNlXG4gIC8vIGNyZWF0ZWRBdD86IERhdGU7XG4gIC8vIG1vZGlmaWVkQXQ/OiBEYXRlO1xuICAvLyBkZWxldGVkQXQ/OiBEYXRlO1xufVxuXG4vKipcbiAqIGNvbW11bmljYXRpb24gcHJvdmlkZXIgdXNlZCB0byB0cmFuc3BvcnQgcHVzaCBtZXNzYWdlcyB0byBhIHB1c2ggRGV2aWNlLlxuICpcbiAqIFRoaXMgbW9kZWxzIHRoZSBKYXZhIGVudW0gYGNvbS5td2F5c29sdXRpb25zLmdvZmVyMi5wdXNoLmRvbWFpbi5Qcm92aWRlclR5cGVgLlxuICovXG5leHBvcnQgdHlwZSBQcm92aWRlclR5cGUgPSAnR0NNJyB8ICdBUE5TJyB8ICdNQ0FQJyB8ICdXTlMnIHwgJ1BBUCc7XG5cbi8qKlxuICogcmVwcmVzZW50cyBhIHB1c2ggaW5mb3JtYXRpb24gb2YgYSBzcGVjaWZpYyBtb2JpbGUgZGV2aWNlLlxuICpcbiAqIFRoaXMgbW9kZWxzIHRoZSBKYXZhIGNsYXNzIGBjb20ubXdheXNvbHV0aW9ucy5nb2ZlcjIucHVzaC5kb21haW4uRGV2aWNlYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXZpY2UgZXh0ZW5kcyBkb21haW4uUmVmZXJlbmNlYWJsZS8qLCBkb21haW4uSGFzTW9kaWZpZWQqLyB7XG4gIHRva2VuPzogc3RyaW5nO1xuICBwcm92aWRlclR5cGU/OiBQcm92aWRlclR5cGU7XG4gIGFwcD86IEFwcDtcblxuICBkZXZpY2VJZGVudGlmaWVyPzogc3RyaW5nO1xuICBhcHBQYWNrYWdlTmFtZT86IHN0cmluZztcblxuICB1c2VyPzogc3RyaW5nO1xuICB2ZW5kb3I/OiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG5cbiAgb3NWZXJzaW9uPzogc3RyaW5nO1xuICBsYW5ndWFnZT86IHN0cmluZztcbiAgY291bnRyeT86IHN0cmluZztcbiAgdHlwZT86IHN0cmluZztcbiAgYXBwVmVyc2lvbj86IHN0cmluZztcbiAgbW9kZWw/OiBzdHJpbmc7XG5cbiAgYXR0cmlidXRlcz86IF8uRGljdGlvbmFyeTxzdHJpbmc+O1xuXG4gIHRhZ3M/OiBzdHJpbmdbXTtcbiAgYmFkZ2U/OiBudW1iZXI7XG5cbiAgLy8gaW5jb21wYXRpYmxlIHRvIGRvbWFpbi5IYXNNb2RpZmllZCxcbiAgLy8gbGlrZWx5IGNoYW5nZWQgaW4gdGhlIGZ1dHVyZSB3aXRob3V0IG5vdGljZVxuICAvLyBjcmVhdGVkQXQ/OiBEYXRlO1xuICAvLyBtb2RpZmllZEF0PzogRGF0ZTtcbiAgLy8gZGVsZXRlZEF0PzogRGF0ZTtcbiAgbGFzdENvbm5lY3Q/OiBEYXRlO1xufVxuXG4vKipcbiAqIHNldCBvZiBhcHBsaWNhdGlvbiBzcGVjaWZpYyBvcHRpb25zIGZvciByZWdpc3RlclB1c2hOb3RpZmljYXRpb24oKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyYXRpb25PcHRpb25zIHtcbiAgYXR0cmlidXRlcz86IF8uRGljdGlvbmFyeTxzdHJpbmc+O1xuICB0YWdzPzogc3RyaW5nW107XG4gIGJhZGdlPzogbnVtYmVyO1xufTtcblxuLyoqXG4gKiByZWdpc3RlcnMgYSB0YXJnZXQgZGV2aWNlIHdpdGggdGhlIGN1cnJlbnQgUmVsdXRpb24gc2VydmVyLlxuICpcbiAqIFRoZSBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gYmFja2VuZCBjb2RlIGdlbmVyYXRlZCBieSBDTEkuIFRoYXQgY29kZSBhdHRlbXB0cyBmZXRjaGluZyBhblxuICogZXhpc3RpbmcgZGV2aWNlIHVzaW5nIHRoZSBtZXRhZGF0YSBpbmZvcm1hdGlvbiBzZW5kIGFzIHJlcXVlc3QgYm9keSBkYXRhLiBJZiBpdCBmaW5kcyBvbmUsIHRoYXRcbiAqIGRldmljZSBpcyB1cGRhdGVkLiBPdGhlcndpc2UgYSBuZXcgZGV2aWNlIGlzIGNyZWF0ZWQgYW5kIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuIFRoZSB1cGRhdGVkXG4gKiBkZXZpY2UgcmVnaXN0cmF0aW9uIHJlY29yZCB0aGVuIGlzIHNlbnQgYXMgcmVzcG9uc2UgYm9keSBkYXRhLlxuICpcbiAqIEBwYXJhbSByZWdpc3RyYXRpb25JZCB0byByZWdpc3Rlci5cbiAqIEByZXR1cm4gcHJvbWlzZSBvZiByZWdpc3RlcmVkIGRldmljZS5cbiAqXG4gKiBAaW50ZXJuYWwgU0RLIGNsaWVudCBjb2RlIG11c3QgY2FsbCBjb25maWd1cmVQdXNoRGV2aWNlKCkgd2hpY2ggb2J0YWlucyB0aGUgdG9rZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclB1c2hEZXZpY2UocmVnaXN0cmF0aW9uSWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogUmVnaXN0cmF0aW9uT3B0aW9ucyA9IHt9KTogUS5Qcm9taXNlPERldmljZT4ge1xuICBjb25zdCB1c2VyID0gc2VydmVyLmdldEN1cnJlbnRBdXRob3JpemF0aW9uKCkubmFtZTtcbiAgY29uc3QgcHVzaEluaXRPcHRpb25zID0gaW5pdC5pbml0T3B0aW9ucy5wdXNoO1xuICByZXR1cm4gZGV2aWNlLnJlYWR5LnRoZW4oKGluZm8pID0+IHtcbiAgICBsZXQgcHJvdmlkZXJUeXBlOiBQcm92aWRlclR5cGU7XG4gICAgc3dpdGNoIChpbmZvLnBsYXRmb3JtLmlkKSB7XG4gICAgICBjYXNlICdhbmRyb2lkJzpcbiAgICAgICAgcHJvdmlkZXJUeXBlID0gJ0dDTSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW9zJzpcbiAgICAgICAgLy8gd2hlbiBhIHNlbmRlcklEIGlzIGNvbmZpZ3VyZWQsXG4gICAgICAgIC8vIGlPUyBkZXZpY2UgaXMgcmVnaXN0ZXJlZCBhdCBBUE5TIHdoaWNoIGdlbmVyYXRlcyBhIHRva2VuIHJlZ2lzdGVyZWQgaW4gdHVybiBhdCBHQ00sXG4gICAgICAgIC8vIHNvIHRoYXQgcHVzaGVzIGFyZSBzZW5kIHVzaW5nIEdDTSB0byBlaXRoZXIgdHlwZSBvZiBkZXZpY2UuXG4gICAgICAgIHByb3ZpZGVyVHlwZSA9IHB1c2hJbml0T3B0aW9ucy5pb3Muc2VuZGVySUQgPyAnR0NNJyA6ICdBUE5TJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3aW5kb3dzcGhvbmUnOlxuICAgICAgICBwcm92aWRlclR5cGUgPSAnV05TJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdibGFja2JlcnJ5JzpcbiAgICAgICAgcHJvdmlkZXJUeXBlID0gJ1BBUCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcHJvdmlkZXJUeXBlID0gJ01DQVAnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZGlhZy5kZWJ1Zy5hc3NlcnQoISFpbmZvLmRldmljZSwgJ1RoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG1vYmlsZSBkZXZpY2VzIG9ubHkhJyk7XG4gICAgcmV0dXJuIDxEZXZpY2U+e1xuICAgICAgdXVpZDogbnVsbCxcbiAgICAgIHByb3ZpZGVyVHlwZTogcHJvdmlkZXJUeXBlLFxuICAgICAgdG9rZW46IHJlZ2lzdHJhdGlvbklkLFxuXG4gICAgICB1c2VyOiB1c2VyLFxuICAgICAgZGV2aWNlSWRlbnRpZmllcjogaW5mby51dWlkLFxuICAgICAgdmVuZG9yOiBpbmZvLmRldmljZS5tYW51ZmFjdHVyZXIsXG4gICAgICBuYW1lOiBpbmZvLmRldmljZS5uYW1lLFxuICAgICAgb3NWZXJzaW9uOiBpbmZvLmRldmljZS52ZXJzaW9uLFxuICAgICAgbW9kZWw6IGluZm8uZGV2aWNlLm1vZGVsLFxuICAgICAgdHlwZTogaW5mby5kZXZpY2UubmFtZSxcblxuICAgICAgYXBwUGFja2FnZU5hbWU6IGluZm8uZGV2aWNlLmFwcElkZW50aWZpZXIsXG4gICAgICBhcHBWZXJzaW9uOiBpbmZvLmRldmljZS5hcHBWZXJzaW9uQ29kZSB8fCBpbmZvLmRldmljZS5hcHBWZXJzaW9uTmFtZSxcblxuICAgICAgYXR0cmlidXRlczogb3B0aW9ucy5hdHRyaWJ1dGVzLFxuICAgICAgdGFnczogb3B0aW9ucy50YWdzLFxuICAgICAgYmFkZ2U6IG9wdGlvbnMuYmFkZ2VcbiAgICB9O1xuICB9KS50aGVuKChkZXZpY2U6IERldmljZSkgPT4ge1xuICAgIGRpYWcuZGVidWcuYXNzZXJ0KGRldmljZS5wcm92aWRlclR5cGUgIT09ICdQQVAnLCAnUmVsdXRpb24gU2VydmVyIGRvZXMgbm90IHlldCBzdXBwb3J0IHRoaXMhJyk7XG4gICAgZGlhZy5kZWJ1Zy5hc3NlcnQoZGV2aWNlLnByb3ZpZGVyVHlwZSAhPT0gJ01DQVAnLCAnUmVsdXRpb24gU0RLIGRvZXMgbm90IHlldCBpbXBsZW1lbnQgdGhpcyEnKTtcbiAgICByZXR1cm4gd2ViLnBvc3Q8RGV2aWNlPihwdXNoVXJsICsgJy9yZWdpc3RyYXRpb24nLCBkZXZpY2UpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBwb3N0cyBwdXNoIG5vdGlmaWNhdGlvbihzKS5cbiAqXG4gKiBVc3VhbGx5IHRoZSBzZXJ2ZXIgc2VuZHMgcHVzaCBub3RpZmljYXRpb25zIG9uIGl0cyBvd24gYmVoYWxmLiBIb3dldmVyLCB0aGlzIG1ldGhvZCBtYXkgYmUgdXNlZFxuICogYnkgdGhlIGNsaWVudCBhcHAgaXRzZWxmIHRvIHNlbmQgcHVzaCBub3RpZmljYXRpb25zIGVpdGhlciB0byBvdGhlciBjbGllbnRzLCBvciB0byBpdHNlbGYgd2hpY2hcbiAqIGNhbiBiZSB1c2VkIHRvIHRlc3QgY29ubmVjdGl2aXR5LlxuICpcbiAqIFRoZSBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gYmFja2VuZCBjb2RlIGdlbmVyYXRlZCBieSBDTEkgd2hpY2ggZm9yd2FyZHMgdGhlIGJvZHkgSlNPTiB0byB0aGVcbiAqIHNlcnZlci1zaWRlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSBtZXNzYWdlIHRvIGRlbGl2ZXIuXG4gKiBAcmV0dXJucyBwcm9taXNlIG9mIGFzeW5jIGV4ZWN1dGlvbiByZXNvbHZpbmcgdG8gVVVJRHMgb2Ygam9icyBpbiBhc3luY2hyb25vdXMgZGVsaXZlcnksXG4gKiAgICBlbXB0eSB3aGVuIG5vIGFwcHMgb3IgZGV2aWNlcyBnb3Qgc2VsZWN0ZWQgYnkgdGhlIG1lc3NhZ2UgY3JpdGVyaWEgb3IgbnVsbCB3aGVuIG5vXG4gKiBcdFx0dGFyZ2V0IGFwcHMgb3IgZGV2aWNlcyBleGlzdCBhdCBhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3N0UHVzaE5vdGlmaWNhdGlvbihtZXNzYWdlOiBKb2IpOiBRLlByb21pc2U8c3RyaW5nW10+IHtcbiAgcmV0dXJuIHdlYi5wb3N0PHN0cmluZ1tdPihwdXNoVXJsLCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBjcmVhdGVzIGEgZGV2aWNlIGZpbHRlciBmb3IgdGhlIHVzZXIgYXR0cmlidXRlIG9mIHB1c2ggZGV2aWNlcyBtYXRjaGluZyBhbnkgb2YgYSBnaXZlbiBzZXQgb2ZcbiAqIHVzZXJzLlxuICpcbiAqIEBwYXJhbSB1c2VycyogdG8gZmlsdGVyIG9uLlxuICogQHJldHVybnMgZGV2aWNlIGZpbHRlciBtYXRjaGluZyBkZXZpY2VzIG9mIGdpdmVuIHVzZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVzaERldmljZUZpbHRlckJ5VXNlcnMoLi4udXNlcnM6IChVc2VyIHwgc3RyaW5nKVtdKTogRmlsdGVyIHtcbiAgaWYgKHVzZXJzLmxlbmd0aCA8PSAwKSB7XG4gICAgcmV0dXJuIDxOdWxsRmlsdGVyPntcbiAgICAgIHR5cGU6ICdudWxsJyxcbiAgICAgIGZpZWxkTmFtZTogJ3VzZXInLFxuICAgICAgaXNOdWxsOiB0cnVlXG4gICAgfTtcbiAgfSBlbHNlIGlmICh1c2Vycy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gPFN0cmluZ0ZpbHRlcj57XG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGZpZWxkTmFtZTogJ3VzZXInLFxuICAgICAgdmFsdWU6IGRvbWFpbi51dWlkT2YodXNlcnNbMF0pXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB1dWlkcyA9IHVzZXJzLm1hcCgodXNlcikgPT4gZG9tYWluLnV1aWRPZih1c2VyKSk7XG4gICAgcmV0dXJuIDxTdHJpbmdFbnVtRmlsdGVyPntcbiAgICAgIHR5cGU6ICdzdHJpbmdFbnVtJyxcbiAgICAgIGZpZWxkTmFtZTogJ3VzZXInLFxuICAgICAgdmFsdWVzOiB1dWlkc1xuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBnZXRzIHB1c2ggbm90aWZpY2F0aW9uIHN0YXR1cy5cbiAqXG4gKiBUaGUgaW1wbGVtZW50YXRpb24gcmVsaWVzIG9uIGJhY2tlbmQgY29kZSBnZW5lcmF0ZWQgYnkgQ0xJIHdoaWNoIHVzZXMgdGhlIHNlcnZlci1zaWRlXG4gKiBQdXNoU2VydmljZSB0byBxdWVyeSBmb3IgSm9iIGJ5IHV1aWQuXG4gKlxuICogQHBhcmFtIHV1aWRPck1lc3NhZ2UgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyBwcm9taXNlIG9mIGFzeW5jIGV4ZWN1dGlvbiByZXNvbHZpbmcgdG8gcHVzaCBKb2IgaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaFB1c2hOb3RpZmljYXRpb24odXVpZE9yTWVzc2FnZTogc3RyaW5nIHwgSm9iKTogUS5Qcm9taXNlPEpvYj4ge1xuICBjb25zdCB1dWlkID0gXy5pc1N0cmluZyh1dWlkT3JNZXNzYWdlKSA/IHV1aWRPck1lc3NhZ2UgOiB1dWlkT3JNZXNzYWdlLnV1aWQ7XG4gIHJldHVybiB3ZWIuZ2V0PEpvYj4ocHVzaFVybCArICcvJyArIHV1aWQpO1xufVxuIl19