UNPKG

yimultiscreenserver-sdk-web

Version:

YiMultiScreenServer SDK for Web

387 lines (348 loc) 25 kB
import { HTTPConfig } from '../../config/HTTPConfig'; import { CastProtocol } from '../../vo/cast/CastProtocol'; import { ScreenOrientation } from '../../vo/report/ScreenOrientation'; import { CastType } from '../../vo/cast/CastType'; import { ControllerDeviceVO } from '../../vo/device/ControllerDeviceVO'; import { CastSessionResponse } from './response/CastSessionResponse'; import { ConnectDisplayResponse } from './response/ConnectDisplayResponse'; import { EmptyResponse } from './response/EmptyResponse'; import { Result } from './response/Result'; import { JsonParser } from '../json/JsonParser'; import { SDKLog } from '../../util/SDKLog'; import { CastSlot } from '../../vo/report/CastSlot'; import { IHttpRequester } from './IHttpRequester'; import { VerifyCodeResponse } from './response/VerifyCodeResponse'; import { ControllerDeviceType } from '../../vo/device/ControllerDeviceType'; import { LoginUserResponse } from './response/LoginUserResponse'; import { AccountBindDeviceResponse } from './response/AccountBindDeviceResponse'; import { AccountBindDeviceVO } from '../../vo/account/AccountBindDeviceVO'; import { Code } from './response/Code'; import { SessionDestroyReason } from '../mqtt/message/SessionDestroyReason'; export class HttpRequestExecutor { private readonly TAG: string = "HttpRequestExecutor"; private httpConfig: HTTPConfig | null; private readonly jsonParser: JsonParser; private requesterImpl: IHttpRequester | null; constructor() { this.httpConfig = null; this.jsonParser = new JsonParser(); this.requesterImpl = null; } setHttpRequester(requesterImpl: IHttpRequester): void { this.requesterImpl = requesterImpl; } setHTTPConfig(config: HTTPConfig): void { this.httpConfig = config; } async connectDisplay(displayCode: number, controllerDevice: ControllerDeviceVO): Promise<Result<ConnectDisplayResponse>> { let requestParam: Map<string, string> = new Map<string, string>(); requestParam.set("displayCode", displayCode + ""); requestParam.set("guid", controllerDevice.guid); requestParam.set("controllerDeviceType", controllerDevice.controllerDeviceType); requestParam.set("ip", controllerDevice.ip); requestParam.set("gateway", controllerDevice.gateway); requestParam.set("mask", controllerDevice.mask); let ret: string = await this.post(this.httpConfig!.getHost() + this.httpConfig!.getApiConnectDevice(), this.jsonParser.mapToJson(requestParam)); // js的json到object转换,如果是复杂对象,会丢失类型信息,所以需要手动转换,否则无法正常使用转换后的对象中的方法。 let temp: Result<ConnectDisplayResponse> = this.jsonParser.fromJsonToHttpResult(ret); let result: Result<ConnectDisplayResponse> = Result.create(temp.code, temp.msg, new ConnectDisplayResponse()); // 如果后端返回的json中code不是ok,那么response中data就为空,就不能直接对data做取值,直接返回构造的默认值。 if (Code.OK != temp.code) { return result; } // displayDevice result.data!.displayReport.displayDevice.displayCode = temp.data!.displayReport.displayDevice.displayCode; result.data!.displayReport.displayDevice.displayDeviceId = temp.data!.displayReport.displayDevice.displayDeviceId; result.data!.displayReport.displayDevice.displayDeviceName = temp.data!.displayReport.displayDevice.displayDeviceName; result.data!.displayReport.displayDevice.gateway = temp.data!.displayReport.displayDevice.gateway; result.data!.displayReport.displayDevice.ip = temp.data!.displayReport.displayDevice.ip; result.data!.displayReport.displayDevice.mask = temp.data!.displayReport.displayDevice.mask; result.data!.displayReport.displayDevice.outIp = temp.data!.displayReport.displayDevice.outIp; // display support result.data!.displayReport.displaySupport.isSupportMirrorToDisplay = temp.data!.displayReport.displaySupport.isSupportMirrorToDisplay; result.data!.displayReport.displaySupport.isSupportMirrorToController = temp.data!.displayReport.displaySupport.isSupportMirrorToController; result.data!.displayReport.displaySupport.isSupportDisplayRemote = temp.data!.displayReport.displaySupport.isSupportDisplayRemote; result.data!.displayReport.displaySupport.isSupportDisplayScreenCapture = temp.data!.displayReport.displaySupport.isSupportDisplayScreenCapture; result.data!.displayReport.displaySupport.isSupportDisplayAppInstall = temp.data!.displayReport.displaySupport.isSupportDisplayAppInstall; result.data!.displayReport.displaySupport.isSupportShareImageToDisplay = temp.data!.displayReport.displaySupport.isSupportShareImageToDisplay; result.data!.displayReport.displaySupport.isSupportShareVideoToDisplay = temp.data!.displayReport.displaySupport.isSupportShareVideoToDisplay; result.data!.displayReport.displaySupport.isSupportShareDocumentToDisplay = temp.data!.displayReport.displaySupport.isSupportShareDocumentToDisplay; result.data!.displayReport.displaySupport.majorVersion = temp.data!.displayReport.displaySupport.majorVersion; result.data!.displayReport.displaySupport.minorVersion = temp.data!.displayReport.displaySupport.minorVersion; // displayReport result.data!.displayReport.castSlots = temp.data!.displayReport.castSlots.map((slot:any) => new CastSlot(slot.castType, slot.used, slot.max)); result.data!.displayReport.isCastEnable = temp.data!.displayReport.isCastEnable; result.data!.displayReport.isCastExclusive = temp.data!.displayReport.isCastExclusive; // isDisplayDeviceOnline 是后增字段,可能在已有的消息/http中不存在 if (temp.data!.displayReport.isDisplayDeviceOnline !== undefined) { result.data!.displayReport.isDisplayDeviceOnline = temp.data!.displayReport.isDisplayDeviceOnline; } else { result.data!.displayReport.isDisplayDeviceOnline = true; }; // screenOrientation 是后增字段,可能在已有的消息/http中不存在 if (temp.data!.displayReport.screenOrientation !== undefined) { result.data!.displayReport.screenOrientation = temp.data!.displayReport.screenOrientation; } else { result.data!.displayReport.screenOrientation = ScreenOrientation.LANDSCAPE; }; result.data!.outIp = temp.data!.outIp; SDKLog.d(this.TAG, "connectDisplay result = " + result.toString()); return result; } async disconnectDisplay(displayCode: number, controllerDevice: ControllerDeviceVO): Promise<Result<EmptyResponse>> { let requestParam: Map<string, string> = new Map<string, string>(); requestParam.set("displayCode", displayCode + ""); requestParam.set("guid", controllerDevice.guid); let ret: string = await this.delete(this.httpConfig!.getHost() + this.httpConfig!.getApiConnectDevice(), this.jsonParser.mapToJson(requestParam)); // js的json到object转换,如果是复杂对象,会丢失类型信息,所以需要手动转换,否则无法正常使用转换后的对象中的方法。 let temp: Result<EmptyResponse> = this.jsonParser.fromJsonToHttpResult(ret); let result: Result<EmptyResponse> = Result.create(temp.code, temp.msg, new EmptyResponse()); return result; } async createCastSession(displayCode: number, guid: string, castType: CastType, protocol: CastProtocol, accessToken?: string): Promise<Result<CastSessionResponse>> { let requestParam: Map<string, string> = new Map<string, string>(); requestParam.set("displayCode", displayCode + ""); requestParam.set("guid", guid); requestParam.set("castType", castType); requestParam.set("protocol", protocol); let ret: string = await this.post(this.httpConfig!.getHost() + this.httpConfig!.getApiCastSession(), this.jsonParser.mapToJson(requestParam), accessToken); // js的json到object转换,如果是复杂对象,会丢失类型信息,所以需要手动转换,否则无法正常使用转换后的对象中的方法。 let temp: Result<CastSessionResponse> = this.jsonParser.fromJsonToHttpResult(ret); let result: Result<CastSessionResponse> = Result.create(temp.code, temp.msg, new CastSessionResponse()); // 如果后端返回的json中code不是ok,那么response中data就为空,就不能直接对data做取值,直接返回构造的默认值。 if (Code.OK != temp.code) { return result; } result.data!.castSessionId = temp.data!.castSessionId; return result; } async destroyCastSession(castSessionId: number, reason?: SessionDestroyReason): Promise<Result<EmptyResponse>> { let requestParam: Map<string, string> = new Map<string, string>(); requestParam.set("castSessionId", castSessionId + ""); if (reason) { requestParam.set("reason", reason); } let ret: string = await this.delete(this.httpConfig!.getHost() + this.httpConfig!.getApiCastSession(), this.jsonParser.mapToJson(requestParam)); // js的json到object转换,如果是复杂对象,会丢失类型信息,所以需要手动转换,否则无法正常使用转换后的对象中的方法。 let temp: Result<EmptyResponse> = this.jsonParser.fromJsonToHttpResult(ret); let result: Result<EmptyResponse> = Result.create(temp.code, temp.msg, new EmptyResponse()); return result; } async requireVerifyCode(phoneNumber: string): Promise<Result<VerifyCodeResponse>> { let requestParam: Map<string, string> = new Map<string, string>(); requestParam.set("phoneNumber", phoneNumber); let ret: string = await this.get(this.httpConfig!.getHost() + this.httpConfig!.getApiVerifyCode(), requestParam); // js的json到object转换,如果是复杂对象,会丢失类型信息,所以需要手动转换,否则无法正常使用转换后的对象中的方法。 let temp: Result<VerifyCodeResponse> = this.jsonParser.fromJsonToHttpResult(ret); let result: Result<VerifyCodeResponse> = Result.create(temp.code, temp.msg, new VerifyCodeResponse()); // 如果后端返回的json中code不是ok,那么response中data就为空,就不能直接对data做取值,直接返回构造的默认值。 if (Code.OK != temp.code) { return result; } result.data!.isSMSSuccessSend = temp.data!.isSMSSuccessSend; result.data!.smsResMsg = temp.data!.smsResMsg; return result; } async login(phoneNumber: string, verifyCode: string, deviceType: ControllerDeviceType, guid: string, loginType: string): Promise<Result<LoginUserResponse>> { let requestParam: Map<string, string> = new Map<string, string>(); requestParam.set("phoneNumber", phoneNumber); requestParam.set("verifyCode", verifyCode); requestParam.set("controllerDeviceType", deviceType); requestParam.set("guid", guid); requestParam.set("loginType", loginType); let ret: string = await this.post(this.httpConfig!.getHost() + this.httpConfig!.getApiUser(), this.jsonParser.mapToJson(requestParam)); // js的json到object转换,如果是复杂对象,会丢失类型信息,所以需要手动转换,否则无法正常使用转换后的对象中的方法。 let temp: Result<LoginUserResponse> = this.jsonParser.fromJsonToHttpResult(ret); let result: Result<LoginUserResponse> = Result.create(temp.code, temp.msg, new LoginUserResponse()); // 如果后端返回的json中code不是ok,那么response中data就为空,就不能直接对data做取值,直接返回构造的默认值。 if (Code.OK != temp.code) { return result; } result.data!.user = temp.data!.user; result.data!.user.accessToken = temp.data!.user.accessToken; result.data!.user.controllerDeviceType = temp.data!.user.controllerDeviceType; result.data!.user.guid = temp.data!.user.guid; result.data!.user.loginTime = temp.data!.user.loginTime; result.data!.user.userId = temp.data!.user.userId; result.data!.user.account.accountId = temp.data!.user.account.accountId; result.data!.user.account.phoneNumber = temp.data!.user.account.phoneNumber; result.data!.user.account.registerTime = temp.data!.user.account.registerTime; result.data!.user.account.vipLevel = temp.data!.user.account.vipLevel; return result; } async refresh(guid: string, accessToken: string): Promise<Result<LoginUserResponse>> { let requestParam: Map<string, string> = new Map<string, string>(); requestParam.set("guid", guid); let ret: string = await this.update(this.httpConfig!.getHost() + this.httpConfig!.getApiUser(), this.jsonParser.mapToJson(requestParam), accessToken); // js的json到object转换,如果是复杂对象,会丢失类型信息,所以需要手动转换,否则无法正常使用转换后的对象中的方法。 let temp: Result<LoginUserResponse> = this.jsonParser.fromJsonToHttpResult(ret); let result: Result<LoginUserResponse> = Result.create(temp.code, temp.msg, new LoginUserResponse()); // 如果后端返回的json中code不是ok,那么response中data就为空,就不能直接对data做取值,直接返回构造的默认值。 if (Code.OK != temp.code) { return result; } result.data!.user = temp.data!.user; result.data!.user.accessToken = temp.data!.user.accessToken; result.data!.user.controllerDeviceType = temp.data!.user.controllerDeviceType; result.data!.user.guid = temp.data!.user.guid; result.data!.user.loginTime = temp.data!.user.loginTime; result.data!.user.userId = temp.data!.user.userId; result.data!.user.account.accountId = temp.data!.user.account.accountId; result.data!.user.account.phoneNumber = temp.data!.user.account.phoneNumber; result.data!.user.account.registerTime = temp.data!.user.account.registerTime; result.data!.user.account.vipLevel = temp.data!.user.account.vipLevel; return result; } async logout(accessToken: string): Promise<Result<EmptyResponse>> { let requestParam: Map<string, string> = new Map<string, string>(); let ret: string = await this.delete(this.httpConfig!.getHost() + this.httpConfig!.getApiUser(), this.jsonParser.mapToJson(requestParam), accessToken); // js的json到object转换,如果是复杂对象,会丢失类型信息,所以需要手动转换,否则无法正常使用转换后的对象中的方法。 let temp: Result<EmptyResponse> = this.jsonParser.fromJsonToHttpResult(ret); let result: Result<EmptyResponse> = Result.create(temp.code, temp.msg, new EmptyResponse()); return result; } async unRegister(accessToken: string): Promise<Result<EmptyResponse>> { let requestParam: Map<string, string> = new Map<string, string>(); let ret: string = await this.delete(this.httpConfig!.getHost() + this.httpConfig!.getApiAccount(), this.jsonParser.mapToJson(requestParam), accessToken); // js的json到object转换,如果是复杂对象,会丢失类型信息,所以需要手动转换,否则无法正常使用转换后的对象中的方法。 let temp: Result<EmptyResponse> = this.jsonParser.fromJsonToHttpResult(ret); let result: Result<EmptyResponse> = Result.create(temp.code, temp.msg, new EmptyResponse()); return result; } async getAllBoundDevices(accessToken: string): Promise<Result<AccountBindDeviceResponse>> { let requestParam: Map<string, string> = new Map<string, string>(); let ret: string = await this.get(this.httpConfig!.getHost() + this.httpConfig!.getApiBindDevice(), requestParam, accessToken); // js的json到object转换,如果是复杂对象,会丢失类型信息,所以需要手动转换,否则无法正常使用转换后的对象中的方法。 let temp: Result<AccountBindDeviceResponse> = this.jsonParser.fromJsonToHttpResult(ret); let result: Result<AccountBindDeviceResponse> = Result.create(temp.code, temp.msg, new AccountBindDeviceResponse()); // 如果后端返回的json中code不是ok,那么response中data就为空,就不能直接对data做取值,直接返回构造的默认值。 if (Code.OK != temp.code) { return result; } temp.data!.boundDisplayDevices.forEach(device => { let accountBindDevice: AccountBindDeviceVO = new AccountBindDeviceVO(); accountBindDevice.accountId = device.accountId; accountBindDevice.displayDeviceAlias = device.displayDeviceAlias; accountBindDevice.displayDevice.displayCode = device.displayDevice.displayCode; accountBindDevice.displayDevice.displayDeviceId = device.displayDevice.displayDeviceId; accountBindDevice.displayDevice.displayDeviceName = device.displayDevice.displayDeviceName; accountBindDevice.displayDevice.gateway = device.displayDevice.gateway; accountBindDevice.displayDevice.ip = device.displayDevice.ip; accountBindDevice.displayDevice.mask = device.displayDevice.mask; accountBindDevice.displayDevice.outIp = device.displayDevice.outIp; result.data!.boundDisplayDevices.push(accountBindDevice); }); return result; } async bindDisplay(displayDeviceId: string, alias: string, accessToken: string): Promise<Result<AccountBindDeviceResponse>> { let requestParam: Map<string, string> = new Map<string, string>(); requestParam.set("displayDeviceId", displayDeviceId); requestParam.set("displayDeviceAlias", alias); let ret: string = await this.post(this.httpConfig!.getHost() + this.httpConfig!.getApiBindDevice(), this.jsonParser.mapToJson(requestParam), accessToken); // js的json到object转换,如果是复杂对象,会丢失类型信息,所以需要手动转换,否则无法正常使用转换后的对象中的方法。 let temp: Result<AccountBindDeviceResponse> = this.jsonParser.fromJsonToHttpResult(ret); let result: Result<AccountBindDeviceResponse> = Result.create(temp.code, temp.msg, new AccountBindDeviceResponse()); // 如果后端返回的json中code不是ok,那么response中data就为空,就不能直接对data做取值,直接返回构造的默认值。 if (Code.OK != temp.code) { return result; } temp.data!.boundDisplayDevices.forEach(device => { let accountBindDevice: AccountBindDeviceVO = new AccountBindDeviceVO(); accountBindDevice.accountId = device.accountId; accountBindDevice.displayDeviceAlias = device.displayDeviceAlias; accountBindDevice.displayDevice.displayCode = device.displayDevice.displayCode; accountBindDevice.displayDevice.displayDeviceId = device.displayDevice.displayDeviceId; accountBindDevice.displayDevice.displayDeviceName = device.displayDevice.displayDeviceName; accountBindDevice.displayDevice.gateway = device.displayDevice.gateway; accountBindDevice.displayDevice.ip = device.displayDevice.ip; accountBindDevice.displayDevice.mask = device.displayDevice.mask; accountBindDevice.displayDevice.outIp = device.displayDevice.outIp; result.data!.boundDisplayDevices.push(accountBindDevice); }); return result; } async updateBindDisplayAlias(displayDeviceId: string, alias: string, accessToken: string): Promise<Result<AccountBindDeviceResponse>> { let requestParam: Map<string, string> = new Map<string, string>(); requestParam.set("displayDeviceId", displayDeviceId); requestParam.set("displayDeviceAlias", alias); let ret: string = await this.update(this.httpConfig!.getHost() + this.httpConfig!.getApiBindDevice(), this.jsonParser.mapToJson(requestParam), accessToken); // js的json到object转换,如果是复杂对象,会丢失类型信息,所以需要手动转换,否则无法正常使用转换后的对象中的方法。 let temp: Result<AccountBindDeviceResponse> = this.jsonParser.fromJsonToHttpResult(ret); let result: Result<AccountBindDeviceResponse> = Result.create(temp.code, temp.msg, new AccountBindDeviceResponse()); // 如果后端返回的json中code不是ok,那么response中data就为空,就不能直接对data做取值,直接返回构造的默认值。 if (Code.OK != temp.code) { return result; } temp.data!.boundDisplayDevices.forEach(device => { let accountBindDevice: AccountBindDeviceVO = new AccountBindDeviceVO(); accountBindDevice.accountId = device.accountId; accountBindDevice.displayDeviceAlias = device.displayDeviceAlias; accountBindDevice.displayDevice.displayCode = device.displayDevice.displayCode; accountBindDevice.displayDevice.displayDeviceId = device.displayDevice.displayDeviceId; accountBindDevice.displayDevice.displayDeviceName = device.displayDevice.displayDeviceName; accountBindDevice.displayDevice.gateway = device.displayDevice.gateway; accountBindDevice.displayDevice.ip = device.displayDevice.ip; accountBindDevice.displayDevice.mask = device.displayDevice.mask; accountBindDevice.displayDevice.outIp = device.displayDevice.outIp; result.data!.boundDisplayDevices.push(accountBindDevice); }); return result; } async unBindDisplay(displayDeviceId: string, accessToken: string): Promise<Result<EmptyResponse>> { let requestParam: Map<string, string> = new Map<string, string>(); requestParam.set("displayDeviceId", displayDeviceId); let ret: string = await this.delete(this.httpConfig!.getHost() + this.httpConfig!.getApiBindDevice(), this.jsonParser.mapToJson(requestParam), accessToken); // js的json到object转换,如果是复杂对象,会丢失类型信息,所以需要手动转换,否则无法正常使用转换后的对象中的方法。 let temp: Result<EmptyResponse> = this.jsonParser.fromJsonToHttpResult(ret); let result: Result<EmptyResponse> = Result.create(temp.code, temp.msg, new EmptyResponse()); return result; } private async get(url: string, data: Map<string, string>, token?: string): Promise<string> { SDKLog.d(this.TAG, "GET url: " + url); if (null == this.requesterImpl) { SDKLog.e(this.TAG, "requesterImpl is null"); return ""; } return await this.requesterImpl!.get(url, data, token); } private async post(url: string, data: string, token?: string): Promise<string> { SDKLog.d(this.TAG, "POST url: " + url + "; data: " + data); if (null == this.requesterImpl) { SDKLog.e(this.TAG, "requesterImpl is null"); return ""; } return await this.requesterImpl!.post(url, data, token); } private async delete(url: string, data: string, token?: string): Promise<string> { SDKLog.d(this.TAG, "DELETE url: " + url + "; data: " + data); if (null == this.requesterImpl) { SDKLog.e(this.TAG, "requesterImpl is null"); return ""; } return await this.requesterImpl!.delete(url, data, token); } private async update(url: string, data: string, token?: string): Promise<string> { SDKLog.d(this.TAG, "UPDATE url: " + url + "; data: " + data); if (null == this.requesterImpl) { SDKLog.e(this.TAG, "requesterImpl is null"); return ""; } return await this.requesterImpl!.update(url, data, token); } }