Commit cafd7f2a authored by nanahira's avatar nanahira

Merge branch 'v3-newpackager' into v3

parents 47f3b906 fa8af8ea
......@@ -94,34 +94,47 @@ export class App {
background: string;
price: { [currency: string]: string };
key?: string;
key?: string
static getQuerySuffix(platform: string, locale: string, arch: string) {
const params = new URLSearchParams();
params.set('platform', platform);
params.set('locale', locale);
params.set('arch', arch);
return params.toString();
}
static downloadUrl(app: App, platform: string, locale: string): string {
static downloadUrl(app: App, platform: string, locale: string, arch: string): string {
/*
if (app.id === 'ygopro') {
return `https://sthief.moecube.com:444/metalinks/${app.id}-${process.platform}-${locale}/${app.version}`;
} else if (app.id === 'desmume') {
return `https://sthief.moecube.com:444/metalinks/${app.id}-${process.platform}/${app.version}`;
}
return `https://sthief.moecube.com:444/metalinks/${app.id}/${app.version}`;
*/
return `https://sapi.moecube.com:444/release/update/metalinks/${app.id}/${app.version}?${this.getQuerySuffix(platform, locale, arch)}`;
}
static checksumUrl(app: App, platform: string, locale: string): string {
if (app.id === 'ygopro') {
static checksumUrl(app: App, platform: string, locale: string, arch: string): string {
/*if (app.id === 'ygopro') {
return `https://sthief.moecube.com:444/checksums/${app.id}-${platform}-${locale}/${app.version}`;
} else if (app.id === 'desmume') {
return `https://sthief.moecube.com:444/checksums/${app.id}-${platform}/${app.version}`;
}
return `https://sthief.moecube.com:444/checksums/${app.id}/${app.version}`;
return `https://sthief.moecube.com:444/checksums/${app.id}/${app.version}`;*/
return `https://sapi.moecube.com:444/release/update/checksums/${app.id}/${app.version}?${this.getQuerySuffix(platform, locale, arch)}`;
}
static updateUrl(app: App, platform: string, locale: string): string {
if (app.id === 'ygopro') {
static updateUrl(app: App, platform: string, locale: string, arch: string): string {
/*if (app.id === 'ygopro') {
return `https://sthief.moecube.com:444/update/${app.id}-${platform}-${locale}/${app.version}`;
} else if (app.id === 'desmume') {
return `https://sthief.moecube.com:444/update/${app.id}-${platform}/${app.version}`;
}
return `https://sthief.moecube.com:444/update/${app.id}/${app.version}`;
}*/
return `https://sapi.moecube.com:444/release/update/update/${app.id}/${app.version}?${this.getQuerySuffix(platform, locale, arch)}`;
}
isBought(): Boolean {
......
......@@ -21,6 +21,7 @@ import {ComparableSet} from './shared/ComparableSet';
import {AppsJson} from './apps-json-type';
import Timer = NodeJS.Timer;
import ReadableStream = NodeJS.ReadableStream;
import * as os from 'os';
const Logger = {
info: (...message: any[]) => {
......@@ -57,9 +58,24 @@ export class AppsService {
map: Map<string, string> = new Map();
connections = new Map<App, Connection>();
maotama: Promise<ChildProcess>;
readonly tarPath = process.platform === 'win32' ?
path.join(process.env['NODE_ENV'] === 'production' ? process.resourcesPath! : '', 'bin', 'bsdtar.exe')
: 'bsdtar';
private systemBinPath(executableName: string) {
return path.join(process.env['NODE_ENV'] === 'production' ? process.resourcesPath! : '', 'bin', executableName);
}
private get tarPath() {
if (process.platform === 'linux') {
return 'tar';
} else if (process.platform === 'win32') {
return this.systemBinPath('bsdtar.exe');
} else {
return this.systemBinPath('gtar');
}
}
private getTarStream(p: child_process.ChildProcessWithoutNullStreams) {
return process.platform === 'win32' ? p.stderr : p.stdout;
}
private apps: Map<string, App>;
constructor(private http: Http, private settingsService: SettingsService, private ref: ApplicationRef,
......@@ -81,7 +97,7 @@ export class AppsService {
}
async loadApps() {
let appsURL = 'https://sapi.moecube.com:444/apps.json';
let appsURL = 'https://sapi.moecube.com:444/release/update/apps.json';
let keysURL = 'https://sapi.moecube.com:444/keys';
try {
let data = await this.http.get(appsURL)
......@@ -640,7 +656,7 @@ export class AppsService {
if (!['zh-CN', 'en-US', 'ja-JP'].includes(locale)) {
locale = 'en-US';
}
let updateUrl = App.updateUrl(app, process.platform, locale);
let updateUrl = App.updateUrl(app, process.platform, locale, os.arch());
let metalink = await this.http.post(updateUrl, changedFiles).map((response) => response.text()).toPromise();
let downloadDir = path.join(path.dirname(app.local!.path), 'downloading');
let downloadId = await this.downloadService.addMetalink(metalink, downloadDir);
......@@ -698,7 +714,7 @@ export class AppsService {
if (!['zh-CN', 'en-US', 'ja-JP'].includes(locale)) {
locale = 'en-US';
}
let metalinkUrl = App.downloadUrl(_app, process.platform, locale);
let metalinkUrl = App.downloadUrl(_app, process.platform, locale, os.arch());
_app.status.status = 'downloading';
let metalink = await this.http.get(metalinkUrl).map((response) => response.text()).toPromise();
let downloadId = await this.downloadService.addMetalink(metalink, dir);
......@@ -990,13 +1006,18 @@ export class AppsService {
extract(file: string, dir: string): Observable<string> {
return Observable.create((observer: Observer<string>) => {
Logger.info('Start to extract... Command Line: ' + this.tarPath, file, dir);
let tarProcess = child_process.spawn(this.tarPath, ['xvf', file, '-C', dir]);
const tarArgs = ['-xvf', file, '-C', dir];
if(process.platform === 'darwin') {
tarArgs.unshift(`--use-compress-program=${this.systemBinPath('zstd')}`)
}
Logger.info('Start to extract... Command Line: ' + this.tarPath, tarArgs.join(' '));
let tarProcess = child_process.spawn(this.tarPath, tarArgs);
let rl = readline.createInterface({
input: <ReadableStream>tarProcess.stderr,
input: this.getTarStream(tarProcess),
});
rl.on('line', (input: string) => {
observer.next(input.split(' ', 2)[1]);
const line = input.split(' ', 2).pop();
observer.next(line);
});
tarProcess.on('exit', (code) => {
if (code === 0) {
......@@ -1096,7 +1117,7 @@ export class AppsService {
locale = 'en-US';
}
let checksumUrl = App.checksumUrl(app, process.platform, locale);
let checksumUrl = App.checksumUrl(app, process.platform, locale, os.arch());
return this.http.get(checksumUrl)
.map((response) => {
let map = new Map<string, string>();
......
{
"name": "mycard",
"version": "3.0.50",
"version": "3.0.51,
"description": "moecube",
"keywords": [],
"author": "zh99998 <zh99998@gmail.com>",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment