Skip to content

Commit

Permalink
feat(updater): Alpha version (#643)
Browse files Browse the repository at this point in the history
Co-authored-by: Rajiv Shah <rajivshah1@icloud.com>
Co-authored-by: Lucas Nogueira <lucas@tauri.studio>
Co-authored-by: nothingismagick <denjell@mailscript.com>
Co-authored-by: Laegel <valentin.chouaf@laposte.net>
  • Loading branch information
5 people committed Apr 5, 2021
1 parent 2ea56cf commit 6d70c8e
Show file tree
Hide file tree
Showing 94 changed files with 7,572 additions and 697 deletions.
3 changes: 1 addition & 2 deletions .changes/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -185,8 +185,7 @@
},
"tauri-updater": {
"path": "./tauri-updater",
"manager": "rust",
"publish": false
"manager": "rust"
},
"tauri": {
"path": "./tauri",
Expand Down
8 changes: 8 additions & 0 deletions .changes/updater-alpha.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"tauri-updater": minor
"tauri-cli": minor
"tauri-bundler": minor
"tauri": minor
---

Alpha version of tauri-updater. Please refer to the `README` for more details.
62 changes: 62 additions & 0 deletions .github/workflows/artifacts-updater.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
name: updater test artifacts
on:
pull_request:
paths:
- '.github/workflows/artifacts-updater.yml'
- 'tauri/**'
- 'tauri-updater/**'
- 'cli/core/**'
- 'cli/tauri-bundler/**'
- 'examples/updater/**'

jobs:
build-artifacs:
runs-on: ${{ matrix.platform }}

strategy:
fail-fast: false
matrix:
platform: [ubuntu-latest, macos-latest, windows-latest]

steps:
- uses: actions/checkout@v2
- name: install stable
uses: actions-rs/toolchain@v1
with:
toolchain: stable
- name: install webkit2gtk (ubuntu only)
if: matrix.platform == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y webkit2gtk-4.0
- run: cargo install --path ./cli/core --force
- name: install cli deps via yarn
working-directory: ./cli/tauri.js
run: yarn
- name: build cli
working-directory: ./cli/tauri.js
run: yarn build
- name: build sample artifacts (updater)
working-directory: ./examples/updater
run: |
yarn install
node ../../cli/tauri.js/bin/tauri build
env:
TAURI_PRIVATE_KEY: dW50cnVzdGVkIGNvbW1lbnQ6IHJzaWduIGVuY3J5cHRlZCBzZWNyZXQga2V5ClJXUlRZMEl5YTBGV3JiTy9lRDZVd3NkL0RoQ1htZmExNDd3RmJaNmRMT1ZGVjczWTBKZ0FBQkFBQUFBQUFBQUFBQUlBQUFBQWdMekUzVkE4K0tWQ1hjeGt1Vkx2QnRUR3pzQjVuV0ZpM2czWXNkRm9hVUxrVnB6TUN3K1NheHJMREhQbUVWVFZRK3NIL1VsMDBHNW5ET1EzQno0UStSb21nRW4vZlpTaXIwZFh5ZmRlL1lSN0dKcHdyOUVPclVvdzFhVkxDVnZrbHM2T1o4Tk1NWEU9Cg==
- uses: actions/upload-artifact@v2
if: matrix.platform == 'ubuntu-latest'
with:
name: linux-updater-artifacts
path: ./target/release/bundle/appimage/updater-example_*.AppImage.*

- uses: actions/upload-artifact@v2
if: matrix.platform == 'windows-latest'
with:
name: windows-updater-artifacts
path: ./target/release/bundle/msi/*

- uses: actions/upload-artifact@v2
if: matrix.platform == 'macos-latest'
with:
name: macos-updater-artifacts
path: ./target/release/bundle/macos/updater-example_*.app.tar.*
10 changes: 10 additions & 0 deletions .github/workflows/test-bundler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ jobs:
uses: actions-rs/toolchain@v1
with:
toolchain: stable
- name: install webkit2gtk (ubuntu only)
if: matrix.platform == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y webkit2gtk-4.0
- name: test
run: |
cd ./cli/tauri-bundler
Expand All @@ -34,6 +39,11 @@ jobs:
steps:
- uses: actions/checkout@v2
- run: rustup component add clippy
- name: install webkit2gtk (ubuntu only)
if: matrix.platform == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y webkit2gtk-4.0
- name: clippy check
uses: actions-rs/clippy-check@v1
with:
Expand Down
2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ members = [
"examples/api/src-tauri",
"examples/helloworld/src-tauri",
"examples/multiwindow/src-tauri",
# used to build updater artifacts
"examples/updater/src-tauri",
]

# default to small, optimized workspace release binaries
Expand Down
1 change: 1 addition & 0 deletions api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"./cli": "./dist/cli.js",
"./dialog": "./dist/dialog.js",
"./event": "./dist/event.js",
"./updater": "./dist/updater.js",
"./fs": "./dist/fs.js",
"./path": "./dist/path.js",
"./http": "./dist/http.js",
Expand Down
1 change: 1 addition & 0 deletions api/rollup.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export default [
path: './src/path.ts',
dialog: './src/dialog.ts',
event: './src/event.ts',
updater: './src/updater.ts',
http: './src/http.ts',
index: './src/index.ts',
shell: './src/shell.ts',
Expand Down
2 changes: 2 additions & 0 deletions api/src/bundle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'regenerator-runtime/runtime'
import * as cli from './cli'
import * as dialog from './dialog'
import * as event from './event'
import * as updater from './updater'
import * as fs from './fs'
import * as path from './path'
import * as http from './http'
Expand All @@ -15,6 +16,7 @@ export {
cli,
dialog,
event,
updater,
fs,
path,
http,
Expand Down
130 changes: 130 additions & 0 deletions api/src/updater.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
import { once, listen, emit, UnlistenFn } from './helpers/event'

export type UpdateStatus = 'PENDING' | 'ERROR' | 'DONE' | 'UPTODATE'

export interface UpdateStatusResult {
error?: string
status: UpdateStatus
}

export interface UpdateManifest {
version: string
date: string
body: string
}

export interface UpdateResult {
manifest?: UpdateManifest
shouldUpdate: boolean
}

export async function installUpdate(): Promise<void> {
let unlistenerFn: UnlistenFn | undefined

function cleanListener(): void {
if (unlistenerFn) {
unlistenerFn()
}
unlistenerFn = undefined
}

return new Promise((resolve, reject) => {
function onStatusChange(statusResult: UpdateStatusResult): void {
if (statusResult.error) {
cleanListener()
return reject(statusResult.error)
}

// install complete
if (statusResult.status === 'DONE') {
cleanListener()
return resolve()
}
}

// listen status change
listen('tauri://update-status', (data: { payload: any }) => {
onStatusChange(data?.payload as UpdateStatusResult)
})
.then((fn) => {
unlistenerFn = fn
})
.catch((e) => {
cleanListener()
// dispatch the error to our checkUpdate
throw e
})

// start the process we dont require much security as it's
// handled by rust
emit('tauri://update-install').catch((e) => {
cleanListener()
// dispatch the error to our checkUpdate
throw e
})
})
}

export async function checkUpdate(): Promise<UpdateResult> {
let unlistenerFn: UnlistenFn | undefined

function cleanListener(): void {
if (unlistenerFn) {
unlistenerFn()
}
unlistenerFn = undefined
}

return new Promise((resolve, reject) => {
function onUpdateAvailable(manifest: UpdateManifest): void {
cleanListener()
return resolve({
manifest,
shouldUpdate: true
})
}

function onStatusChange(statusResult: UpdateStatusResult): void {
if (statusResult.error) {
cleanListener()
return reject(statusResult.error)
}

if (statusResult.status === 'UPTODATE') {
cleanListener()
return resolve({
shouldUpdate: false
})
}
}

// wait to receive the latest update
once('tauri://update-available', (data: { payload: any }) => {
onUpdateAvailable(data?.payload as UpdateManifest)
}).catch((e) => {
cleanListener()
// dispatch the error to our checkUpdate
throw e
})

// listen status change
listen('tauri://update-status', (data: { payload: any }) => {
onStatusChange(data?.payload as UpdateStatusResult)
})
.then((fn) => {
unlistenerFn = fn
})
.catch((e) => {
cleanListener()
// dispatch the error to our checkUpdate
throw e
})

// start the process
emit('tauri://update').catch((e) => {
cleanListener()
// dispatch the error to our checkUpdate
throw e
})
})
}
Loading

0 comments on commit 6d70c8e

Please sign in to comment.