diff --git a/packages/server/src/integrations/index.ts b/packages/server/src/integrations/index.ts index b9523061a4..7b730a1764 100644 --- a/packages/server/src/integrations/index.ts +++ b/packages/server/src/integrations/index.ts @@ -93,7 +93,11 @@ module.exports = { for (let plugin of plugins) { if (plugin.name === integration) { // need to use commonJS require due to its dynamic runtime nature - return getDatasourcePlugin(plugin.name, plugin.jsUrl) + return getDatasourcePlugin( + plugin.name, + plugin.jsUrl, + plugin.schema?.hash + ) } } }, diff --git a/packages/server/src/utilities/fileSystem/index.js b/packages/server/src/utilities/fileSystem/index.js index f937f172b5..096212864c 100644 --- a/packages/server/src/utilities/fileSystem/index.js +++ b/packages/server/src/utilities/fileSystem/index.js @@ -351,13 +351,20 @@ exports.extractPluginTarball = async file => { return { metadata, directory: path } } -exports.getDatasourcePlugin = async (name, url) => { +exports.getDatasourcePlugin = async (name, url, hash) => { if (!fs.existsSync(DATASOURCE_PATH)) { fs.mkdirSync(DATASOURCE_PATH) } const filename = join(DATASOURCE_PATH, name) + const metadataName = `${filename}.bbmetadata` if (fs.existsSync(filename)) { - return require(filename) + const currentHash = fs.readFileSync(metadataName, "utf8") + // if hash is the same return the file, otherwise remove it and re-download + if (currentHash === hash) { + return require(filename) + } else { + fs.unlinkSync(filename) + } } const fullUrl = checkSlashesInUrl( `${env.MINIO_URL}/${ObjectStoreBuckets.PLUGINS}/${url}` @@ -366,6 +373,7 @@ exports.getDatasourcePlugin = async (name, url) => { if (response.status === 200) { const content = await response.text() fs.writeFileSync(filename, content) + fs.writeFileSync(metadataName, hash) require(filename) } else { throw new Error(