mirror of
https://github.com/DeviceFarmer/stf.git
synced 2026-04-18 16:23:28 +02:00
Update with new service features.
This commit is contained in:
@@ -2,6 +2,7 @@ var util = require('util')
|
||||
|
||||
var syrup = require('syrup')
|
||||
var Promise = require('bluebird')
|
||||
var _ = require('lodash')
|
||||
|
||||
var wire = require('../../../wire')
|
||||
var wireutil = require('../../../wire/util')
|
||||
@@ -12,6 +13,22 @@ var logger = require('../../../util/logger')
|
||||
var ms = require('../../../wire/messagestream')
|
||||
var lifecycle = require('../../../util/lifecycle')
|
||||
|
||||
function MessageResolver() {
|
||||
this.resolvers = Object.create(null)
|
||||
|
||||
this.await = function(id, resolver) {
|
||||
this.resolvers[id] = resolver
|
||||
return resolver.promise
|
||||
}
|
||||
|
||||
this.resolve = function(id, value) {
|
||||
var resolver = this.resolvers[id]
|
||||
delete this.resolvers[id]
|
||||
resolver.resolve(value)
|
||||
return resolver.promise
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = syrup.serial()
|
||||
.dependency(require('../support/adb'))
|
||||
.dependency(require('../support/router'))
|
||||
@@ -19,7 +36,7 @@ module.exports = syrup.serial()
|
||||
.dependency(require('../resources/service'))
|
||||
.define(function(options, adb, router, push, apk) {
|
||||
var log = logger.createLogger('device:plugins:input')
|
||||
var serviceQueue = []
|
||||
var messageResolver = new MessageResolver()
|
||||
|
||||
var agent = {
|
||||
socket: null
|
||||
@@ -142,35 +159,117 @@ module.exports = syrup.serial()
|
||||
.then(function(conn) {
|
||||
service.socket = conn
|
||||
service.reader = conn.pipe(new ms.DelimitedStream())
|
||||
service.reader.on('data', function(data) {
|
||||
if (serviceQueue.length) {
|
||||
var resolver = serviceQueue.shift()
|
||||
resolver.resolve(data)
|
||||
}
|
||||
else {
|
||||
log.warn('Unexpected data from service', data)
|
||||
}
|
||||
})
|
||||
service.reader.on('data', handleEnvelope)
|
||||
service.writer = new ms.DelimitingStream()
|
||||
service.writer.pipe(conn)
|
||||
lifecycle.share('InputService connection', conn)
|
||||
})
|
||||
}
|
||||
|
||||
function handleEnvelope(data) {
|
||||
var envelope = apk.wire.Envelope.decode(data)
|
||||
if (envelope.id !== null) {
|
||||
messageResolver.resolve(envelope.id, envelope.message)
|
||||
}
|
||||
else {
|
||||
switch (envelope.type) {
|
||||
case apk.wire.MessageType.EVENT_AIRPLANE_MODE:
|
||||
var message = apk.wire.AirplaneModeEvent.decode(envelope.message)
|
||||
push.send([
|
||||
wireutil.global
|
||||
, wireutil.envelope(new wire.AirplaneModeEvent(
|
||||
options.serial
|
||||
, message.enabled
|
||||
))
|
||||
])
|
||||
break
|
||||
case apk.wire.MessageType.EVENT_BATTERY:
|
||||
var message = apk.wire.BatteryEvent.decode(envelope.message)
|
||||
push.send([
|
||||
wireutil.global
|
||||
, wireutil.envelope(new wire.BatteryEvent(
|
||||
options.serial
|
||||
, message.status
|
||||
, message.health
|
||||
, message.source
|
||||
, message.level
|
||||
, message.scale
|
||||
, message.temp
|
||||
, message.voltage
|
||||
))
|
||||
])
|
||||
break
|
||||
case apk.wire.MessageType.EVENT_BROWSER_PACKAGE:
|
||||
var message = apk.wire.BrowserPackageEvent.decode(envelope.message)
|
||||
push.send([
|
||||
wireutil.global
|
||||
, wireutil.envelope(new wire.BrowserPackageEvent(
|
||||
options.serial
|
||||
, message.selected
|
||||
, message.apps.map(function(app) {
|
||||
return new wire.BrowserApp(
|
||||
app.name
|
||||
, app.component
|
||||
, app.selected
|
||||
)
|
||||
})
|
||||
))
|
||||
])
|
||||
break
|
||||
case apk.wire.MessageType.EVENT_CONNECTIVITY:
|
||||
var message = apk.wire.ConnectivityEvent.decode(envelope.message)
|
||||
push.send([
|
||||
wireutil.global
|
||||
, wireutil.envelope(new wire.ConnectivityEvent(
|
||||
options.serial
|
||||
, message.connected
|
||||
, message.type
|
||||
, message.subtype
|
||||
, message.failover
|
||||
, message.roaming
|
||||
))
|
||||
])
|
||||
break
|
||||
case apk.wire.MessageType.EVENT_PHONE_STATE:
|
||||
var message = apk.wire.PhoneStateEvent.decode(envelope.message)
|
||||
push.send([
|
||||
wireutil.global
|
||||
, wireutil.envelope(new wire.PhoneStateEvent(
|
||||
options.serial
|
||||
, message.state
|
||||
, message.manual
|
||||
, message.operator
|
||||
))
|
||||
])
|
||||
break
|
||||
case apk.wire.MessageType.EVENT_ROTATION:
|
||||
var message = apk.wire.RotationEvent.decode(envelope.message)
|
||||
push.send([
|
||||
wireutil.global
|
||||
, wireutil.envelope(new wire.RotationEvent(
|
||||
options.serial
|
||||
, message.rotation
|
||||
))
|
||||
])
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function stopService() {
|
||||
return callService(util.format("-a '%s'", apk.stopAction))
|
||||
}
|
||||
|
||||
function keyEvent(data) {
|
||||
return runAgentCommand(
|
||||
apk.wire.RequestType.KEYEVENT
|
||||
apk.wire.MessageType.DO_KEYEVENT
|
||||
, new apk.wire.KeyEventRequest(data)
|
||||
)
|
||||
}
|
||||
|
||||
function type(text) {
|
||||
return runAgentCommand(
|
||||
apk.wire.RequestType.TYPE
|
||||
apk.wire.MessageType.DO_TYPE
|
||||
, new apk.wire.TypeRequest(text)
|
||||
)
|
||||
}
|
||||
@@ -179,7 +278,7 @@ module.exports = syrup.serial()
|
||||
return setClipboard(text)
|
||||
.then(function() {
|
||||
keyEvent({
|
||||
event: apk.wire.KeyEvent.PRESS
|
||||
event: apk.wire.MessageType.DO_PRESS
|
||||
, keyCode: adb.Keycode.KEYCODE_V
|
||||
, ctrlKey: true
|
||||
})
|
||||
@@ -188,33 +287,33 @@ module.exports = syrup.serial()
|
||||
|
||||
function wake() {
|
||||
return runAgentCommand(
|
||||
apk.wire.RequestType.WAKE
|
||||
apk.wire.MessageType.DO_WAKE
|
||||
, new apk.wire.WakeRequest()
|
||||
)
|
||||
}
|
||||
|
||||
function freezeRotation(rotation) {
|
||||
return runAgentCommand(
|
||||
apk.wire.RequestType.SET_ROTATION
|
||||
apk.wire.MessageType.SET_ROTATION
|
||||
, new apk.wire.SetRotationRequest(rotation, true)
|
||||
)
|
||||
}
|
||||
|
||||
function thawRotation() {
|
||||
return runAgentCommand(
|
||||
apk.wire.RequestType.SET_ROTATION
|
||||
apk.wire.MessageType.SET_ROTATION
|
||||
, new apk.wire.SetRotationRequest(0, false)
|
||||
)
|
||||
}
|
||||
|
||||
function version() {
|
||||
return runServiceCommand(
|
||||
apk.wire.RequestType.VERSION
|
||||
, new apk.wire.VersionRequest()
|
||||
apk.wire.MessageType.GET_VERSION
|
||||
, new apk.wire.GetVersionRequest()
|
||||
)
|
||||
.timeout(10000)
|
||||
.then(function(data) {
|
||||
var response = apk.wire.VersionResponse.decode(data)
|
||||
var response = apk.wire.GetVersionResponse.decode(data)
|
||||
if (response.success) {
|
||||
return response.version
|
||||
}
|
||||
@@ -224,7 +323,7 @@ module.exports = syrup.serial()
|
||||
|
||||
function unlock() {
|
||||
return runServiceCommand(
|
||||
apk.wire.RequestType.SET_KEYGUARD_STATE
|
||||
apk.wire.MessageType.SET_KEYGUARD_STATE
|
||||
, new apk.wire.SetKeyguardStateRequest(false)
|
||||
)
|
||||
.timeout(10000)
|
||||
@@ -238,7 +337,7 @@ module.exports = syrup.serial()
|
||||
|
||||
function lock() {
|
||||
return runServiceCommand(
|
||||
apk.wire.RequestType.SET_KEYGUARD_STATE
|
||||
apk.wire.MessageType.SET_KEYGUARD_STATE
|
||||
, new apk.wire.SetKeyguardStateRequest(true)
|
||||
)
|
||||
.timeout(10000)
|
||||
@@ -252,7 +351,7 @@ module.exports = syrup.serial()
|
||||
|
||||
function acquireWakeLock() {
|
||||
return runServiceCommand(
|
||||
apk.wire.RequestType.SET_WAKE_LOCK
|
||||
apk.wire.MessageType.SET_WAKE_LOCK
|
||||
, new apk.wire.SetWakeLockRequest(true)
|
||||
)
|
||||
.timeout(10000)
|
||||
@@ -266,7 +365,7 @@ module.exports = syrup.serial()
|
||||
|
||||
function releaseWakeLock() {
|
||||
return runServiceCommand(
|
||||
apk.wire.RequestType.SET_WAKE_LOCK
|
||||
apk.wire.MessageType.SET_WAKE_LOCK
|
||||
, new apk.wire.SetWakeLockRequest(false)
|
||||
)
|
||||
.timeout(10000)
|
||||
@@ -280,12 +379,12 @@ module.exports = syrup.serial()
|
||||
|
||||
function identity() {
|
||||
return runServiceCommand(
|
||||
apk.wire.RequestType.IDENTIFY
|
||||
, new apk.wire.IdentifyRequest(options.serial)
|
||||
apk.wire.MessageType.DO_IDENTIFY
|
||||
, new apk.wire.DoIdentifyRequest(options.serial)
|
||||
)
|
||||
.timeout(10000)
|
||||
.then(function(data) {
|
||||
var response = apk.wire.IdentifyResponse.decode(data)
|
||||
var response = apk.wire.DoIdentifyResponse.decode(data)
|
||||
if (!response.success) {
|
||||
throw new Error('Unable to identify device')
|
||||
}
|
||||
@@ -294,7 +393,7 @@ module.exports = syrup.serial()
|
||||
|
||||
function setClipboard(text) {
|
||||
return runServiceCommand(
|
||||
apk.wire.RequestType.SET_CLIPBOARD
|
||||
apk.wire.MessageType.SET_CLIPBOARD
|
||||
, new apk.wire.SetClipboardRequest(
|
||||
apk.wire.ClipboardType.TEXT
|
||||
, text
|
||||
@@ -311,7 +410,7 @@ module.exports = syrup.serial()
|
||||
|
||||
function getClipboard() {
|
||||
return runServiceCommand(
|
||||
apk.wire.RequestType.GET_CLIPBOARD
|
||||
apk.wire.MessageType.GET_CLIPBOARD
|
||||
, new apk.wire.GetClipboardRequest(
|
||||
apk.wire.ClipboardType.TEXT
|
||||
)
|
||||
@@ -331,7 +430,7 @@ module.exports = syrup.serial()
|
||||
|
||||
function getBrowsers() {
|
||||
return runServiceCommand(
|
||||
apk.wire.RequestType.GET_BROWSERS
|
||||
apk.wire.MessageType.GET_BROWSERS
|
||||
, new apk.wire.GetBrowsersRequest()
|
||||
)
|
||||
.timeout(15000)
|
||||
@@ -347,7 +446,7 @@ module.exports = syrup.serial()
|
||||
|
||||
function getProperties(properties) {
|
||||
return runServiceCommand(
|
||||
apk.wire.RequestType.GET_PROPERTIES
|
||||
apk.wire.MessageType.GET_PROPERTIES
|
||||
, new apk.wire.GetPropertiesRequest(properties)
|
||||
)
|
||||
.timeout(15000)
|
||||
@@ -366,16 +465,17 @@ module.exports = syrup.serial()
|
||||
|
||||
function runServiceCommand(type, cmd) {
|
||||
var resolver = Promise.defer()
|
||||
service.writer.write(new apk.wire.RequestEnvelope(
|
||||
type
|
||||
var id = Math.floor(Math.random() * 0xFFFFFF)
|
||||
service.writer.write(new apk.wire.Envelope(
|
||||
id
|
||||
, type
|
||||
, cmd.encodeNB()
|
||||
).encodeNB())
|
||||
serviceQueue.push(resolver)
|
||||
return resolver.promise
|
||||
return messageResolver.await(id, resolver)
|
||||
}
|
||||
|
||||
function runAgentCommand(type, cmd) {
|
||||
agent.writer.write(new apk.wire.RequestEnvelope(
|
||||
agent.writer.write(new apk.wire.Envelope(
|
||||
type
|
||||
, cmd.encodeNB()
|
||||
).encodeNB())
|
||||
|
||||
Reference in New Issue
Block a user