1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Electronメインプロセス中にレンダラーのasarファイルをダウンロードして開く方法

Last updated at Posted at 2022-07-07

コード

  • 成功すればtrue、失敗すればfalseが返ってくる
  • fsではなくoriginal-fsを使用
  • バージョンアップで既存のモジュールが使えなくなるなど、保守性を考えて、デフォルトのhttpまたはhttpsでダウンロード
  • 今回はGoogleDriveに保存したasarファイルをDriveToWebでホスティングしていたため、asarファイルのように容量が大きいと303が返ってくるので再帰でもう一度リクエストを送っている

asarDownLoad.js
const https = require('https')
const originalfs = require('original-fs')

/**
 * http.get
 * asarのダウンロード・置き換え
 * @param {*} url ダウンロードするファイルのURL
 * @param {*} outURL 出力するファイルのURL
 */
const asarDownLoadTest = async (url, outURL) => {

    try {
        return await new Promise((resolve, reject) => {

            const req = https.get(url, async (res) => {

                console.log(res.statusCode) // 303が返ってくる
                console.log(res.statusMessage)

                // 303だった場合locationを見てそこから取得
                if (res.statusCode === 303) {
                    await asarDownLoadTest(res.headers.location, outURL) // 再帰
                    resolve(true) //trueを返す
                    return
                }
                // ダウンロードした内容をそのまま、ファイル書き出し。
                let total = 0 // 合計byte数
                let percent = 0 // %
                // データを取得する度に実行される
                res.on("data", (chunk) => {
                    total += chunk.length // これまで読み取ったbyte数
                    const length = res.headers['content-length']
                    if (percent !== parseInt(total / length * 100)) {
                        percent = parseInt(total / length * 100)
                        console.log(`${percent} %`)
                    }
                });
                // ダウンロードした内容をそのまま、ファイル書き出し。
                const outFile = originalfs.createWriteStream(outURL)
                res.pipe(outFile)

                // 終わったらファイルストリームをクローズ。
                res.on('end', () => {
                    console.log('end')
                    outFile.close()
                    resolve(true) // trueを返す
                })
            })

            // エラーがあれば扱う。
            req.on('error', (err) => {
                console.log('Error: ', err)
                reject(false) // falseを返す
            })
        })
    } catch (err) { // rejectのfalseをキャッチ
        console.log(err)
        return err // falseを返す
    }

}

exports.asarDownLoadTest = asarDownLoadTest
  • main.jsで実行
  • asarファイルの保存場所はapp.getPath('userData') + '/render.asar'にする
main.js
// モジュールロード
const { app, Menu, BrowserWindow, dialog } = require('electron')
const { asarDownLoad } = require('./asarDownLoad.js')

//一部抜粋

// asyncの中
// URLを指定 
const url = ''
// 出力ファイル名を指定
const outURL = app.getPath('userData') + '/render.asar'

const download =  await asarDownLoad(url, outURL) // ダウンロード開始
if (!download) { // 失敗時
   dialog.showErrorBox('Connection Failed','インターネットへの接続が失敗しました。インターネットに接続して、もう一度アプリを起動してください');
}

// メインウィンドウ起動 const win = new BrowserWindow({}) // 適宜設定してください
win.loadURL('file://' + app.getPath('userData') + '/render.asar/index.html') // asarの中のアプリを開く

なぜこのコードを書く必要があるのか?

  • 署名なしでフロント部分のアップデート機能を実装するため
  • メインプロセスが実行されて、レンダラープロセスに入り前にasarファイルを置き換える
  • 詳しくは以下の記事を参照してください

バージョン確認してからアップデートするかしないかを判断するのはまた今度

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?