utils.js 3.2 KB

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