fun-adb-json-bridge.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /**
  2. * 供 type: fun 的 method 桥接:adb-* → adb-parser;json-to-arr / json-json-to-arr → json-to-arr.js
  3. */
  4. const path = require('path')
  5. const adbParserExecute = require(path.join(__dirname, 'adb', 'adb-parser.js')).execute
  6. const ADB_SUBMETHODS = new Set([
  7. 'input',
  8. 'click',
  9. 'locate',
  10. 'swipe',
  11. 'scroll',
  12. 'keyevent',
  13. 'press',
  14. 'string-press',
  15. 'send-img-to-device',
  16. ])
  17. function buildSyntheticAdbAction (action, adbMethod) {
  18. return {
  19. type: 'adb',
  20. method: adbMethod,
  21. inVars: Array.isArray(action.inVars) ? action.inVars : [],
  22. outVars: Array.isArray(action.outVars) ? action.outVars : [],
  23. target: action.target,
  24. value: action.value,
  25. variable: action.variable,
  26. clear: action.clear,
  27. area: action.area,
  28. avatar: action.avatar,
  29. }
  30. }
  31. function buildAdbExecuteCtx (ctx, device, folderPath) {
  32. const resolution = ctx.resolution || { width: 1080, height: 1920 }
  33. return {
  34. device,
  35. folderPath,
  36. resolution,
  37. variableContext: ctx.variableContext,
  38. api: ctx.electronAPI,
  39. extractVarName: ctx.extractVarName,
  40. resolveValue: ctx.resolveValue,
  41. logOutVars: ctx.logOutVars,
  42. DEFAULT_SCROLL_DISTANCE: ctx.DEFAULT_SCROLL_DISTANCE ?? 100,
  43. }
  44. }
  45. /**
  46. * @returns {Promise<null|{success:boolean}>} null 表示非桥接 method,由 run() 继续分发
  47. */
  48. async function runFunBridgedMethod (actionType, action, ctx, device, folderPath) {
  49. if (typeof actionType !== 'string') return null
  50. if (actionType.startsWith('adb-')) {
  51. const sub = actionType.slice(4)
  52. if (!ADB_SUBMETHODS.has(sub)) {
  53. return { success: false, error: `未知的 fun.method adb 子命令: ${sub}(支持: ${[...ADB_SUBMETHODS].join(', ')})` }
  54. }
  55. const syn = buildSyntheticAdbAction(action, sub)
  56. const adbCtx = buildAdbExecuteCtx(ctx, device, folderPath)
  57. return adbParserExecute(syn, adbCtx)
  58. }
  59. if (actionType === 'json-to-arr' || actionType === 'json-json-to-arr') {
  60. const { executeJsonToArr } = require(path.join(__dirname, 'json', 'json-to-arr.js'))
  61. const jsonString = action.inVars && action.inVars.length > 0 ? action.inVars[0] : undefined
  62. const result = await executeJsonToArr({ jsonString })
  63. if (!result.success) return { success: false, error: result.error }
  64. const { extractVarName, variableContext, logOutVars } = ctx
  65. const outputVarName =
  66. action.outVars && action.outVars.length > 0 ? extractVarName(String(action.outVars[0]).trim()) : null
  67. if (outputVarName && Array.isArray(result.result)) variableContext[outputVarName] = result.result
  68. await logOutVars(action, variableContext, folderPath)
  69. return { success: true, ...result }
  70. }
  71. return null
  72. }
  73. module.exports = { runFunBridgedMethod, ADB_SUBMETHODS }