Есть ли способ отследить событие с помощью firebase в электроне + реагировать - PullRequest
0 голосов
/ 14 июля 2020

Я хочу спросить, как отправить событие с помощью firebase и electronic. js. У моего друга возникла проблема при использовании firebase analytics и electronics: кажется, что электрон не отправляет никаких событий в консоль отладчика. Когда я вижу сеть, кажется, что функция не отправляет ничего, кроме текста go в консоли. может кто-нибудь помочь мне понять это? любой обходной путь подойдет, так как он сказал, что пытается реализовать решение в этом топе c

  1. firebase-analytics-log-event-not-working-in-production-build -of-electronics
  2. electronics-google-analytics

это ошибка, которую я получил, когда попытался использовать решение в пункте 2

the error I got when Using Lib in point 2

For information, my friend used this for the boiler plate электронная реакция-шаблон

Приведенное выше решение все еще не удалось. Может ли кто-нибудь помочь мне решить эту проблему?

РЕДАКТИРОВАТЬ 1:

This is the example of my code

If I run the code, it only gives a very basic screen of electron with the button to send the event

As you can see in the image above, the first image is my friend's code when you run it, it will give a very basic example like in the image 2 with a button to send an event.

ah just for information He used this firebase package :

https://www.npmjs.com/package/firebase

1 Ответ

2 голосов
/ 16 июля 2020

Вы можете перехватывать протокол HTTP и обрабатывать ваш stati c контент с помощью предоставленных методов, это позволит вам использовать протокол http:// для URL-адресов контента. Что должно заставить Firebase Analytics работать так, как указано в первом вопросе.

Ссылки

Пример

Это пример того, как вы можете обслуживать локальное приложение, загруженное по протоколу HTTP, и имитировать обычную работу браузера для использования протокола http со связанным веб-приложением. Это позволит вам добавить Firebase Analytics. Он плохо поддерживает загрузку данных HTTP, но вы можете сделать это самостоятельно в зависимости от целей.

index.js

const {app, BrowserWindow, protocol} = require('electron')
const http = require('http')
const {createReadStream, promises: fs} = require('fs')
const path = require('path')
const {PassThrough} = require('stream')

const mime = require('mime')

const MY_HOST = 'somehostname.example'

app.whenReady()
.then(async () => {
  await protocol.interceptStreamProtocol('http', (request, callback) => {
    const url = new URL(request.url)
    const {hostname} = url

    const isLocal = hostname === MY_HOST

    if (isLocal) {
      serveLocalSite({...request, url}, callback)
    }
    else {
      serveRegularSite({...request, url}, callback)
    }
  })

  const win = new BrowserWindow()
  win.loadURL(`http://${MY_HOST}/index.html`)
})
.catch((error) => {
  console.error(error)
  app.exit(1)
})

async function serveLocalSite(request, callback) {
  try {
    const {pathname} = request.url
    const filepath = path.join(__dirname, path.resolve('/', pathname))
    const stat = await fs.stat(filepath)

    if (stat.isFile() !== true) {
      throw new Error('Not a file')
    }

    callback(
      createResponse(
        200,
        {
          'content-type': mime.getType(path.extname(pathname)),
          'content-length': stat.size,
        },
        createReadStream(filepath)
      )
    )
  }
  catch (err) {
    callback(
      errorResponse(err)
    )
  }
}

function serveRegularSite(request, callback) {
  try {
    console.log(request)
    const req = http.request({
      url: request.url,
      host: request.url.host,
      port: request.url.port,
      method: request.method,
      headers: request.headers,
    })

    if (req.uploadData) {
      req.write(request.uploadData.bytes)
    }

    req.on('error', (error) => {
      callback(
        errorResponse(error)
      )
    })

    req.on('response', (res) => {
      console.log(res.statusCode, res.headers)
      callback(
        createResponse(
          res.statusCode,
          res.headers,
          res,
        )
      )
    })

    req.end()
  }
  catch (err) {
    callback(
      errorResponse(err)
    )
  }
}

function toStream(body) {
  const stream = new PassThrough()

  stream.write(body)
  stream.end()

  return stream
}

function errorResponse(error) {
  return createResponse(
    500,
    {
      'content-type': 'text/plain;charset=utf8',
    },
    error.stack
  )
}

function createResponse(statusCode, headers, body) {
  if ('content-length' in headers === false) {
    headers['content-length'] = Buffer.byteLength(body)
  }
  return {
    statusCode,
    headers,
    data: typeof body === 'object' ? body : toStream(body),
  }
}
  • MY_HOST - это любой несуществующий хост (например, something.example) или хост, который контролируется администратором (в моем случае это может быть electron-app.rumk.in). Этот хост будет служить заменой localhost.

index.html

<html>
<body>
   Hello
</body>
</html>
...