utils.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /* eslint-disable compat/compat */
  2. /* global window, capabilities */
  3. const path = require('path')
  4. const { spawn } = require('child_process')
  5. // This function must be valid ES5, because it is run in the browser
  6. // and IE10/IE11 do not support new syntax features
  7. function selectFakeFile (uppyID, name, type, b64) {
  8. if (!b64) b64 = 'PHN2ZyB2aWV3Qm94PSIwIDAgMTIwIDEyMCI+CiAgPGNpcmNsZSBjeD0iNjAiIGN5PSI2MCIgcj0iNTAiLz4KPC9zdmc+Cg=='
  9. if (!type) type = 'image/svg+xml'
  10. // https://stackoverflow.com/questions/16245767/creating-a-blob-from-a-base64-string-in-javascript
  11. function base64toBlob (base64Data, contentType) {
  12. contentType = contentType || ''
  13. var sliceSize = 1024
  14. var byteCharacters = atob(base64Data)
  15. var bytesLength = byteCharacters.length
  16. var slicesCount = Math.ceil(bytesLength / sliceSize)
  17. var byteArrays = new Array(slicesCount)
  18. for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {
  19. var begin = sliceIndex * sliceSize
  20. var end = Math.min(begin + sliceSize, bytesLength)
  21. var bytes = new Array(end - begin)
  22. for (var offset = begin, i = 0; offset < end; ++i, ++offset) {
  23. bytes[i] = byteCharacters[offset].charCodeAt(0)
  24. }
  25. byteArrays[sliceIndex] = new Uint8Array(bytes)
  26. }
  27. return new Blob(byteArrays, { type: contentType })
  28. }
  29. var blob = base64toBlob(b64, type)
  30. window[uppyID].addFile({
  31. source: 'test',
  32. name: name || 'test-file',
  33. type: blob.type,
  34. data: blob
  35. })
  36. }
  37. function supportsChooseFile () {
  38. // Webdriver for Safari and Edge doesn’t support .chooseFile
  39. return capabilities.browserName !== 'Safari' &&
  40. capabilities.browserName !== 'MicrosoftEdge' &&
  41. capabilities.platformName !== 'Android'
  42. }
  43. function prematureExit () {
  44. throw new Error('Companion exited early')
  45. }
  46. class CompanionService {
  47. onPrepare () {
  48. this.companion = spawn('node', [
  49. path.join(__dirname, '../../packages/@uppy/companion/lib/standalone/start-server')
  50. ], {
  51. stdio: 'pipe',
  52. env: Object.assign({}, process.env, {
  53. COMPANION_DATADIR: path.join(__dirname, '../../output'),
  54. COMPANION_DOMAIN: 'localhost:3030',
  55. COMPANION_PROTOCOL: 'http',
  56. COMPANION_PORT: 3030,
  57. COMPANION_SECRET: process.env.TEST_COMPANION_SECRET,
  58. COMPANION_DROPBOX_KEY: process.env.TEST_COMPANION_DROPBOX_KEY,
  59. COMPANION_DROPBOX_SECRET: process.env.TEST_COMPANION_DROPBOX_SECRET,
  60. COMPANION_GOOGLE_KEY: process.env.TEST_COMPANION_GOOGLE_KEY,
  61. COMPANION_GOOGLE_SECRET: process.env.TEST_COMPANION_GOOGLE_SECRET
  62. })
  63. })
  64. return new Promise((resolve, reject) => {
  65. this.companion.on('error', reject)
  66. this.companion.stdout.on('data', (chunk) => {
  67. if (`${chunk}`.includes('Listening on')) {
  68. resolve()
  69. }
  70. })
  71. this.companion.on('error', console.error)
  72. this.companion.stderr.pipe(process.stderr)
  73. this.companion.on('exit', prematureExit)
  74. })
  75. }
  76. onComplete () {
  77. return new Promise((resolve) => {
  78. this.companion.removeListener('exit', prematureExit)
  79. this.companion.on('exit', () => resolve())
  80. this.companion.kill('SIGINT')
  81. })
  82. }
  83. }
  84. module.exports = {
  85. selectFakeFile,
  86. supportsChooseFile,
  87. CompanionService
  88. }