/**
 * Copyright (c) 2021 Expo, Inc.
 * Copyright (c) 2018 Drifty Co.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */ "use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
function _export(target, all) {
    for(var name in all)Object.defineProperty(target, name, {
        enumerable: true,
        get: all[name]
    });
}
_export(exports, {
    LOCKDOWN_HEADER_SIZE: ()=>LOCKDOWN_HEADER_SIZE,
    isLockdownResponse: ()=>isLockdownResponse,
    isLockdownErrorResponse: ()=>isLockdownErrorResponse,
    LockdownProtocolClient: ()=>LockdownProtocolClient,
    LockdownProtocolReader: ()=>LockdownProtocolReader,
    LockdownProtocolWriter: ()=>LockdownProtocolWriter
});
function _plist() {
    const data = /*#__PURE__*/ _interopRequireDefault(require("@expo/plist"));
    _plist = function() {
        return data;
    };
    return data;
}
function _debug() {
    const data = /*#__PURE__*/ _interopRequireDefault(require("debug"));
    _debug = function() {
        return data;
    };
    return data;
}
const _abstractProtocol = require("./AbstractProtocol");
const _errors = require("../../../../utils/errors");
function _interopRequireDefault(obj) {
    return obj && obj.__esModule ? obj : {
        default: obj
    };
}
const debug = (0, _debug().default)("expo:apple-device:protocol:lockdown");
const LOCKDOWN_HEADER_SIZE = 4;
function isDefined(val) {
    return typeof val !== "undefined";
}
function isLockdownResponse(resp) {
    return isDefined(resp.Status);
}
function isLockdownErrorResponse(resp) {
    return isDefined(resp.Error);
}
class LockdownProtocolClient extends _abstractProtocol.ProtocolClient {
    constructor(socket){
        super(socket, new _abstractProtocol.ProtocolReaderFactory(LockdownProtocolReader), new LockdownProtocolWriter());
    }
}
class LockdownProtocolReader extends _abstractProtocol.PlistProtocolReader {
    constructor(callback){
        super(LOCKDOWN_HEADER_SIZE, callback);
    }
    parseHeader(data) {
        return data.readUInt32BE(0);
    }
    parseBody(data) {
        const resp = super.parseBody(data);
        debug(`Response: ${JSON.stringify(resp)}`);
        if (isLockdownErrorResponse(resp)) {
            if (resp.Error === "DeviceLocked") {
                throw new _errors.CommandError("APPLE_DEVICE_LOCKED", "Device is currently locked.");
            }
            if (resp.Error === "InvalidService") {
                let errorMessage = `${resp.Error}: ${resp.Service} (request: ${resp.Request})`;
                if (resp.Service === "com.apple.debugserver") {
                    errorMessage += "\nTry reconnecting your device. You can also debug service logs with `export DEBUG=expo:xdl:ios:*`";
                }
                throw new _errors.CommandError("APPLE_DEVICE_LOCKDOWN", errorMessage);
            }
            throw new _errors.CommandError("APPLE_DEVICE_LOCKDOWN", resp.Error);
        }
        return resp;
    }
}
class LockdownProtocolWriter {
    write(socket, plistData) {
        debug(`socket write: ${JSON.stringify(plistData)}`);
        const plistMessage = _plist().default.build(plistData);
        const header = Buffer.alloc(LOCKDOWN_HEADER_SIZE);
        header.writeUInt32BE(plistMessage.length, 0);
        socket.write(header);
        socket.write(plistMessage);
    }
}

//# sourceMappingURL=LockdownProtocol.js.map