@budibase/server 0.9.169-alpha.3 → 0.9.169-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/builder/assets/{index.c4a1fb7f.css → index.0ea76a5c.css} +1 -1
  2. package/builder/assets/{index.e702a75a.js → index.45b6b02b.js} +1 -1
  3. package/builder/index.html +2 -2
  4. package/coverage/clover.xml +3 -3
  5. package/coverage/coverage-final.json +1 -1
  6. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/application.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/backup.js.html +6 -9
  12. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/hosting.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/index.html +1 -1
  18. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/query.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  44. package/coverage/lcov-report/api/index.html +1 -1
  45. package/coverage/lcov-report/api/index.js.html +1 -1
  46. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  47. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/index.html +1 -1
  59. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  76. package/coverage/lcov-report/automations/actions.js.html +1 -1
  77. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  78. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  79. package/coverage/lcov-report/automations/index.html +1 -1
  80. package/coverage/lcov-report/automations/index.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/index.html +1 -1
  90. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  99. package/coverage/lcov-report/automations/thread.js.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  109. package/coverage/lcov-report/automations/utils.js.html +1 -1
  110. package/coverage/lcov-report/constants/index.html +1 -1
  111. package/coverage/lcov-report/constants/index.js.html +1 -1
  112. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  113. package/coverage/lcov-report/constants/screens.js.html +1 -1
  114. package/coverage/lcov-report/db/client.js.html +1 -1
  115. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  116. package/coverage/lcov-report/db/index.html +1 -1
  117. package/coverage/lcov-report/db/index.js.html +1 -1
  118. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  119. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  120. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  121. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  122. package/coverage/lcov-report/db/newid.js.html +1 -1
  123. package/coverage/lcov-report/db/utils.js.html +1 -1
  124. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  125. package/coverage/lcov-report/events/index.html +1 -1
  126. package/coverage/lcov-report/events/index.js.html +1 -1
  127. package/coverage/lcov-report/events/utils.js.html +1 -1
  128. package/coverage/lcov-report/index.html +1 -1
  129. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  130. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  131. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  132. package/coverage/lcov-report/middleware/authorized.js.html +1 -1
  133. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  134. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  135. package/coverage/lcov-report/middleware/index.html +1 -1
  136. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  137. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  138. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  139. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  140. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  141. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  142. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  143. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  144. package/coverage/lcov-report/utilities/global.js.html +1 -1
  145. package/coverage/lcov-report/utilities/index.html +1 -1
  146. package/coverage/lcov-report/utilities/index.js.html +1 -1
  147. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  148. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  149. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  150. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  151. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  152. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  153. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  154. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  155. package/coverage/lcov-report/utilities/security.js.html +1 -1
  156. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  157. package/coverage/lcov-report/utilities/users.js.html +1 -1
  158. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  159. package/coverage/lcov.info +1 -1
  160. package/dist/api/controllers/backup.js +4 -4
  161. package/dist/package.json +4 -4
  162. package/dist/tsconfig.tsbuildinfo +1 -1
  163. package/dist/utilities/fileSystem/index.js +49 -33
  164. package/package.json +5 -5
  165. package/src/api/controllers/backup.js +4 -5
  166. package/src/utilities/fileSystem/index.js +65 -43
@@ -98,53 +98,69 @@ exports.apiFileReturn = contents => {
98
98
  fs.writeFileSync(path, contents);
99
99
  return fs.createReadStream(path);
100
100
  };
101
+ /**
102
+ * Local utility to back up the database state for an app, excluding global user
103
+ * data or user relationships.
104
+ * @param {string} appId The app to backup
105
+ * @param {object} config Config to send to export DB
106
+ * @returns {*} either a string or a stream of the backup
107
+ */
108
+ const backupAppData = (appId, config) => __awaiter(void 0, void 0, void 0, function* () {
109
+ return yield exports.exportDB(appId, Object.assign(Object.assign({}, config), { filter: doc => !(doc._id.includes(USER_METDATA_PREFIX) ||
110
+ doc._id.includes(LINK_USER_METADATA_PREFIX)) }));
111
+ });
101
112
  /**
102
113
  * Takes a copy of the database state for an app to the object store.
103
114
  * @param {string} appId The ID of the app which is to be backed up.
104
115
  * @param {string} backupName The name of the backup located in the object store.
105
- * @return The backup has been completed when this promise completes and returns a file stream
106
- * to the temporary backup file (to return via API if required).
116
+ * @return {*} a readable stream to the completed backup file
107
117
  */
108
118
  exports.performBackup = (appId, backupName) => __awaiter(void 0, void 0, void 0, function* () {
109
- return exports.exportDB(appId, {
110
- exportName: backupName,
111
- filter: doc => !(doc._id.includes(USER_METDATA_PREFIX) ||
112
- doc.includes(LINK_USER_METADATA_PREFIX)),
113
- });
119
+ return yield backupAppData(appId, { exportName: backupName });
114
120
  });
