UNPKG

@cliqz-oss/firefox-client

Version:
171 lines (165 loc) 4.57 kB
var extend = require("./extend"), ClientMethods = require("./client-methods"), Tab = require("./tab"), fs = require("fs"), spawn = require("child_process").spawn; module.exports = Webapps; var CHUNK_SIZE = 20480; // Also dispatch appOpen/appClose, appInstall/appUninstall events function Webapps(client, tab) { this.initialize(client, tab.webappsActor); } Webapps.prototype = extend(ClientMethods, { watchApps: function(cb) { this.request("watchApps", cb); }, unwatchApps: function(cb) { this.request("unwatchApps", cb); }, launch: function(manifestURL, cb) { this.request("launch", {manifestURL: manifestURL}, cb); }, close: function(manifestURL, cb) { this.request("close", {manifestURL: manifestURL}, cb); }, getInstalledApps: function(cb) { this.request("getAll", function (err, resp) { if (err) { cb(err); return; } cb(null, resp.apps); }); }, listRunningApps: function(cb) { this.request("listRunningApps", function (err, resp) { if (err) { cb(err); return; } cb(null, resp.apps); }); }, getApp: function(manifestURL, cb) { this.request("getAppActor", {manifestURL: manifestURL}, (function (err, resp) { if (err) { cb(err); return; } var actor = new Tab(this.client, resp.actor); cb(null, actor); }).bind(this)); }, installHosted: function(options, cb) { this.request( "install", { appId: options.appId, metadata: options.metadata, manifest: options.manifest }, function (err, resp) { if (err || resp.error) { cb(err || resp.error); return; } cb(null, resp.appId); }); }, _upload: function (path, cb) { // First create an upload actor this.request("uploadPackage", function (err, resp) { var actor = resp.actor; fs.readFile(path, function(err, data) { chunk(actor, data); }); }); // Send push the file chunk by chunk var self = this; var step = 0; function chunk(actor, data) { var i = step++ * CHUNK_SIZE; var m = Math.min(i + CHUNK_SIZE, data.length); var c = ""; for(; i < m; i++) c += String.fromCharCode(data[i]); var message = { to: actor, type: "chunk", chunk: c }; self.client.makeRequest(message, function(resp) { if (resp.error) { cb(resp); return; } if (i < data.length) { setTimeout(chunk, 0, actor, data); } else { done(actor); } }); } // Finally close the upload function done(actor) { var message = { to: actor, type: "done" }; self.client.makeRequest(message, function(resp) { if (resp.error) { cb(resp); } else { cb(null, actor, cleanup.bind(null, actor)); } }); } // Remove the temporary uploaded file from the server: function cleanup(actor) { var message = { to: actor, type: "remove" }; self.client.makeRequest(message, function () {}); } }, installPackaged: function(path, appId, cb) { this._upload(path, (function (err, actor, cleanup) { this.request("install", {appId: appId, upload: actor}, function (err, resp) { if (err) { cb(err); return; } cb(null, resp.appId); cleanup(); }); }).bind(this)); }, installPackagedWithADB: function(path, appId, cb) { var self = this; // First ensure the temporary folder exists function createTemporaryFolder() { var c = spawn("adb", ["shell", "mkdir -p /data/local/tmp/b2g/" + appId], {stdio:"inherit"}); c.on("close", uploadPackage); } // then upload the package to the temporary directory function uploadPackage() { var child = spawn("adb", ["push", path, "/data/local/tmp/b2g/" + appId + "/application.zip"], {stdio:"inherit"}); child.on("close", installApp); } // finally order the webapps actor to install the app function installApp() { self.request("install", {appId: appId}, function (err, resp) { if (err) { cb(err); return; } cb(null, resp.appId); }); } createTemporaryFolder(); }, uninstall: function(manifestURL, cb) { this.request("uninstall", {manifestURL: manifestURL}, cb); } })