UNPKG

xiot-core-xcp-ts

Version:
207 lines (206 loc) 8.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.StanzaCodec = void 0; const InitializeCodec_1 = require("./iq/device/verify/InitializeCodec"); const VerifyStartCodec_1 = require("./iq/device/verify/VerifyStartCodec"); const VerifyFinishCodec_1 = require("./iq/device/verify/VerifyFinishCodec"); const SetPropertiesCodec_1 = require("./iq/device/control/SetPropertiesCodec"); const GetPropertiesCodec_1 = require("./iq/device/control/GetPropertiesCodec"); const InvokeActionsCodec_1 = require("./iq/device/control/InvokeActionsCodec"); const GetAccessKeyCodec_1 = require("./iq/device/key/GetAccessKeyCodec"); const SetAccessKeyCodec_1 = require("./iq/device/key/SetAccessKeyCodec"); const ByebyeCodec_1 = require("./iq/basic/ByebyeCodec"); const PingCodec_1 = require("./iq/basic/PingCodec"); const GetChildrenCodec_1 = require("./iq/device/control/GetChildrenCodec"); const DeviceMessageCodec_1 = require("./message/device/DeviceMessageCodec"); const GetSummariesCodec_1 = require("./iq/device/control/GetSummariesCodec"); const GetSummaries_1 = require("../typedef/iq/device/control/GetSummaries"); const Byebye_1 = require("../typedef/iq/basic/Byebye"); const IQError_1 = require("../typedef/iq/IQError"); const IQQuery_1 = require("../typedef/iq/IQQuery"); const IQResult_1 = require("../typedef/iq/IQResult"); const IQType_1 = require("../typedef/iq/IQType"); const IQ_1 = require("../typedef/iq/IQ"); const Message_1 = require("../typedef/message/Message"); const DeviceMessage_1 = require("../typedef/message/device/DeviceMessage"); const VerifyFinish_1 = require("../typedef/iq/device/verify/VerifyFinish"); const VerifyStart_1 = require("../typedef/iq/device/verify/VerifyStart"); const Initialize_1 = require("../typedef/iq/device/verify/Initialize"); const SetAccessKey_1 = require("../typedef/iq/device/key/SetAccessKey"); const GetAccessKey_1 = require("../typedef/iq/device/key/GetAccessKey"); const GetChildren_1 = require("../typedef/iq/device/control/GetChildren"); const InvokeActions_1 = require("../typedef/iq/device/control/InvokeActions"); const GetProperties_1 = require("../typedef/iq/device/control/GetProperties"); const SetProperties_1 = require("../typedef/iq/device/control/SetProperties"); const Ping_1 = require("../typedef/iq/basic/Ping"); class StanzaCodec { constructor() { this.iqCodecs = new Map(); this.messageCodecs = new Map(); this.iqCodecs.set(Byebye_1.BYEBYE_METHOD, new ByebyeCodec_1.ByebyeCodec()); this.iqCodecs.set(Ping_1.PING_METHOD, new PingCodec_1.PingCodec()); this.iqCodecs.set(SetProperties_1.SET_PROPERTIES_METHOD, new SetPropertiesCodec_1.SetPropertiesCodec()); this.iqCodecs.set(GetProperties_1.GET_PROPERTIES_METHOD, new GetPropertiesCodec_1.GetPropertiesCodec()); this.iqCodecs.set(InvokeActions_1.INVOKE_ACTIONS_METHOD, new InvokeActionsCodec_1.InvokeActionsCodec()); this.iqCodecs.set(GetChildren_1.GET_CHILDREN_METHOD, new GetChildrenCodec_1.GetChildrenCodec()); this.iqCodecs.set(GetSummaries_1.GET_SUMMARIES_METHOD, new GetSummariesCodec_1.GetSummariesCodec()); this.iqCodecs.set(GetAccessKey_1.GET_ACCESS_KEY_METHOD, new GetAccessKeyCodec_1.GetAccessKeyCodec()); this.iqCodecs.set(SetAccessKey_1.SET_ACCESS_KEY_METHOD, new SetAccessKeyCodec_1.SetAccessKeyCodec()); this.iqCodecs.set(Initialize_1.INITIALIZE_METHOD, new InitializeCodec_1.InitializeCodec()); this.iqCodecs.set(VerifyStart_1.VERIFY_START_METHOD, new VerifyStartCodec_1.VerifyStartCodec()); this.iqCodecs.set(VerifyFinish_1.VERIFY_FINISH_METHOD, new VerifyFinishCodec_1.VerifyFinishCodec()); this.messageCodecs.set(DeviceMessage_1.MESSAGE_DEVICE_TOPIC, new DeviceMessageCodec_1.DeviceMessageCodec()); } encode(m) { if (m instanceof IQ_1.IQ) { return this.encodeIQ(m); } if (m instanceof Message_1.Message) { return this.encodeMessage(m); } return null; } encodeIQ(iq) { if (iq instanceof IQQuery_1.IQQuery) { return this.encodeQuery(iq); } if (iq instanceof IQResult_1.IQResult) { return this.encodeResult(iq); } if (iq instanceof IQError_1.IQError) { return this.encodeError(iq); } return null; } encodeQuery(query) { const iq = { id: query.id, type: IQType_1.IQTypeToString(query.type), method: query.method, }; this.addQueryContent(iq, query); return { iq: iq }; } addQueryContent(o, query) { const codec = this.iqCodecs.get(query.method); if (codec != null) { const content = codec.encodeQueryContent(query); if (content != null) { o['content'] = content; } } } encodeResult(result) { const iq = { id: result.id, type: IQType_1.IQTypeToString(result.type), method: result.method, }; this.addResultContent(iq, result); return { iq: iq }; } addResultContent(o, result) { const codec = this.iqCodecs.get(result.method); if (codec != null) { const content = codec.encodeResultContent(result); if (content != null) { o['content'] = content; } } } encodeError(error) { const e = { id: error.id, type: IQType_1.IQTypeToString(error.type), content: { status: error.status, description: error.description } }; return { iq: e }; } encodeMessage(m) { const codec = this.messageCodecs.get(m.topic); if (codec == null) { throw new Error('MessageCodec not found: ' + m.topic); } return { message: { id: m.id, topic: m.topic, type: m.type, payload: codec.encode(m), } }; } decode(string) { const o = JSON.parse(string); const iq = o['iq']; const message = o['message']; if (iq != null) { return this.decodeIQ(iq); } if (message != null) { return this.decodeMessage(message); } return null; } decodeMessage(o) { const id = o.id; const topic = o.topic; const type = o.type; const payload = o.payload; const codec = this.messageCodecs.get(topic); if (codec == null) { throw new Error('invalid message: ' + topic); } return codec.decode(id, type, payload); } decodeIQ(o) { const id = o['id']; const type = o['type']; const method = o['method']; const content = o['content']; switch (IQType_1.IQTypeFromString(type)) { case IQType_1.IQType.QUERY: return this.decodeQuery(id, method, content); case IQType_1.IQType.RESULT: return this.decodeResult(id, method, content); case IQType_1.IQType.ERROR: return this.decodeError(id, content); default: return null; } } decodeQuery(id, method, content) { let query; const codec = this.iqCodecs.get(method); if (codec != null) { query = codec.decodeQuery(id, content); } else { query = new IQQuery_1.IQQuery(id, method); } return query; } decodeResult(id, method, content) { let result; const codec = this.iqCodecs.get(method); if (codec != null) { result = codec.decodeResult(id, content); } else { result = new IQQuery_1.IQQuery(id, method); } return result; } decodeError(id, content) { if (content != null) { const status = content['status']; const description = content['description']; return new IQError_1.IQError(id, status, description); } return null; } } exports.StanzaCodec = StanzaCodec;