plugin-loader.js 7.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const fs = require("fs");
  4. const path = require("path");
  5. const hook = require("require-in-the-middle");
  6. const constants_1 = require("../constants");
  7. var HookState;
  8. (function (HookState) {
  9. HookState[HookState["UNINITIALIZED"] = 0] = "UNINITIALIZED";
  10. HookState[HookState["ENABLED"] = 1] = "ENABLED";
  11. HookState[HookState["DISABLED"] = 2] = "DISABLED";
  12. })(HookState || (HookState = {}));
  13. class PluginLoader {
  14. constructor(logger, tracer) {
  15. this.plugins = [];
  16. this.hookState = HookState.UNINITIALIZED;
  17. this.tracer = tracer;
  18. this.logger = logger;
  19. }
  20. static defaultPackageName(moduleName) {
  21. return `${constants_1.Constants.OPENCENSUS_SCOPE}/${constants_1.Constants.DEFAULT_PLUGIN_PACKAGE_NAME_PREFIX}-${moduleName}`;
  22. }
  23. static defaultPluginsFromArray(modulesToPatch) {
  24. const plugins = modulesToPatch.reduce((plugins, moduleName) => {
  25. plugins[moduleName] = PluginLoader.defaultPackageName(moduleName);
  26. return plugins;
  27. }, {});
  28. return plugins;
  29. }
  30. getPackageVersion(name, basedir) {
  31. let version = '';
  32. if (basedir) {
  33. const pkgJson = path.join(basedir, 'package.json');
  34. try {
  35. version = JSON.parse(fs.readFileSync(pkgJson).toString()).version;
  36. }
  37. catch (e) {
  38. this.logger.error('could not get version of %s module: %s', name, e.message);
  39. }
  40. }
  41. else {
  42. version = process.versions.node;
  43. }
  44. return version;
  45. }
  46. loadPlugins(pluginList) {
  47. if (this.hookState === HookState.UNINITIALIZED) {
  48. hook(Object.keys(pluginList), (exports, name, basedir) => {
  49. if (this.hookState !== HookState.ENABLED) {
  50. return exports;
  51. }
  52. const plugin = pluginList[name];
  53. const version = this.getPackageVersion(name, basedir);
  54. this.logger.info('trying loading %s.%s', name, version);
  55. if (!version) {
  56. return exports;
  57. }
  58. this.logger.debug('applying patch to %s@%s module', name, version);
  59. let moduleName;
  60. let moduleConfig = {};
  61. if (typeof plugin === 'string') {
  62. moduleName = plugin;
  63. }
  64. else {
  65. moduleConfig = plugin.config;
  66. moduleName = plugin.module;
  67. }
  68. this.logger.debug('using package %s to patch %s', moduleName, name);
  69. try {
  70. const plugin = require(moduleName).plugin;
  71. this.plugins.push(plugin);
  72. return plugin.enable(exports, this.tracer, version, moduleConfig, basedir);
  73. }
  74. catch (e) {
  75. this.logger.error('could not load plugin %s of module %s. Error: %s', moduleName, name, e.message);
  76. return exports;
  77. }
  78. });
  79. }
  80. this.hookState = HookState.ENABLED;
  81. }
  82. unloadPlugins() {
  83. for (const plugin of this.plugins) {
  84. plugin.disable();
  85. }
  86. this.plugins = [];
  87. this.hookState = HookState.DISABLED;
  88. }
  89. static set searchPathForTest(searchPath) {
  90. module.paths.push(searchPath);
  91. }
  92. }
  93. exports.PluginLoader = PluginLoader;
  94. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jZW5zdXMvaW5zdHJ1bWVudGF0aW9uL3BsdWdpbi1sb2FkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFpQkEseUJBQXdCO0FBQ3hCLDZCQUE0QjtBQUM1Qiw4Q0FBNkM7QUFFN0MsNENBQXdDO0FBRXhDLElBQUssU0FJSjtBQUpELFdBQUssU0FBUztJQUNaLDJEQUFhLENBQUE7SUFDYiwrQ0FBTyxDQUFBO0lBQ1AsaURBQVEsQ0FBQTtBQUNWLENBQUMsRUFKSSxTQUFTLEtBQVQsU0FBUyxRQUliO0FBT0QsTUFBYSxZQUFZO0lBaUJ2QixZQUFhLE1BQWMsRUFBRSxNQUFjO1FBWDNDLFlBQU8sR0FBYSxFQUFFLENBQUE7UUFLZCxjQUFTLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQTtRQU96QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtJQUN0QixDQUFDO0lBUU8sTUFBTSxDQUFDLGtCQUFrQixDQUFFLFVBQWtCO1FBQ25ELE9BQU8sR0FBRyxxQkFBUyxDQUFDLGdCQUFnQixJQUNoQyxxQkFBUyxDQUFDLGtDQUFrQyxJQUFJLFVBQVUsRUFBRSxDQUFBO0lBQ2xFLENBQUM7SUFRRCxNQUFNLENBQUMsdUJBQXVCLENBQUUsY0FBd0I7UUFDdEQsTUFBTSxPQUFPLEdBQ1QsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQW9CLEVBQUUsVUFBa0IsRUFBRSxFQUFFO1lBQ2pFLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDakUsT0FBTyxPQUFPLENBQUE7UUFDaEIsQ0FBQyxFQUFFLEVBQWlCLENBQUMsQ0FBQTtRQUN6QixPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBT08saUJBQWlCLENBQUUsSUFBWSxFQUFFLE9BQWU7UUFDdEQsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFBO1FBQ2hCLElBQUksT0FBTyxFQUFFO1lBQ1gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUE7WUFDbEQsSUFBSTtnQkFDRixPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFBO2FBQ2xFO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2Isd0NBQXdDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTthQUMvRDtTQUNGO2FBQU07WUFDTCxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUE7U0FDaEM7UUFDRCxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBVUQsV0FBVyxDQUFFLFVBQXVCO1FBQ2xDLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsYUFBYSxFQUFFO1lBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRTtnQkFDdkQsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxPQUFPLEVBQUU7b0JBQ3hDLE9BQU8sT0FBTyxDQUFBO2lCQUNmO2dCQUNELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxPQUFpQixDQUFDLENBQUE7Z0JBQy9ELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtnQkFDdkQsSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDWixPQUFPLE9BQU8sQ0FBQTtpQkFDZjtnQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7Z0JBRWxFLElBQUksVUFBVSxDQUFBO2dCQUNkLElBQUksWUFBWSxHQUFpQixFQUFFLENBQUE7Z0JBQ25DLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO29CQUM5QixVQUFVLEdBQUcsTUFBTSxDQUFBO2lCQUNwQjtxQkFBTTtvQkFDTCxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQTtvQkFDNUIsVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUE7aUJBQzNCO2dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDhCQUE4QixFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQTtnQkFHbkUsSUFBSTtvQkFDRixNQUFNLE1BQU0sR0FBVyxPQUFPLENBQUMsVUFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQTtvQkFDM0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7b0JBQ3pCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFBO2lCQUMzRTtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDVixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDYixrREFBa0QsRUFBRSxVQUFVLEVBQzlELElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUE7b0JBQ3BCLE9BQU8sT0FBTyxDQUFBO2lCQUNmO1lBQ0gsQ0FBQyxDQUFDLENBQUE7U0FDSDtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQTtJQUNwQyxDQUFDO0lBR0QsYUFBYTtRQUNYLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7U0FDakI7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQTtRQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUE7SUFDckMsQ0FBQztJQU1ELE1BQU0sS0FBSyxpQkFBaUIsQ0FBRSxVQUFrQjtRQUM5QyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUMvQixDQUFDO0NBQ0Y7QUFySUQsb0NBcUlDIn0=