115
121
  /**
116
- * exports a DB to either file or a variable (memory).
122
+ * Streams a backup of the database state for an app
123
+ * @param {string} appId The ID of the app which is to be backed up.
124
+ * @returns {*} a readable stream of the backup which is written in real time
125
+ */
126
+ exports.streamBackup = (appId) => __awaiter(void 0, void 0, void 0, function* () {
127
+ return yield backupAppData(appId, { stream: true });
128
+ });
129
+ /**
130
+ * Exports a DB to either file or a variable (memory).
117
131
  * @param {string} dbName the DB which is to be exported.
118
- * @param {string} exportName optional - the file name to export to, if not in memory.
132
+ * @param {string} exportName optional - provide a filename to write the backup to a file
133
+ * @param {boolean} stream optional - whether to perform a full backup
119
134
  * @param {function} filter optional - a filter function to clear out any un-wanted docs.
120
- * @return Either the file stream or the variable (if no export name provided).
135
+ * @return {*} either a readable stream or a string
121
136
  */
122
- exports.exportDB = (dbName, { exportName, filter } = { exportName: undefined, filter: undefined }) => __awaiter(void 0, void 0, void 0, function* () {
123
- let stream, appString = "", path = null;
124
- if (exportName) {
125
- path = join(budibaseTempDir(), exportName);
126
- stream = fs.createWriteStream(path);
127
- }
128
- else {
129
- stream = new MemoryStream();
130
- stream.on("data", chunk => {
131
- appString += chunk.toString();
132
- });
133
- }
134
- // perform couch dump
137
+ exports.exportDB = (dbName, { stream, filter, exportName } = {}) => __awaiter(void 0, void 0, void 0, function* () {
135
138
  const instanceDb = new CouchDB(dbName);
136
- yield instanceDb.dump(stream, {
137
- filter,
138
- });
139
- // just in memory, return the final string
140
- if (!exportName) {
141
- return appString;
139
+ // Stream the dump if required
140
+ if (stream) {
141
+ const memStream = new MemoryStream();
142
+ instanceDb.dump(memStream, { filter });
143
+ return memStream;
142
144
  }
143
- // write the file to the object store
144
- if (env.SELF_HOSTED) {
145
- yield streamUpload(ObjectStoreBuckets.BACKUPS, join(dbName, exportName), fs.createReadStream(path));
145
+ // Write the dump to file if required
146
+ if (exportName) {
147
+ const path = join(budibaseTempDir(), exportName);
148
+ const writeStream = fs.createWriteStream(path);
149
+ yield instanceDb.dump(writeStream, { filter });
150
+ // Upload the dump to the object store if self hosted
151
+ if (env.SELF_HOSTED) {
152
+ yield streamUpload(ObjectStoreBuckets.BACKUPS, join(dbName, exportName), fs.createReadStream(path));
153
+ }
154
+ return fs.createReadStream(path);
146
155
  }
147
- return fs.createReadStream(path);
156
+ // Stringify the dump in memory if required
157
+ const memStream = new MemoryStream();
158
+ let appString = "";
159
+ memStream.on("data", chunk => {
160
+ appString += chunk.toString();
161
+ });
162
+ yield instanceDb.dump(memStream, { filter });
163
+ return appString;
148
164
  });
149
165
  /**
150
166
  * Writes the provided contents to a temporary file, which can be used briefly.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "0.9.169-alpha.3",
4
+ "version": "0.9.169-alpha.4",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.js",
7
7
  "repository": {
@@ -68,9 +68,9 @@
68
68
  "author": "Budibase",
69
69
  "license": "AGPL-3.0-or-later",
70
70
  "dependencies": {
71
- "@budibase/auth": "^0.9.169-alpha.3",
72
- "@budibase/client": "^0.9.169-alpha.3",
73
- "@budibase/string-templates": "^0.9.169-alpha.3",
71
+ "@budibase/auth": "^0.9.169-alpha.4",
72
+ "@budibase/client": "^0.9.169-alpha.4",
73
+ "@budibase/string-templates": "^0.9.169-alpha.4",
74
74
  "@elastic/elasticsearch": "7.10.0",
75
75
  "@koa/router": "8.0.0",
76
76
  "@sendgrid/mail": "7.1.1",
@@ -149,5 +149,5 @@
149
149
  "typescript": "^4.3.5",
150
150
  "update-dotenv": "^1.1.1"
151
151
  },
152
- "gitHead": "b6f6aacfacb83ca249adbc5f363ceade485262d2"
152
+ "gitHead": "65077556b1a5e4bef39d3b6b2631ab9094cdc65f"
153
153
  }
@@ -1,10 +1,9 @@
1
- const { performBackup } = require("../../utilities/fileSystem")
1
+ const { streamBackup } = require("../../utilities/fileSystem")
2
2
 
3
3
  exports.exportAppDump = async function (ctx) {
4
4
  const { appId } = ctx.query
5
- const appname = decodeURI(ctx.query.appname)
6
- const backupIdentifier = `${appname}Backup${new Date().getTime()}.txt`
7
-
5
+ const appName = decodeURI(ctx.query.appname)
6
+ const backupIdentifier = `${appName}-export-${new Date().getTime()}.txt`
8
7
  ctx.attachment(backupIdentifier)
9
- ctx.body = await performBackup(appId, backupIdentifier)
8
+ ctx.body = await streamBackup(appId)
10
9
  }
@@ -106,64 +106,86 @@ exports.apiFileReturn = contents => {
106
106
  }
107
107
 
108
108
  /**
109
- * Takes a copy of the database state for an app to the object store.
110
- * @param {string} appId The ID of the app which is to be backed up.
111
- * @param {string} backupName The name of the backup located in the object store.
112
- * @return The backup has been completed when this promise completes and returns a file stream
113
- * to the temporary backup file (to return via API if required).
109
+ * Local utility to back up the database state for an app, excluding global user
110
+ * data or user relationships.
111
+ * @param {string} appId The app to backup
112
+ * @param {object} config Config to send to export DB
113
+ * @returns {*} either a string or a stream of the backup
114
114
  */
115
- exports.performBackup = async (appId, backupName) => {
116
- return exports.exportDB(appId, {
117
- exportName: backupName,
115
+ const backupAppData = async (appId, config) => {
116
+ return await exports.exportDB(appId, {
117
+ ...config,
118
118
  filter: doc =>
119
119
  !(
120
120
  doc._id.includes(USER_METDATA_PREFIX) ||
121
- doc.includes(LINK_USER_METADATA_PREFIX)
121
+ doc._id.includes(LINK_USER_METADATA_PREFIX)
122
122
  ),
123
123
  })
124
124
  }
125
125
 
126
126
  /**
127
- * exports a DB to either file or a variable (memory).
127
+ * Takes a copy of the database state for an app to the object store.
128
+ * @param {string} appId The ID of the app which is to be backed up.
129
+ * @param {string} backupName The name of the backup located in the object store.
130
+ * @return {*} a readable stream to the completed backup file
131
+ */
132
+ exports.performBackup = async (appId, backupName) => {
133
+ return await backupAppData(appId, { exportName: backupName })
134
+ }
135
+
136
+ /**
137
+ * Streams a backup of the database state for an app
138
+ * @param {string} appId The ID of the app which is to be backed up.
139
+ * @returns {*} a readable stream of the backup which is written in real time
140
+ */
141
+ exports.streamBackup = async appId => {
142
+ return await backupAppData(appId, { stream: true })
143
+ }
144
+
145
+ /**
146
+ * Exports a DB to either file or a variable (memory).
128
147
  * @param {string} dbName the DB which is to be exported.
129
- * @param {string} exportName optional - the file name to export to, if not in memory.
148
+ * @param {string} exportName optional - provide a filename to write the backup to a file
149
+ * @param {boolean} stream optional - whether to perform a full backup
130
150
  * @param {function} filter optional - a filter function to clear out any un-wanted docs.
131
- * @return Either the file stream or the variable (if no export name provided).
151
+ * @return {*} either a readable stream or a string
132
152
  */
133
- exports.exportDB = async (
134
- dbName,
135
- { exportName, filter } = { exportName: undefined, filter: undefined }
136
- ) => {
137
- let stream,
138
- appString = "",
139
- path = null
140
- if (exportName) {
141
- path = join(budibaseTempDir(), exportName)
142
- stream = fs.createWriteStream(path)
143
- } else {
144
- stream = new MemoryStream()
145
- stream.on("data", chunk => {
146
- appString += chunk.toString()
147
- })
148
- }
149
- // perform couch dump
153
+ exports.exportDB = async (dbName, { stream, filter, exportName } = {}) => {
150
154
  const instanceDb = new CouchDB(dbName)
151
- await instanceDb.dump(stream, {
152
- filter,
153
- })
154
- // just in memory, return the final string
155
- if (!exportName) {
156
- return appString
155
+
156
+ // Stream the dump if required
157
+ if (stream) {
158
+ const memStream = new MemoryStream()
159
+ instanceDb.dump(memStream, { filter })
160
+ return memStream
157
161
  }
158
- // write the file to the object store
159
- if (env.SELF_HOSTED) {
160
- await streamUpload(
161
- ObjectStoreBuckets.BACKUPS,
162
- join(dbName, exportName),
163
- fs.createReadStream(path)
164
- )
162
+
163
+ // Write the dump to file if required
164
+ if (exportName) {
165
+ const path = join(budibaseTempDir(), exportName)
166
+ const writeStream = fs.createWriteStream(path)
167
+ await instanceDb.dump(writeStream, { filter })
168
+
169
+ // Upload the dump to the object store if self hosted
170
+ if (env.SELF_HOSTED) {
171
+ await streamUpload(
172
+ ObjectStoreBuckets.BACKUPS,
173
+ join(dbName, exportName),
174
+ fs.createReadStream(path)
175
+ )
176
+ }
177
+
178
+ return fs.createReadStream(path)
165
179
  }
166
- return fs.createReadStream(path)
180
+
181
+ // Stringify the dump in memory if required
182
+ const memStream = new MemoryStream()
183
+ let appString = ""
184
+ memStream.on("data", chunk => {
185
+ appString += chunk.toString()
186
+ })
187
+ await instanceDb.dump(memStream, { filter })
188
+ return appString
167
189
  }
168
190
 
169
191
  /**