werift 0.21.12 → 0.21.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/common/src/event.js.map +1 -1
- package/lib/ice/src/ice.js +8 -6
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +1 -0
- package/lib/ice/src/iceBase.js.map +1 -1
- package/lib/ice/src/stun/transaction.d.ts +1 -1
- package/lib/ice/src/stun/transaction.js +19 -22
- package/lib/ice/src/stun/transaction.js.map +1 -1
- package/lib/ice/src/utils.d.ts +10 -1
- package/lib/ice/src/utils.js +18 -10
- package/lib/ice/src/utils.js.map +1 -1
- package/lib/index.mjs +57 -29
- package/lib/nonstandard/index.mjs +13 -11
- package/lib/rtp/src/extra/container/webm/container.d.ts +3 -3
- package/lib/rtp/src/extra/container/webm/container.js +2 -2
- package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
- package/lib/rtp/src/extra/processor/webm.d.ts +2 -2
- package/lib/rtp/src/extra/processor/webm.js.map +1 -1
- package/lib/rtp/src/extra/processor/webmStream.d.ts +2 -2
- package/lib/rtp/src/extra/processor/webmStream.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/index.d.ts +4 -4
- package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +3 -6
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +2 -0
- package/lib/webrtc/src/peerConnection.js +9 -2
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event.js","sourceRoot":"","sources":["../../../../common/src/event.ts"],"names":[],"mappings":"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","sourcesContent":["type EventExecute<T extends any[]> = (...args: T) => void;\ntype PromiseEventExecute<T extends any[]> = (...args: T) => Promise<void>;\ntype EventComplete = () => void;\ntype EventError = (e: any) => void;\ntype IEvent<T extends any[]> = {\n stack: {\n execute: EventExecute<T>;\n complete?: EventComplete;\n error?: EventError;\n id: number;\n }[];\n promiseStack: {\n execute: PromiseEventExecute<T>;\n complete?: EventComplete;\n error?: EventError;\n id: number;\n }[];\n eventId: number;\n};\n\nexport class Event<T extends any[]> {\n private event: IEvent<T> = {\n stack: [],\n promiseStack: [],\n eventId: 0,\n };\n ended = false;\n onended?: () => void;\n onerror = (e: any) => {};\n\n execute = (...args: T) => {\n if (this.ended) {\n return;\n }\n\n for (const item of this.event.stack) {\n item.execute(...args);\n }\n\n (async () => {\n for (const item of this.event.promiseStack) {\n await item.execute(...args);\n }\n })().catch((e) => {\n this.onerror(e);\n });\n };\n\n complete = () => {\n if (this.ended) {\n return;\n }\n\n for (const item of this.event.stack) {\n if (item.complete) {\n item.complete();\n }\n }\n this.allUnsubscribe();\n this.ended = true;\n if (this.onended) {\n this.onended();\n this.onended = undefined;\n }\n };\n\n error = (e: any) => {\n if (this.ended) {\n return;\n }\n\n for (const item of this.event.stack) {\n if (item.error) {\n item.error(e);\n }\n }\n this.allUnsubscribe();\n };\n\n allUnsubscribe = () => {\n if (this.ended) {\n throw new Error(\"event completed\");\n }\n\n this.event = {\n stack: [],\n promiseStack: [],\n eventId: 0,\n };\n };\n\n subscribe = (\n execute: EventExecute<T>,\n complete?: EventComplete,\n error?: EventError,\n ) => {\n const id = this.event.eventId;\n this.event.stack.push({ execute, id, complete, error });\n this.event.eventId++;\n\n const unSubscribe = () => {\n this.event.stack = this.event.stack.filter(\n (item) => item.id !== id && item,\n );\n };\n\n const disposer = (disposer: EventDisposer) => {\n disposer.push(unSubscribe);\n };\n\n return { unSubscribe, disposer };\n };\n\n queuingSubscribe = (\n execute: PromiseEventExecute<T>,\n complete?: EventComplete,\n error?: EventError,\n ) => {\n if (this.ended) throw new Error(\"event completed\");\n\n const id = this.event.eventId;\n this.event.promiseStack.push({ execute, id, complete, error });\n this.event.eventId++;\n\n const unSubscribe = () => {\n this.event.stack = this.event.stack.filter(\n (item) => item.id !== id && item,\n );\n };\n\n const disposer = (disposer: EventDisposer) => {\n disposer.push(unSubscribe);\n };\n\n return { unSubscribe, disposer };\n };\n\n once = (\n execute: EventExecute<T>,\n complete?: EventComplete,\n error?: EventError,\n ) => {\n const off = this.subscribe(\n (...args) => {\n off.unSubscribe();\n execute(...args);\n },\n complete,\n error,\n );\n };\n\n watch = (cb: (...args: T) => boolean, timeLimit?: number) =>\n new Promise<T>((resolve, reject) => {\n const timeout =\n timeLimit &&\n setTimeout(() => {\n reject(\"Event watch timeout\");\n }, timeLimit);\n\n const { unSubscribe } = this.subscribe((...args) => {\n const done = cb(...args);\n if (done) {\n if (timeout) clearTimeout(timeout);\n unSubscribe();\n resolve(args);\n }\n });\n });\n\n asPromise = (timeLimit?: number) =>\n new Promise<T>((resolve, reject) => {\n const timeout =\n timeLimit &&\n setTimeout(() => {\n reject(\"Event asPromise timeout\");\n }, timeLimit);\n\n this.once(\n (...args) => {\n if (timeout) clearTimeout(timeout);\n resolve(args);\n },\n () => {\n if (timeout) clearTimeout(timeout);\n resolve([] as any);\n },\n (err) => {\n if (timeout) clearTimeout(timeout);\n reject(err);\n },\n );\n });\n\n get returnTrigger() {\n const { execute, error, complete } = this;\n return { execute, error, complete };\n }\n\n get returnListener() {\n const { subscribe, once, asPromise } = this;\n return { subscribe, once, asPromise };\n }\n\n get length() {\n return this.event.stack.length;\n }\n}\n\nexport class EventDisposer {\n private _disposer: (() => void)[] = [];\n\n push(disposer: () => void) {\n this._disposer.push(disposer);\n }\n\n dispose() {\n this._disposer.forEach((d) => d());\n this._disposer = [];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"event.js","sourceRoot":"","sources":["../../../../common/src/event.ts"],"names":[],"mappings":";;;AAqBA,MAAa,KAAK;IAAlB;QACU;;;;mBAAmB;gBACzB,KAAK,EAAE,EAAE;gBACT,YAAY,EAAE,EAAE;gBAChB,OAAO,EAAE,CAAC;aACX;WAAC;QACF;;;;mBAAQ,KAAK;WAAC;QACd;;;;;WAAqB;QACrB;;;;mBAAU,CAAC,CAAM,EAAE,EAAE,GAAE,CAAC;WAAC;QAEzB;;;;mBAAU,CAAC,GAAG,IAAO,EAAE,EAAE;gBACvB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACf,OAAO;gBACT,CAAC;gBAED,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;oBACpC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;gBACxB,CAAC;gBAED,CAAC,KAAK,IAAI,EAAE;oBACV,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;wBAC3C,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;oBAC9B,CAAC;gBACH,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;oBACf,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC,CAAC,CAAC;YACL,CAAC;WAAC;QAEF;;;;mBAAW,GAAG,EAAE;gBACd,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACf,OAAO;gBACT,CAAC;gBAED,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;oBACpC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;wBAClB,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClB,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;gBAClB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACjB,IAAI,CAAC,OAAO,EAAE,CAAC;oBACf,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;gBAC3B,CAAC;YACH,CAAC;WAAC;QAEF;;;;mBAAQ,CAAC,CAAM,EAAE,EAAE;gBACjB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACf,OAAO;gBACT,CAAC;gBAED,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;oBACpC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBACf,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAChB,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,CAAC;WAAC;QAEF;;;;mBAAiB,GAAG,EAAE;gBACpB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBACrC,CAAC;gBAED,IAAI,CAAC,KAAK,GAAG;oBACX,KAAK,EAAE,EAAE;oBACT,YAAY,EAAE,EAAE;oBAChB,OAAO,EAAE,CAAC;iBACX,CAAC;YACJ,CAAC;WAAC;QAEF;;;;mBAAY,CACV,OAAwB,EACxB,QAAwB,EACxB,KAAkB,EAClB,EAAE;gBACF,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC9B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;gBACxD,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBAErB,MAAM,WAAW,GAAG,GAAG,EAAE;oBACvB,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CACxC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,CACjC,CAAC;gBACJ,CAAC,CAAC;gBAEF,MAAM,QAAQ,GAAG,CAAC,QAAuB,EAAE,EAAE;oBAC3C,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC7B,CAAC,CAAC;gBAEF,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;YACnC,CAAC;WAAC;QAEF;;;;mBAAmB,CACjB,OAA+B,EAC/B,QAAwB,EACxB,KAAkB,EAClB,EAAE;gBACF,IAAI,IAAI,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBAEnD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC9B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC/D,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBAErB,MAAM,WAAW,GAAG,GAAG,EAAE;oBACvB,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CACxC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,CACjC,CAAC;gBACJ,CAAC,CAAC;gBAEF,MAAM,QAAQ,GAAG,CAAC,QAAuB,EAAE,EAAE;oBAC3C,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC7B,CAAC,CAAC;gBAEF,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;YACnC,CAAC;WAAC;QAEF;;;;mBAAO,CACL,OAAwB,EACxB,QAAwB,EACxB,KAAkB,EAClB,EAAE;gBACF,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CACxB,CAAC,GAAG,IAAI,EAAE,EAAE;oBACV,GAAG,CAAC,WAAW,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;gBACnB,CAAC,EACD,QAAQ,EACR,KAAK,CACN,CAAC;YACJ,CAAC;WAAC;QAEF;;;;mBAAQ,CAAC,EAA2B,EAAE,SAAkB,EAAE,EAAE,CAC1D,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACjC,MAAM,OAAO,GACX,SAAS;oBACT,UAAU,CAAC,GAAG,EAAE;wBACd,MAAM,CAAC,qBAAqB,CAAC,CAAC;oBAChC,CAAC,EAAE,SAAS,CAAC,CAAC;gBAEhB,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE;oBACjD,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;oBACzB,IAAI,IAAI,EAAE,CAAC;wBACT,IAAI,OAAO;4BAAE,YAAY,CAAC,OAAO,CAAC,CAAC;wBACnC,WAAW,EAAE,CAAC;wBACd,OAAO,CAAC,IAAI,CAAC,CAAC;oBAChB,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;WAAC;QAEL;;;;mBAAY,CAAC,SAAkB,EAAE,EAAE,CACjC,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACjC,MAAM,OAAO,GACX,SAAS;oBACT,UAAU,CAAC,GAAG,EAAE;wBACd,MAAM,CAAC,yBAAyB,CAAC,CAAC;oBACpC,CAAC,EAAE,SAAS,CAAC,CAAC;gBAEhB,IAAI,CAAC,IAAI,CACP,CAAC,GAAG,IAAI,EAAE,EAAE;oBACV,IAAI,OAAO;wBAAE,YAAY,CAAC,OAAO,CAAC,CAAC;oBACnC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC,EACD,GAAG,EAAE;oBACH,IAAI,OAAO;wBAAE,YAAY,CAAC,OAAO,CAAC,CAAC;oBACnC,OAAO,CAAC,EAAS,CAAC,CAAC;gBACrB,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;oBACN,IAAI,OAAO;wBAAE,YAAY,CAAC,OAAO,CAAC,CAAC;oBACnC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC,CACF,CAAC;YACJ,CAAC,CAAC;WAAC;IAeP,CAAC;IAbC,IAAI,aAAa;QACf,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAC1C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACtC,CAAC;IAED,IAAI,cAAc;QAChB,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QAC5C,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACxC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;IACjC,CAAC;CACF;AA3LD,sBA2LC;AAED,MAAa,aAAa;IAA1B;QACU;;;;mBAA4B,EAAE;WAAC;IAUzC,CAAC;IARC,IAAI,CAAC,QAAoB;QACvB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,OAAO;QACL,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;CACF;AAXD,sCAWC","sourcesContent":["type EventExecute<T extends any[]> = (...args: T) => void;\ntype PromiseEventExecute<T extends any[]> = (...args: T) => Promise<void>;\ntype EventComplete = () => void;\ntype EventError = (e: any) => void;\ninterface Stack<T extends any[]> {\n execute: EventExecute<T>;\n complete?: EventComplete;\n error?: EventError;\n id: number;\n}\ninterface IEvent<T extends any[]> {\n stack: Stack<T>[];\n promiseStack: {\n execute: PromiseEventExecute<T>;\n complete?: EventComplete;\n error?: EventError;\n id: number;\n }[];\n eventId: number;\n}\n\nexport class Event<T extends any[]> {\n private event: IEvent<T> = {\n stack: [],\n promiseStack: [],\n eventId: 0,\n };\n ended = false;\n onended?: () => void;\n onerror = (e: any) => {};\n\n execute = (...args: T) => {\n if (this.ended) {\n return;\n }\n\n for (const item of this.event.stack) {\n item.execute(...args);\n }\n\n (async () => {\n for (const item of this.event.promiseStack) {\n await item.execute(...args);\n }\n })().catch((e) => {\n this.onerror(e);\n });\n };\n\n complete = () => {\n if (this.ended) {\n return;\n }\n\n for (const item of this.event.stack) {\n if (item.complete) {\n item.complete();\n }\n }\n this.allUnsubscribe();\n this.ended = true;\n if (this.onended) {\n this.onended();\n this.onended = undefined;\n }\n };\n\n error = (e: any) => {\n if (this.ended) {\n return;\n }\n\n for (const item of this.event.stack) {\n if (item.error) {\n item.error(e);\n }\n }\n this.allUnsubscribe();\n };\n\n allUnsubscribe = () => {\n if (this.ended) {\n throw new Error(\"event completed\");\n }\n\n this.event = {\n stack: [],\n promiseStack: [],\n eventId: 0,\n };\n };\n\n subscribe = (\n execute: EventExecute<T>,\n complete?: EventComplete,\n error?: EventError,\n ) => {\n const id = this.event.eventId;\n this.event.stack.push({ execute, id, complete, error });\n this.event.eventId++;\n\n const unSubscribe = () => {\n this.event.stack = this.event.stack.filter(\n (item) => item.id !== id && item,\n );\n };\n\n const disposer = (disposer: EventDisposer) => {\n disposer.push(unSubscribe);\n };\n\n return { unSubscribe, disposer };\n };\n\n queuingSubscribe = (\n execute: PromiseEventExecute<T>,\n complete?: EventComplete,\n error?: EventError,\n ) => {\n if (this.ended) throw new Error(\"event completed\");\n\n const id = this.event.eventId;\n this.event.promiseStack.push({ execute, id, complete, error });\n this.event.eventId++;\n\n const unSubscribe = () => {\n this.event.stack = this.event.stack.filter(\n (item) => item.id !== id && item,\n );\n };\n\n const disposer = (disposer: EventDisposer) => {\n disposer.push(unSubscribe);\n };\n\n return { unSubscribe, disposer };\n };\n\n once = (\n execute: EventExecute<T>,\n complete?: EventComplete,\n error?: EventError,\n ) => {\n const off = this.subscribe(\n (...args) => {\n off.unSubscribe();\n execute(...args);\n },\n complete,\n error,\n );\n };\n\n watch = (cb: (...args: T) => boolean, timeLimit?: number) =>\n new Promise<T>((resolve, reject) => {\n const timeout =\n timeLimit &&\n setTimeout(() => {\n reject(\"Event watch timeout\");\n }, timeLimit);\n\n const { unSubscribe } = this.subscribe((...args) => {\n const done = cb(...args);\n if (done) {\n if (timeout) clearTimeout(timeout);\n unSubscribe();\n resolve(args);\n }\n });\n });\n\n asPromise = (timeLimit?: number) =>\n new Promise<T>((resolve, reject) => {\n const timeout =\n timeLimit &&\n setTimeout(() => {\n reject(\"Event asPromise timeout\");\n }, timeLimit);\n\n this.once(\n (...args) => {\n if (timeout) clearTimeout(timeout);\n resolve(args);\n },\n () => {\n if (timeout) clearTimeout(timeout);\n resolve([] as any);\n },\n (err) => {\n if (timeout) clearTimeout(timeout);\n reject(err);\n },\n );\n });\n\n get returnTrigger() {\n const { execute, error, complete } = this;\n return { execute, error, complete };\n }\n\n get returnListener() {\n const { subscribe, once, asPromise } = this;\n return { subscribe, once, asPromise };\n }\n\n get length() {\n return this.event.stack.length;\n }\n}\n\nexport class EventDisposer {\n private _disposer: (() => void)[] = [];\n\n push(disposer: () => void) {\n this._disposer.push(disposer);\n }\n\n dispose() {\n this._disposer.forEach((d) => d());\n this._disposer = [];\n }\n}\n"]}
|
package/lib/ice/src/ice.js
CHANGED
|
@@ -357,7 +357,7 @@ class Connection {
|
|
|
357
357
|
remoteUsername,
|
|
358
358
|
remotePassword,
|
|
359
359
|
generation,
|
|
360
|
-
});
|
|
360
|
+
}, pair.remoteAddr);
|
|
361
361
|
if (exc.response?.getAttributeValue("ERROR-CODE")[0] === 487) {
|
|
362
362
|
if (request.attributesKeys.includes("ICE-CONTROLLED")) {
|
|
363
363
|
this.switchRole(true);
|
|
@@ -441,6 +441,7 @@ class Connection {
|
|
|
441
441
|
];
|
|
442
442
|
this.turnServer = (0, iceBase_1.validateAddress)(turnServer);
|
|
443
443
|
this.restart();
|
|
444
|
+
log("new Connection", this.options);
|
|
444
445
|
}
|
|
445
446
|
get iceControlling() {
|
|
446
447
|
return this._iceControlling;
|
|
@@ -508,7 +509,9 @@ class Connection {
|
|
|
508
509
|
if (!this.localCandidatesStart) {
|
|
509
510
|
this.localCandidatesStart = true;
|
|
510
511
|
this.promiseGatherCandidates = new common_1.Event();
|
|
511
|
-
let address = (0, utils_1.getHostAddresses)(this.options.useIpv4, this.options.useIpv6
|
|
512
|
+
let address = (0, utils_1.getHostAddresses)(this.options.useIpv4, this.options.useIpv6, {
|
|
513
|
+
useLinkLocalAddress: this.options.useLinkLocalAddress,
|
|
514
|
+
});
|
|
512
515
|
const { interfaceAddresses } = this.options;
|
|
513
516
|
if (interfaceAddresses) {
|
|
514
517
|
const filteredAddresses = address.filter((check) => Object.values(interfaceAddresses).includes(check));
|
|
@@ -603,7 +606,7 @@ class Connection {
|
|
|
603
606
|
await protocol.connectionMade((0, net_1.isIPv4)(address), this.options.portRange, this.options.interfaceAddresses);
|
|
604
607
|
}
|
|
605
608
|
catch (error) {
|
|
606
|
-
log("protocol STUN", error);
|
|
609
|
+
log("error protocol STUN", error);
|
|
607
610
|
return;
|
|
608
611
|
}
|
|
609
612
|
protocol.localIp = address;
|
|
@@ -615,6 +618,7 @@ class Connection {
|
|
|
615
618
|
candidates.push(protocol.localCandidate);
|
|
616
619
|
this.onIceCandidate.execute(protocol.localCandidate);
|
|
617
620
|
}));
|
|
621
|
+
log("protocols", this.protocols.map((p) => p.localIp));
|
|
618
622
|
let candidatePromises = [];
|
|
619
623
|
// # query STUN server for server-reflexive candidates (IPv4 only)
|
|
620
624
|
const { stunServer, turnServer } = this;
|
|
@@ -738,6 +742,7 @@ class Connection {
|
|
|
738
742
|
let res = iceBase_1.ICE_FAILED;
|
|
739
743
|
while (this.checkList.length > 0 && res === iceBase_1.ICE_FAILED) {
|
|
740
744
|
res = await this.checkListState.get();
|
|
745
|
+
log("checkListState", res);
|
|
741
746
|
}
|
|
742
747
|
// # cancel remaining checks
|
|
743
748
|
for (const check of this.checkList) {
|
|
@@ -1011,9 +1016,6 @@ class Connection {
|
|
|
1011
1016
|
if ([iceBase_1.CandidatePairState.WAITING, iceBase_1.CandidatePairState.FAILED].includes(pair.state)) {
|
|
1012
1017
|
pair.handle = this.checkStart(pair);
|
|
1013
1018
|
}
|
|
1014
|
-
else {
|
|
1015
|
-
pair;
|
|
1016
|
-
}
|
|
1017
1019
|
// 7.2.1.5. Updating the Nominated Flag
|
|
1018
1020
|
if (message.attributesKeys.includes("USE-CANDIDATE") &&
|
|
1019
1021
|
!this.iceControlling) {
|
package/lib/ice/src/ice.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../ice/src/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport { isIPv4 } from \"net\";\n\nimport * as Int64 from \"int64-buffer\";\n\nimport isEqual from \"lodash/isEqual.js\";\nimport timers from \"timers/promises\";\nimport { type Address, Event, debug } from \"./imports/common\";\n\nimport { Candidate, candidateFoundation, candidatePriority } from \"./candidate\";\nimport { MdnsLookup } from \"./dns/lookup\";\nimport type { TransactionError } from \"./exceptions\";\nimport { type Cancelable, PQueue, cancelable, randomString } from \"./helper\";\nimport {\n CONSENT_FAILURES,\n CONSENT_INTERVAL,\n CandidatePair,\n CandidatePairState,\n ICE_COMPLETED,\n ICE_FAILED,\n type IceConnection,\n type IceOptions,\n type IceState,\n defaultOptions,\n serverReflexiveCandidate,\n sortCandidatePairs,\n validateAddress,\n validateRemoteCandidate,\n} from \"./iceBase\";\nimport { classes, methods } from \"./stun/const\";\nimport { Message } from \"./stun/message\";\nimport { StunProtocol } from \"./stun/protocol\";\nimport { createStunOverTurnClient } from \"./turn/protocol\";\nimport type { Protocol } from \"./types/model\";\nimport { getHostAddresses } from \"./utils\";\n\nconst log = debug(\"werift-ice : packages/ice/src/ice.ts : log\");\n\nexport class Connection implements IceConnection {\n localUsername = randomString(4);\n localPassword = randomString(22);\n remoteIsLite = false;\n remotePassword: string = \"\";\n remoteUsername: string = \"\";\n checkList: CandidatePair[] = [];\n localCandidates: Candidate[] = [];\n stunServer?: Address;\n turnServer?: Address;\n options: IceOptions;\n remoteCandidatesEnd = false;\n localCandidatesEnd = false;\n generation = -1;\n userHistory: { [username: string]: string } = {};\n private readonly tieBreaker: bigint = BigInt(\n new Int64.Uint64BE(randomBytes(64)).toString(),\n );\n state: IceState = \"new\";\n lookup?: MdnsLookup;\n\n private _remoteCandidates: Candidate[] = [];\n // P2P接続完了したソケット\n nominated?: CandidatePair;\n private nominating = false;\n private checkListDone = false;\n private checkListState = new PQueue<number>();\n private earlyChecks: [Message, Address, Protocol][] = [];\n private earlyChecksDone = false;\n private localCandidatesStart = false;\n private protocols: Protocol[] = [];\n private queryConsentHandle?: Cancelable<void>;\n private promiseGatherCandidates?: Event<[]>;\n\n readonly onData = new Event<[Buffer]>();\n readonly stateChanged = new Event<[IceState]>();\n readonly onIceCandidate: Event<[Candidate]> = new Event();\n\n constructor(\n private _iceControlling: boolean,\n options?: Partial<IceOptions>,\n ) {\n this.options = {\n ...defaultOptions,\n ...options,\n };\n const { stunServer, turnServer } = this.options;\n this.stunServer = validateAddress(stunServer) ?? [\n \"stun.l.google.com\",\n 19302,\n ];\n this.turnServer = validateAddress(turnServer);\n this.restart();\n }\n\n get iceControlling() {\n return this._iceControlling;\n }\n\n set iceControlling(value: boolean) {\n if (this.generation > 0 || this.nominated) {\n return;\n }\n this._iceControlling = value;\n for (const pair of this.checkList) {\n pair.iceControlling = value;\n }\n }\n\n async restart() {\n this.generation++;\n\n this.localUsername = randomString(4);\n this.localPassword = randomString(22);\n if (this.options.localPasswordPrefix) {\n this.localPassword =\n this.options.localPasswordPrefix +\n this.localPassword.slice(this.options.localPasswordPrefix.length);\n }\n this.userHistory[this.localUsername] = this.localPassword;\n\n this.remoteUsername = \"\";\n this.remotePassword = \"\";\n this.localCandidates = [];\n this._remoteCandidates = [];\n this.remoteCandidatesEnd = false;\n this.localCandidatesEnd = false;\n this.state = \"new\";\n this.lookup?.close?.();\n this.lookup = undefined;\n this.nominated = undefined;\n this.nominating = false;\n this.checkList = [];\n this.checkListDone = false;\n this.checkListState = new PQueue<number>();\n this.earlyChecks = [];\n this.earlyChecksDone = false;\n this.localCandidatesStart = false;\n\n // protocolsはincomingのearlyCheckに使うかもしれないので残す\n for (const protocol of this.protocols) {\n if (protocol.localCandidate) {\n protocol.localCandidate.generation = this.generation;\n protocol.localCandidate.ufrag = this.localUsername;\n }\n }\n\n this.queryConsentHandle?.resolve?.();\n this.queryConsentHandle = undefined;\n this.promiseGatherCandidates = undefined;\n }\n\n resetNominatedPair() {\n log(\"resetNominatedPair\");\n this.nominated = undefined;\n this.nominating = false;\n }\n\n setRemoteParams({\n iceLite,\n usernameFragment,\n password,\n }: {\n iceLite: boolean;\n usernameFragment: string;\n password: string;\n }) {\n log(\"setRemoteParams\", { iceLite, usernameFragment, password });\n this.remoteIsLite = iceLite;\n this.remoteUsername = usernameFragment;\n this.remotePassword = password;\n }\n\n // 4.1.1 Gathering Candidates\n async gatherCandidates() {\n if (!this.localCandidatesStart) {\n this.localCandidatesStart = true;\n this.promiseGatherCandidates = new Event();\n\n let address = getHostAddresses(\n this.options.useIpv4,\n this.options.useIpv6,\n );\n const { interfaceAddresses } = this.options;\n if (interfaceAddresses) {\n const filteredAddresses = address.filter((check) =>\n Object.values(interfaceAddresses).includes(check),\n );\n if (filteredAddresses.length) {\n address = filteredAddresses;\n }\n }\n if (this.options.additionalHostAddresses) {\n address = Array.from(\n new Set([...this.options.additionalHostAddresses, ...address]),\n );\n }\n\n const candidates = await this.getCandidates(address, 5);\n this.localCandidates = [...this.localCandidates, ...candidates];\n\n this.localCandidatesEnd = true;\n this.promiseGatherCandidates.execute();\n }\n this.setState(\"completed\");\n }\n\n private ensureProtocol(protocol: Protocol) {\n protocol.onRequestReceived.subscribe((msg, addr, data) => {\n if (msg.messageMethod !== methods.BINDING) {\n this.respondError(msg, addr, protocol, [400, \"Bad Request\"]);\n return;\n }\n\n const txUsername = msg.getAttributeValue(\"USERNAME\");\n // 相手にとってのremoteは自分にとってのlocal\n const { remoteUsername: localUsername } = decodeTxUsername(txUsername);\n const localPassword =\n this.userHistory[localUsername] ?? this.localPassword;\n\n const { iceControlling } = this;\n\n // 7.2.1.1. Detecting and Repairing Role Conflicts\n if (iceControlling && msg.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n if (this.tieBreaker >= msg.getAttributeValue(\"ICE-CONTROLLING\")) {\n this.respondError(msg, addr, protocol, [487, \"Role Conflict\"]);\n return;\n } else {\n this.switchRole(false);\n }\n } else if (\n !iceControlling &&\n msg.attributesKeys.includes(\"ICE-CONTROLLED\")\n ) {\n if (this.tieBreaker < msg.getAttributeValue(\"ICE-CONTROLLED\")) {\n this.respondError(msg, addr, protocol, [487, \"Role Conflict\"]);\n } else {\n this.switchRole(true);\n return;\n }\n }\n\n if (\n this.options.filterStunResponse &&\n !this.options.filterStunResponse(msg, addr, protocol)\n ) {\n return;\n }\n\n // # send binding response\n const response = new Message(\n methods.BINDING,\n classes.RESPONSE,\n msg.transactionId,\n );\n\n response\n .setAttribute(\"XOR-MAPPED-ADDRESS\", addr)\n .addMessageIntegrity(Buffer.from(localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n\n if (this.checkList.length === 0 && !this.earlyChecksDone) {\n this.earlyChecks.push([msg, addr, protocol]);\n } else {\n this.checkIncoming(msg, addr, protocol);\n }\n });\n protocol.onDataReceived.subscribe((data) => {\n try {\n this.onData.execute(data);\n } catch (error) {\n log(\"dataReceived\", error);\n }\n });\n }\n\n private async getCandidates(addresses: string[], timeout = 5) {\n let candidates: Candidate[] = [];\n\n addresses = addresses.filter((address) => {\n // ice restartで同じアドレスが追加されるのを防ぐ\n if (this.protocols.find((protocol) => protocol.localIp === address)) {\n return false;\n }\n return true;\n });\n\n await Promise.allSettled(\n addresses.map(async (address) => {\n // # create transport\n const protocol = new StunProtocol();\n this.ensureProtocol(protocol);\n try {\n await protocol.connectionMade(\n isIPv4(address),\n this.options.portRange,\n this.options.interfaceAddresses,\n );\n } catch (error) {\n log(\"protocol STUN\", error);\n return;\n }\n\n protocol.localIp = address;\n this.protocols.push(protocol);\n\n // # add host candidate\n const candidateAddress: Address = [address, protocol.getExtraInfo()[1]];\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"udp\", candidateAddress[0]),\n 1,\n \"udp\",\n candidatePriority(\"host\"),\n candidateAddress[0],\n candidateAddress[1],\n \"host\",\n undefined,\n undefined,\n undefined,\n this.generation,\n this.localUsername,\n );\n\n this.pairLocalProtocol(protocol);\n candidates.push(protocol.localCandidate);\n this.onIceCandidate.execute(protocol.localCandidate);\n }),\n );\n\n let candidatePromises: Promise<Candidate | void>[] = [];\n\n // # query STUN server for server-reflexive candidates (IPv4 only)\n const { stunServer, turnServer } = this;\n if (stunServer) {\n const stunPromises = this.protocols.map((protocol) =>\n new Promise<Candidate | void>(async (r, f) => {\n const timer = setTimeout(f, timeout * 1000);\n if (\n protocol.localCandidate?.host &&\n isIPv4(protocol.localCandidate?.host)\n ) {\n const candidate = await serverReflexiveCandidate(\n protocol,\n stunServer,\n ).catch((error) => {\n log(\"error\", error);\n });\n if (candidate) {\n this.onIceCandidate.execute(candidate);\n }\n\n clearTimeout(timer);\n r(candidate);\n } else {\n clearTimeout(timer);\n r();\n }\n }).catch((error) => {\n log(\"query STUN server\", error);\n }),\n );\n\n candidatePromises.push(...stunPromises);\n }\n\n const { turnUsername, turnPassword } = this.options;\n if (turnServer && turnUsername && turnPassword) {\n const turnCandidate = (async () => {\n const protocol = await createStunOverTurnClient(\n {\n address: turnServer,\n username: turnUsername,\n password: turnPassword,\n },\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n transport: this.options.turnTransport === \"tcp\" ? \"tcp\" : \"udp\",\n },\n ).catch(async (e) => {\n if (this.options.turnTransport !== \"tcp\") {\n return await createStunOverTurnClient(\n {\n address: turnServer,\n username: turnUsername,\n password: turnPassword,\n },\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n transport: \"tcp\",\n },\n );\n } else {\n throw e;\n }\n });\n this.ensureProtocol(protocol);\n this.protocols.push(protocol);\n\n const candidateAddress = protocol.turn.relayedAddress;\n const relatedAddress = protocol.turn.mappedAddress;\n\n log(\"turn candidateAddress\", candidateAddress);\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"relay\", \"udp\", candidateAddress[0]),\n 1,\n \"udp\",\n candidatePriority(\"relay\"),\n candidateAddress[0],\n candidateAddress[1],\n \"relay\",\n relatedAddress[0],\n relatedAddress[1],\n undefined,\n this.generation,\n this.localUsername,\n );\n this.onIceCandidate.execute(protocol.localCandidate);\n\n return protocol.localCandidate;\n })().catch((error) => {\n log(\"query TURN server\", error);\n });\n\n if (this.options.forceTurn) {\n candidates = [];\n candidatePromises = [];\n }\n\n candidatePromises.push(turnCandidate);\n }\n\n const extraCandidates = [...(await Promise.allSettled(candidatePromises))]\n .filter(\n (\n v,\n ): v is PromiseFulfilledResult<\n Awaited<(typeof candidatePromises)[number]>\n > => v.status === \"fulfilled\",\n )\n .map((v) => v.value)\n .filter((v): v is Candidate => typeof v !== \"undefined\");\n\n candidates.push(...extraCandidates);\n\n return candidates;\n }\n\n async connect() {\n // \"\"\"\n // Perform ICE handshake.\n //\n // This coroutine returns if a candidate pair was successfully nominated\n // and raises an exception otherwise.\n // \"\"\"\n log(\"start connect ice\");\n if (!this.localCandidatesEnd) {\n if (!this.localCandidatesStart) {\n throw new Error(\"Local candidates gathering was not performed\");\n }\n if (this.promiseGatherCandidates) {\n // wait for GatherCandidates finish\n await this.promiseGatherCandidates.asPromise();\n }\n }\n if (!this.remoteUsername || !this.remotePassword) {\n throw new Error(\"Remote username or password is missing\");\n }\n\n // # 5.7.1. Forming Candidate Pairs\n for (const c of this.remoteCandidates) {\n this.pairRemoteCandidate(c);\n }\n this.sortCheckList();\n\n this.unfreezeInitial();\n\n log(\"earlyChecks\", this.localPassword, this.earlyChecks.length);\n // # handle early checks\n for (const earlyCheck of this.earlyChecks) {\n this.checkIncoming(...earlyCheck);\n }\n this.earlyChecks = [];\n this.earlyChecksDone = true;\n\n // # perform checks\n // 5.8. Scheduling Checks\n for (;;) {\n if (this.state === \"closed\") break;\n if (!this.schedulingChecks()) break;\n await timers.setTimeout(20);\n }\n\n // # wait for completion\n let res: number = ICE_FAILED;\n while (this.checkList.length > 0 && res === ICE_FAILED) {\n res = await this.checkListState.get();\n }\n\n // # cancel remaining checks\n for (const check of this.checkList) {\n check.handle?.resolve?.();\n }\n\n if (res !== ICE_COMPLETED) {\n throw new Error(\"ICE negotiation failed\");\n }\n\n // # start consent freshness tests\n this.queryConsent();\n\n this.setState(\"connected\");\n }\n\n private unfreezeInitial() {\n // # unfreeze first pair for the first component\n const [firstPair] = this.checkList;\n if (!firstPair) return;\n if (firstPair.state === CandidatePairState.FROZEN) {\n firstPair.updateState(CandidatePairState.WAITING);\n }\n\n // # unfreeze pairs with same component but different foundations\n const seenFoundations = new Set(firstPair.localCandidate.foundation);\n for (const pair of this.checkList) {\n if (\n pair.component === firstPair.component &&\n !seenFoundations.has(pair.localCandidate.foundation) &&\n pair.state === CandidatePairState.FROZEN\n ) {\n pair.updateState(CandidatePairState.WAITING);\n seenFoundations.add(pair.localCandidate.foundation);\n }\n }\n }\n\n // 5.8 Scheduling Checks\n private schedulingChecks() {\n // Ordinary Check\n {\n // # find the highest-priority pair that is in the waiting state\n const pair = this.checkList\n .filter((pair) => {\n if (\n this.options.forceTurn &&\n pair.protocol.type === StunProtocol.type\n )\n return false;\n return true;\n })\n .find((pair) => pair.state === CandidatePairState.WAITING);\n if (pair) {\n pair.handle = this.checkStart(pair);\n return true;\n }\n }\n\n {\n // # find the highest-priority pair that is in the frozen state\n const pair = this.checkList.find(\n (pair) => pair.state === CandidatePairState.FROZEN,\n );\n if (pair) {\n pair.handle = this.checkStart(pair);\n return true;\n }\n }\n\n // # if we expect more candidates, keep going\n if (!this.remoteCandidatesEnd) {\n return !this.checkListDone;\n }\n\n return false;\n }\n\n // 4.1.1.4 ? 生存確認 life check\n private queryConsent = () => {\n if (this.queryConsentHandle) {\n this.queryConsentHandle.resolve();\n }\n\n this.queryConsentHandle = cancelable(async (_, __, onCancel) => {\n let failures = 0;\n let canceled = false;\n\n const cancelEvent = new AbortController();\n onCancel.once(() => {\n canceled = true;\n failures += CONSENT_FAILURES;\n cancelEvent.abort();\n this.queryConsentHandle = undefined;\n });\n\n const { localUsername, remoteUsername, iceControlling } = this;\n\n // \"\"\"\n // Periodically check consent (RFC 7675).\n // \"\"\"\n\n try {\n while (this.state !== \"closed\" && !canceled) {\n // # randomize between 0.8 and 1.2 times CONSENT_INTERVAL\n await timers.setTimeout(\n CONSENT_INTERVAL * (0.8 + 0.4 * Math.random()) * 1000,\n undefined,\n { signal: cancelEvent.signal },\n );\n\n const nominated = this.nominated;\n if (!nominated || canceled) {\n break;\n }\n\n const request = this.buildRequest({\n nominate: false,\n localUsername,\n remoteUsername,\n iceControlling,\n });\n try {\n await nominated.protocol.request(\n request,\n nominated.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n 0,\n );\n failures = 0;\n if (this.state === \"disconnected\") {\n this.setState(\"connected\");\n }\n } catch (error) {\n if (nominated.id === this.nominated?.id) {\n log(\"no stun response\");\n failures++;\n this.setState(\"disconnected\");\n break;\n }\n }\n if (failures >= CONSENT_FAILURES) {\n log(\"Consent to send expired\");\n this.queryConsentHandle = undefined;\n this.setState(\"closed\");\n break;\n }\n }\n } catch (error) {}\n });\n };\n\n async close() {\n // \"\"\"\n // Close the connection.\n // \"\"\"\n\n this.setState(\"closed\");\n\n // # stop consent freshness tests\n this.queryConsentHandle?.resolve?.();\n\n // # stop check list\n if (this.checkList && !this.checkListDone) {\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n }),\n );\n }\n\n this.nominated = undefined;\n for (const protocol of this.protocols) {\n if (protocol.close) {\n await protocol.close();\n }\n }\n\n this.protocols = [];\n this.localCandidates = [];\n\n this.lookup?.close?.();\n this.lookup = undefined;\n }\n\n private setState(state: IceState) {\n this.state = state;\n this.stateChanged.execute(state);\n }\n\n async addRemoteCandidate(remoteCandidate: Candidate | undefined) {\n // \"\"\"\n // Add a remote candidate or signal end-of-candidates.\n\n // To signal end-of-candidates, pass `None`.\n\n // :param remote_candidate: A :class:`Candidate` instance or `None`.\n // \"\"\"\n\n if (!remoteCandidate) {\n this.remoteCandidatesEnd = true;\n return;\n }\n\n if (remoteCandidate.host.includes(\".local\")) {\n try {\n if (!this.lookup) {\n this.lookup = new MdnsLookup();\n }\n const host = await this.lookup.lookup(remoteCandidate.host);\n remoteCandidate.host = host;\n } catch (error) {\n return;\n }\n }\n\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n return;\n }\n\n log(\"addRemoteCandidate\", remoteCandidate);\n this._remoteCandidates.push(remoteCandidate);\n\n this.pairRemoteCandidate(remoteCandidate);\n this.sortCheckList();\n }\n\n send = async (data: Buffer) => {\n const activePair = this.nominated;\n if (activePair) {\n await activePair.protocol.sendData(data, activePair.remoteAddr);\n } else {\n // log(\"Cannot send data, ice not connected\");\n return;\n }\n };\n\n getDefaultCandidate() {\n const candidates = this.localCandidates.sort(\n (a, b) => a.priority - b.priority,\n );\n const [candidate] = candidates;\n return candidate;\n }\n\n // for test only\n set remoteCandidates(value: Candidate[]) {\n if (this.remoteCandidatesEnd)\n throw new Error(\"Cannot set remote candidates after end-of-candidates.\");\n this._remoteCandidates = [];\n for (const remoteCandidate of value) {\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n continue;\n }\n this._remoteCandidates.push(remoteCandidate);\n }\n\n this.remoteCandidatesEnd = true;\n }\n get remoteCandidates() {\n return this._remoteCandidates;\n }\n\n private sortCheckList() {\n sortCandidatePairs(this.checkList, this.iceControlling);\n }\n\n private findPair(protocol: Protocol, remoteCandidate: Candidate) {\n const pair = this.checkList.find(\n (pair) =>\n isEqual(pair.protocol, protocol) &&\n isEqual(pair.remoteCandidate, remoteCandidate),\n );\n return pair;\n }\n\n private switchRole(iceControlling: boolean) {\n log(\"switch role\", iceControlling);\n this.iceControlling = iceControlling;\n this.sortCheckList();\n }\n\n private checkComplete(pair: CandidatePair) {\n pair.handle = undefined;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n // Updating the Nominated Flag\n\n // https://www.rfc-editor.org/rfc/rfc8445#section-7.3.1.5,\n // Once the nominated flag is set for a component of a data stream, it\n // concludes the ICE processing for that component. See Section 8.\n // So disallow overwriting of the pair nominated for that component\n if (\n pair.nominated &&\n // remoteのgenerationをチェックする.localのgenerationは更新が間に合わないかもしれないのでチェックしない\n (pair.remoteCandidate.generation != undefined\n ? pair.remoteCandidate.generation === this.generation\n : true) &&\n this.nominated == undefined\n ) {\n log(\"nominated\", pair.toJSON());\n this.nominated = pair;\n this.nominating = false;\n\n // 8.1.2. Updating States\n\n // The agent MUST remove all Waiting and Frozen pairs in the check\n // list and triggered check queue for the same component as the\n // nominated pairs for that media stream.\n for (const p of this.checkList) {\n if (\n p.component === pair.component &&\n [CandidatePairState.WAITING, CandidatePairState.FROZEN].includes(\n p.state,\n )\n ) {\n p.updateState(CandidatePairState.FAILED);\n }\n }\n }\n\n // Once there is at least one nominated pair in the valid list for\n // every component of at least one media stream and the state of the\n // check list is Running:\n if (this.nominated) {\n if (!this.checkListDone) {\n log(\"ICE completed\");\n this.checkListState.put(new Promise((r) => r(ICE_COMPLETED)));\n this.checkListDone = true;\n }\n return;\n }\n\n log(\"not completed\", pair.toJSON());\n\n // 7.1.3.2.3. Updating Pair States\n for (const p of this.checkList) {\n if (\n p.localCandidate.foundation === pair.localCandidate.foundation &&\n p.state === CandidatePairState.FROZEN\n ) {\n p.updateState(CandidatePairState.WAITING);\n }\n }\n }\n\n {\n const list = [CandidatePairState.SUCCEEDED, CandidatePairState.FAILED];\n if (this.checkList.find(({ state }) => !list.includes(state))) {\n return;\n }\n }\n\n if (!this.iceControlling) {\n const target = CandidatePairState.SUCCEEDED;\n if (this.checkList.find(({ state }) => state === target)) {\n return;\n }\n }\n\n if (!this.checkListDone) {\n log(\"ICE failed\");\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n }),\n );\n }\n }\n\n // 3. Terminology : Check\n checkStart = (pair: CandidatePair) =>\n cancelable<void>(async (r) => {\n // \"\"\"\n // Starts a check.\n // \"\"\"\n\n log(\"check start\", pair.toJSON());\n\n pair.updateState(CandidatePairState.IN_PROGRESS);\n const result: { response?: Message; addr?: Address } = {};\n const { remotePassword, remoteUsername, generation } = this;\n const localUsername = pair.localCandidate.ufrag ?? this.localUsername;\n\n const nominate = this.iceControlling && !this.remoteIsLite;\n const request = this.buildRequest({\n nominate,\n localUsername,\n remoteUsername,\n iceControlling: this.iceControlling,\n });\n\n try {\n const [response, addr] = await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(remotePassword, \"utf8\"),\n 4,\n );\n log(\"response received\", request.toJSON(), response.toJSON(), addr, {\n localUsername,\n remoteUsername,\n remotePassword,\n generation,\n });\n result.response = response;\n result.addr = addr;\n } catch (error: any) {\n const exc: TransactionError = error;\n // 7.1.3.1. Failure Cases\n log(\n \"failure case\",\n request.toJSON(),\n exc.response ? JSON.stringify(exc.response.toJSON(), null, 2) : error,\n {\n localUsername,\n remoteUsername,\n remotePassword,\n generation,\n },\n );\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 487) {\n if (request.attributesKeys.includes(\"ICE-CONTROLLED\")) {\n this.switchRole(true);\n } else if (request.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n this.switchRole(false);\n }\n await this.checkStart(pair).awaitable;\n r();\n return;\n }\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 401) {\n log(\"retry 401\", pair.toJSON());\n await this.checkStart(pair).awaitable;\n r();\n return;\n } else {\n // timeout\n log(\"checkStart CandidatePairState.FAILED\", pair.toJSON());\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n }\n\n // # check remote address matches\n if (!isEqual(result.addr, pair.remoteAddr)) {\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n\n // # success\n if (nominate || pair.remoteNominated) {\n // # nominated by agressive nomination or the remote party\n pair.nominated = true;\n } else if (this.iceControlling && !this.nominating) {\n // # perform regular nomination\n this.nominating = true;\n const request = this.buildRequest({\n nominate: true,\n localUsername,\n remoteUsername,\n iceControlling: this.iceControlling,\n });\n try {\n await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n );\n } catch (error) {\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n return;\n }\n pair.nominated = true;\n }\n\n pair.updateState(CandidatePairState.SUCCEEDED);\n this.checkComplete(pair);\n r();\n });\n\n private addPair(pair: CandidatePair) {\n this.checkList.push(pair);\n this.sortCheckList();\n }\n\n // 7.2. STUN Server Procedures\n // 7.2.1.3、7.2.1.4、および7.2.1.5\n checkIncoming(message: Message, addr: Address, protocol: Protocol) {\n // \"\"\"\n // Handle a successful incoming check.\n // \"\"\"\n\n const txUsername = message.getAttributeValue(\"USERNAME\");\n const { remoteUsername: localUsername } = decodeTxUsername(txUsername);\n\n // find remote candidate\n let remoteCandidate: Candidate | undefined;\n const [host, port] = addr;\n for (const c of this.remoteCandidates) {\n if (c.host === host && c.port === port) {\n remoteCandidate = c;\n break;\n }\n }\n if (!remoteCandidate) {\n // 7.2.1.3. Learning Peer Reflexive Candidates\n remoteCandidate = new Candidate(\n randomString(10),\n 1,\n \"udp\",\n message.getAttributeValue(\"PRIORITY\"),\n host,\n port,\n \"prflx\",\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n );\n this._remoteCandidates.push(remoteCandidate);\n }\n\n // find pair\n let pair = this.findPair(protocol, remoteCandidate);\n if (!pair) {\n pair = new CandidatePair(protocol, remoteCandidate, this.iceControlling);\n pair.updateState(CandidatePairState.WAITING);\n this.addPair(pair);\n }\n pair.localCandidate.ufrag = localUsername;\n\n log(\"Triggered Checks\", message.toJSON(), pair.toJSON(), {\n localUsername: this.localUsername,\n remoteUsername: this.remoteUsername,\n localPassword: this.localPassword,\n remotePassword: this.remotePassword,\n generation: this.generation,\n });\n\n // 7.2.1.4. Triggered Checks\n if (\n [CandidatePairState.WAITING, CandidatePairState.FAILED].includes(\n pair.state,\n )\n ) {\n pair.handle = this.checkStart(pair);\n } else {\n pair;\n }\n\n // 7.2.1.5. Updating the Nominated Flag\n if (\n message.attributesKeys.includes(\"USE-CANDIDATE\") &&\n !this.iceControlling\n ) {\n pair.remoteNominated = true;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n pair.nominated = true;\n this.checkComplete(pair);\n }\n }\n }\n\n private tryPair(protocol: Protocol, remoteCandidate: Candidate) {\n if (\n protocol.localCandidate?.canPairWith(remoteCandidate) &&\n !this.findPair(protocol, remoteCandidate)\n ) {\n const pair = new CandidatePair(\n protocol,\n remoteCandidate,\n this.iceControlling,\n );\n if (\n this.options.filterCandidatePair &&\n !this.options.filterCandidatePair(pair)\n ) {\n return;\n }\n pair.updateState(CandidatePairState.WAITING);\n this.addPair(pair);\n }\n }\n\n private pairLocalProtocol(protocol: Protocol) {\n for (const remoteCandidate of this.remoteCandidates) {\n this.tryPair(protocol, remoteCandidate);\n }\n }\n\n private pairRemoteCandidate = (remoteCandidate: Candidate) => {\n for (const protocol of this.protocols) {\n this.tryPair(protocol, remoteCandidate);\n }\n };\n\n private buildRequest({\n nominate,\n remoteUsername,\n localUsername,\n iceControlling,\n }: {\n nominate: boolean;\n remoteUsername: string;\n localUsername: string;\n iceControlling: boolean;\n }) {\n const txUsername = encodeTxUsername({ remoteUsername, localUsername });\n const request = new Message(methods.BINDING, classes.REQUEST);\n request\n .setAttribute(\"USERNAME\", txUsername)\n .setAttribute(\"PRIORITY\", candidatePriority(\"prflx\"));\n if (iceControlling) {\n request.setAttribute(\"ICE-CONTROLLING\", this.tieBreaker);\n if (nominate) {\n request.setAttribute(\"USE-CANDIDATE\", null);\n }\n } else {\n request.setAttribute(\"ICE-CONTROLLED\", this.tieBreaker);\n }\n return request;\n }\n\n private respondError(\n request: Message,\n addr: Address,\n protocol: Protocol,\n errorCode: [number, string],\n ) {\n const response = new Message(\n request.messageMethod,\n classes.ERROR,\n request.transactionId,\n );\n response\n .setAttribute(\"ERROR-CODE\", errorCode)\n .addMessageIntegrity(Buffer.from(this.localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n }\n}\n\nconst encodeTxUsername = ({\n remoteUsername,\n localUsername,\n}: {\n remoteUsername: string;\n localUsername: string;\n}) => {\n return `${remoteUsername}:${localUsername}`;\n};\n\nconst decodeTxUsername = (txUsername: string) => {\n const [remoteUsername, localUsername] = txUsername.split(\":\");\n return { remoteUsername, localUsername };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../ice/src/ice.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAqC;AACrC,6BAA6B;AAE7B,oDAAsC;AAEtC,mEAAwC;AACxC,+DAAqC;AACrC,6CAA8D;AAE9D,2CAAgF;AAChF,yCAA0C;AAE1C,qCAA6E;AAC7E,uCAemB;AACnB,wCAAgD;AAChD,4CAAyC;AACzC,8CAA+C;AAC/C,8CAA2D;AAE3D,mCAA2C;AAE3C,MAAM,GAAG,GAAG,IAAA,cAAK,EAAC,4CAA4C,CAAC,CAAC;AAEhE,MAAa,UAAU;IAsCrB,YACU,eAAwB,EAChC,OAA6B;QAD7B;;;;mBAAQ,eAAe;WAAS;QAtClC;;;;mBAAgB,IAAA,qBAAY,EAAC,CAAC,CAAC;WAAC;QAChC;;;;mBAAgB,IAAA,qBAAY,EAAC,EAAE,CAAC;WAAC;QACjC;;;;mBAAe,KAAK;WAAC;QACrB;;;;mBAAyB,EAAE;WAAC;QAC5B;;;;mBAAyB,EAAE;WAAC;QAC5B;;;;mBAA6B,EAAE;WAAC;QAChC;;;;mBAA+B,EAAE;WAAC;QAClC;;;;;WAAqB;QACrB;;;;;WAAqB;QACrB;;;;;WAAoB;QACpB;;;;mBAAsB,KAAK;WAAC;QAC5B;;;;mBAAqB,KAAK;WAAC;QAC3B;;;;mBAAa,CAAC,CAAC;WAAC;QAChB;;;;mBAA8C,EAAE;WAAC;QAChC;;;;mBAAqB,MAAM,CAC1C,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAC/C;WAAC;QACF;;;;mBAAkB,KAAK;WAAC;QACxB;;;;;WAAoB;QAEZ;;;;mBAAiC,EAAE;WAAC;QAC5C,gBAAgB;QAChB;;;;;WAA0B;QAClB;;;;mBAAa,KAAK;WAAC;QACnB;;;;mBAAgB,KAAK;WAAC;QACtB;;;;mBAAiB,IAAI,eAAM,EAAU;WAAC;QACtC;;;;mBAA8C,EAAE;WAAC;QACjD;;;;mBAAkB,KAAK;WAAC;QACxB;;;;mBAAuB,KAAK;WAAC;QAC7B;;;;mBAAwB,EAAE;WAAC;QAC3B;;;;;WAAsC;QACtC;;;;;WAAoC;QAEnC;;;;mBAAS,IAAI,cAAK,EAAY;WAAC;QAC/B;;;;mBAAe,IAAI,cAAK,EAAc;WAAC;QACvC;;;;mBAAqC,IAAI,cAAK,EAAE;WAAC;QAogB1D,4BAA4B;QACpB;;;;mBAAe,GAAG,EAAE;gBAC1B,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAC5B,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;gBACpC,CAAC;gBAED,IAAI,CAAC,kBAAkB,GAAG,IAAA,mBAAU,EAAC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE;oBAC7D,IAAI,QAAQ,GAAG,CAAC,CAAC;oBACjB,IAAI,QAAQ,GAAG,KAAK,CAAC;oBAErB,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;oBAC1C,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;wBACjB,QAAQ,GAAG,IAAI,CAAC;wBAChB,QAAQ,IAAI,0BAAgB,CAAC;wBAC7B,WAAW,CAAC,KAAK,EAAE,CAAC;wBACpB,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;oBACtC,CAAC,CAAC,CAAC;oBAEH,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;oBAE/D,MAAM;oBACN,yCAAyC;oBACzC,MAAM;oBAEN,IAAI,CAAC;wBACH,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;4BAC5C,yDAAyD;4BACzD,MAAM,kBAAM,CAAC,UAAU,CACrB,0BAAgB,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EACrD,SAAS,EACT,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAC/B,CAAC;4BAEF,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;4BACjC,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE,CAAC;gCAC3B,MAAM;4BACR,CAAC;4BAED,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC;gCAChC,QAAQ,EAAE,KAAK;gCACf,aAAa;gCACb,cAAc;gCACd,cAAc;6BACf,CAAC,CAAC;4BACH,IAAI,CAAC;gCACH,MAAM,SAAS,CAAC,QAAQ,CAAC,OAAO,CAC9B,OAAO,EACP,SAAS,CAAC,UAAU,EACpB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EACxC,CAAC,CACF,CAAC;gCACF,QAAQ,GAAG,CAAC,CAAC;gCACb,IAAI,IAAI,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC;oCAClC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gCAC7B,CAAC;4BACH,CAAC;4BAAC,OAAO,KAAK,EAAE,CAAC;gCACf,IAAI,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC;oCACxC,GAAG,CAAC,kBAAkB,CAAC,CAAC;oCACxB,QAAQ,EAAE,CAAC;oCACX,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;oCAC9B,MAAM;gCACR,CAAC;4BACH,CAAC;4BACD,IAAI,QAAQ,IAAI,0BAAgB,EAAE,CAAC;gCACjC,GAAG,CAAC,yBAAyB,CAAC,CAAC;gCAC/B,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;gCACpC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gCACxB,MAAM;4BACR,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC,CAAA,CAAC;gBACpB,CAAC,CAAC,CAAC;YACL,CAAC;WAAC;QA+EF;;;;mBAAO,KAAK,EAAE,IAAY,EAAE,EAAE;gBAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;gBAClC,IAAI,UAAU,EAAE,CAAC;oBACf,MAAM,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;gBAClE,CAAC;qBAAM,CAAC;oBACN,8CAA8C;oBAC9C,OAAO;gBACT,CAAC;YACH,CAAC;WAAC;QAwIF,0BAA0B;QAC1B;;;;mBAAa,CAAC,IAAmB,EAAE,EAAE,CACnC,IAAA,mBAAU,EAAO,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC3B,MAAM;gBACN,kBAAkB;gBAClB,MAAM;gBAEN,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBAElC,IAAI,CAAC,WAAW,CAAC,4BAAkB,CAAC,WAAW,CAAC,CAAC;gBACjD,MAAM,MAAM,GAA2C,EAAE,CAAC;gBAC1D,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;gBAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC;gBAEtE,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;gBAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC;oBAChC,QAAQ;oBACR,aAAa;oBACb,cAAc;oBACd,cAAc,EAAE,IAAI,CAAC,cAAc;iBACpC,CAAC,CAAC;gBAEH,IAAI,CAAC;oBACH,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAClD,OAAO,EACP,IAAI,CAAC,UAAU,EACf,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EACnC,CAAC,CACF,CAAC;oBACF,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE;wBAClE,aAAa;wBACb,cAAc;wBACd,cAAc;wBACd,UAAU;qBACX,CAAC,CAAC;oBACH,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;oBAC3B,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;gBACrB,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBACpB,MAAM,GAAG,GAAqB,KAAK,CAAC;oBACpC,0BAA0B;oBAC1B,GAAG,CACD,cAAc,EACd,OAAO,CAAC,MAAM,EAAE,EAChB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EACrE;wBACE,aAAa;wBACb,cAAc;wBACd,cAAc;wBACd,UAAU;qBACX,EACD,IAAI,CAAC,UAAU,CAChB,CAAC;oBACF,IAAI,GAAG,CAAC,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;wBAC7D,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;4BACtD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;wBACxB,CAAC;6BAAM,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;4BAC9D,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;wBACzB,CAAC;wBACD,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;wBACtC,CAAC,EAAE,CAAC;wBACJ,OAAO;oBACT,CAAC;oBACD,IAAI,GAAG,CAAC,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;wBAC7D,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;wBAChC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;wBACtC,CAAC,EAAE,CAAC;wBACJ,OAAO;oBACT,CAAC;yBAAM,CAAC;wBACN,UAAU;wBACV,GAAG,CAAC,sCAAsC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;wBAC3D,IAAI,CAAC,WAAW,CAAC,4BAAkB,CAAC,MAAM,CAAC,CAAC;wBAC5C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;wBACzB,CAAC,EAAE,CAAC;wBACJ,OAAO;oBACT,CAAC;gBACH,CAAC;gBAED,iCAAiC;gBACjC,IAAI,CAAC,IAAA,oBAAO,EAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC3C,IAAI,CAAC,WAAW,CAAC,4BAAkB,CAAC,MAAM,CAAC,CAAC;oBAC5C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;oBACzB,CAAC,EAAE,CAAC;oBACJ,OAAO;gBACT,CAAC;gBAED,YAAY;gBACZ,IAAI,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBACrC,0DAA0D;oBAC1D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACxB,CAAC;qBAAM,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;oBACnD,+BAA+B;oBAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;oBACvB,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC;wBAChC,QAAQ,EAAE,IAAI;wBACd,aAAa;wBACb,cAAc;wBACd,cAAc,EAAE,IAAI,CAAC,cAAc;qBACpC,CAAC,CAAC;oBACH,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CACzB,OAAO,EACP,IAAI,CAAC,UAAU,EACf,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CACzC,CAAC;oBACJ,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,IAAI,CAAC,WAAW,CAAC,4BAAkB,CAAC,MAAM,CAAC,CAAC;wBAC5C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;wBACzB,OAAO;oBACT,CAAC;oBACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACxB,CAAC;gBAED,IAAI,CAAC,WAAW,CAAC,4BAAkB,CAAC,SAAS,CAAC,CAAC;gBAC/C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC,EAAE,CAAC;YACN,CAAC,CAAC;WAAC;QA+GG;;;;mBAAsB,CAAC,eAA0B,EAAE,EAAE;gBAC3D,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACtC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;WAAC;QA3gCA,IAAI,CAAC,OAAO,GAAG;YACb,GAAG,wBAAc;YACjB,GAAG,OAAO;SACX,CAAC;QACF,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAChD,IAAI,CAAC,UAAU,GAAG,IAAA,yBAAe,EAAC,UAAU,CAAC,IAAI;YAC/C,mBAAmB;YACnB,KAAK;SACN,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,IAAA,yBAAe,EAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,IAAI,cAAc,CAAC,KAAc;QAC/B,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1C,OAAO;QACT,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,CAAC,aAAa,GAAG,IAAA,qBAAY,EAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,IAAA,qBAAY,EAAC,EAAE,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;YACrC,IAAI,CAAC,aAAa;gBAChB,IAAI,CAAC,OAAO,CAAC,mBAAmB;oBAChC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;QAE1D,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;QACjC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,IAAI,eAAM,EAAU,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;QAElC,6CAA6C;QAC7C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;gBAC5B,QAAQ,CAAC,cAAc,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;gBACrD,QAAQ,CAAC,cAAc,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC;YACrD,CAAC;QACH,CAAC;QAED,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACpC,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC;IAC3C,CAAC;IAED,kBAAkB;QAChB,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,eAAe,CAAC,EACd,OAAO,EACP,gBAAgB,EAChB,QAAQ,GAKT;QACC,GAAG,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,gBAAgB,CAAC;QACvC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;IACjC,CAAC;IAED,6BAA6B;IAC7B,KAAK,CAAC,gBAAgB;QACpB,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC/B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;YACjC,IAAI,CAAC,uBAAuB,GAAG,IAAI,cAAK,EAAE,CAAC;YAE3C,IAAI,OAAO,GAAG,IAAA,wBAAgB,EAC5B,IAAI,CAAC,OAAO,CAAC,OAAO,EACpB,IAAI,CAAC,OAAO,CAAC,OAAO,EACpB;gBACE,mBAAmB,EAAE,IAAI,CAAC,OAAO,CAAC,mBAAmB;aACtD,CACF,CAAC;YACF,MAAM,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAC5C,IAAI,kBAAkB,EAAE,CAAC;gBACvB,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CACjD,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAClD,CAAC;gBACF,IAAI,iBAAiB,CAAC,MAAM,EAAE,CAAC;oBAC7B,OAAO,GAAG,iBAAiB,CAAC;gBAC9B,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC;gBACzC,OAAO,GAAG,KAAK,CAAC,IAAI,CAClB,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,GAAG,OAAO,CAAC,CAAC,CAC/D,CAAC;YACJ,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACxD,IAAI,CAAC,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,UAAU,CAAC,CAAC;YAEhE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAC/B,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;IAEO,cAAc,CAAC,QAAkB;QACvC,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YACvD,IAAI,GAAG,CAAC,aAAa,KAAK,eAAO,CAAC,OAAO,EAAE,CAAC;gBAC1C,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC;gBAC7D,OAAO;YACT,CAAC;YAED,MAAM,UAAU,GAAG,GAAG,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YACrD,6BAA6B;YAC7B,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;YACvE,MAAM,aAAa,GACjB,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC;YAExD,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;YAEhC,mDAAmD;YACnD,IAAI,cAAc,IAAI,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACrE,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBAChE,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;oBAC/D,OAAO;gBACT,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;iBAAM,IACL,CAAC,cAAc;gBACf,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAC7C,CAAC;gBACD,IAAI,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBAC9D,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;gBACjE,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBACtB,OAAO;gBACT,CAAC;YACH,CAAC;YAED,IACE,IAAI,CAAC,OAAO,CAAC,kBAAkB;gBAC/B,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,EACrD,CAAC;gBACD,OAAO;YACT,CAAC;YAED,0BAA0B;YAC1B,MAAM,QAAQ,GAAG,IAAI,iBAAO,CAC1B,eAAO,CAAC,OAAO,EACf,eAAO,CAAC,QAAQ,EAChB,GAAG,CAAC,aAAa,CAClB,CAAC;YAEF,QAAQ;iBACL,YAAY,CAAC,oBAAoB,EAAE,IAAI,CAAC;iBACxC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;iBACvD,cAAc,EAAE,CAAC;YACpB,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC5C,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YACzC,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,SAAmB,EAAE,OAAO,GAAG,CAAC;QAC1D,IAAI,UAAU,GAAgB,EAAE,CAAC;QAEjC,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;YACvC,+BAA+B;YAC/B,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,CAAC;gBACpE,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,UAAU,CACtB,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAC9B,qBAAqB;YACrB,MAAM,QAAQ,GAAG,IAAI,uBAAY,EAAE,CAAC;YACpC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,cAAc,CAC3B,IAAA,YAAM,EAAC,OAAO,CAAC,EACf,IAAI,CAAC,OAAO,CAAC,SAAS,EACtB,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAChC,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;gBAClC,OAAO;YACT,CAAC;YAED,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;YAC3B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE9B,uBAAuB;YACvB,MAAM,gBAAgB,GAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAExE,QAAQ,CAAC,cAAc,GAAG,IAAI,qBAAS,CACrC,IAAA,+BAAmB,EAAC,MAAM,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,EACvD,CAAC,EACD,KAAK,EACL,IAAA,6BAAiB,EAAC,MAAM,CAAC,EACzB,gBAAgB,CAAC,CAAC,CAAC,EACnB,gBAAgB,CAAC,CAAC,CAAC,EACnB,MAAM,EACN,SAAS,EACT,SAAS,EACT,SAAS,EACT,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,aAAa,CACnB,CAAC;YAEF,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YACjC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YACzC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QACvD,CAAC,CAAC,CACH,CAAC;QAEF,GAAG,CACD,WAAW,EACX,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CACrC,CAAC;QAEF,IAAI,iBAAiB,GAAgC,EAAE,CAAC;QAExD,kEAAkE;QAClE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QACxC,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CACnD,IAAI,OAAO,CAAmB,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;gBAC5C,IACE,QAAQ,CAAC,cAAc,EAAE,IAAI;oBAC7B,IAAA,YAAM,EAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,EACrC,CAAC;oBACD,MAAM,SAAS,GAAG,MAAM,IAAA,kCAAwB,EAC9C,QAAQ,EACR,UAAU,CACX,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;wBAChB,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;oBACtB,CAAC,CAAC,CAAC;oBACH,IAAI,SAAS,EAAE,CAAC;wBACd,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBACzC,CAAC;oBAED,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,CAAC,CAAC,SAAS,CAAC,CAAC;gBACf,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,CAAC,EAAE,CAAC;gBACN,CAAC;YACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACjB,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAClC,CAAC,CAAC,CACH,CAAC;YAEF,iBAAiB,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpD,IAAI,UAAU,IAAI,YAAY,IAAI,YAAY,EAAE,CAAC;YAC/C,MAAM,aAAa,GAAG,CAAC,KAAK,IAAI,EAAE;gBAChC,MAAM,QAAQ,GAAG,MAAM,IAAA,mCAAwB,EAC7C;oBACE,OAAO,EAAE,UAAU;oBACnB,QAAQ,EAAE,YAAY;oBACtB,QAAQ,EAAE,YAAY;iBACvB,EACD;oBACE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;oBACjC,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB;oBACnD,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;iBAChE,CACF,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;oBAClB,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,KAAK,EAAE,CAAC;wBACzC,OAAO,MAAM,IAAA,mCAAwB,EACnC;4BACE,OAAO,EAAE,UAAU;4BACnB,QAAQ,EAAE,YAAY;4BACtB,QAAQ,EAAE,YAAY;yBACvB,EACD;4BACE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;4BACjC,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB;4BACnD,SAAS,EAAE,KAAK;yBACjB,CACF,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,CAAC;oBACV,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAE9B,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC;gBACtD,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;gBAEnD,GAAG,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;gBAE/C,QAAQ,CAAC,cAAc,GAAG,IAAI,qBAAS,CACrC,IAAA,+BAAmB,EAAC,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,EACxD,CAAC,EACD,KAAK,EACL,IAAA,6BAAiB,EAAC,OAAO,CAAC,EAC1B,gBAAgB,CAAC,CAAC,CAAC,EACnB,gBAAgB,CAAC,CAAC,CAAC,EACnB,OAAO,EACP,cAAc,CAAC,CAAC,CAAC,EACjB,cAAc,CAAC,CAAC,CAAC,EACjB,SAAS,EACT,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,aAAa,CACnB,CAAC;gBACF,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;gBAErD,OAAO,QAAQ,CAAC,cAAc,CAAC;YACjC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACnB,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBAC3B,UAAU,GAAG,EAAE,CAAC;gBAChB,iBAAiB,GAAG,EAAE,CAAC;YACzB,CAAC;YAED,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,eAAe,GAAG,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC;aACvE,MAAM,CACL,CACE,CAAC,EAGD,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAC9B;aACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;aACnB,MAAM,CAAC,CAAC,CAAC,EAAkB,EAAE,CAAC,OAAO,CAAC,KAAK,WAAW,CAAC,CAAC;QAE3D,UAAU,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;QAEpC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM;QACN,yBAAyB;QACzB,EAAE;QACF,wEAAwE;QACxE,qCAAqC;QACrC,MAAM;QACN,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBACjC,mCAAmC;gBACnC,MAAM,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,CAAC;YACjD,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QAED,mCAAmC;QACnC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAChE,wBAAwB;QACxB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,CAAC,aAAa,CAAC,GAAG,UAAU,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAE5B,mBAAmB;QACnB,0BAA0B;QAC1B,SAAS,CAAC;YACR,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;gBAAE,MAAM;YACnC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBAAE,MAAM;YACpC,MAAM,kBAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC9B,CAAC;QAED,wBAAwB;QACxB,IAAI,GAAG,GAAW,oBAAU,CAAC;QAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,KAAK,oBAAU,EAAE,CAAC;YACvD,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC;YACtC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;QAED,4BAA4B;QAC5B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QAC5B,CAAC;QAED,IAAI,GAAG,KAAK,uBAAa,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,kCAAkC;QAClC,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;IAEO,eAAe;QACrB,gDAAgD;QAChD,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,IAAI,SAAS,CAAC,KAAK,KAAK,4BAAkB,CAAC,MAAM,EAAE,CAAC;YAClD,SAAS,CAAC,WAAW,CAAC,4BAAkB,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;QAED,iEAAiE;QACjE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACrE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,IACE,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,SAAS;gBACtC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;gBACpD,IAAI,CAAC,KAAK,KAAK,4BAAkB,CAAC,MAAM,EACxC,CAAC;gBACD,IAAI,CAAC,WAAW,CAAC,4BAAkB,CAAC,OAAO,CAAC,CAAC;gBAC7C,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC;IAED,wBAAwB;IAChB,gBAAgB;QACtB,iBAAiB;QACjB,CAAC;YACC,gEAAgE;YAChE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS;iBACxB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;gBACf,IACE,IAAI,CAAC,OAAO,CAAC,SAAS;oBACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,uBAAY,CAAC,IAAI;oBAExC,OAAO,KAAK,CAAC;gBACf,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;iBACD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,4BAAkB,CAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACpC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,CAAC;YACC,+DAA+D;YAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC9B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,4BAAkB,CAAC,MAAM,CACnD,CAAC;YACF,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACpC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;QAC7B,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IA4ED,KAAK,CAAC,KAAK;QACT,MAAM;QACN,wBAAwB;QACxB,MAAM;QAEN,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAExB,iCAAiC;QACjC,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAAC;QAErC,oBAAoB;QACpB,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAC1C,IAAI,CAAC,cAAc,CAAC,GAAG,CACrB,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBAChB,CAAC,CAAC,oBAAU,CAAC,CAAC;YAChB,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAE1B,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IAC1B,CAAC;IAEO,QAAQ,CAAC,KAAe;QAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,eAAsC;QAC7D,MAAM;QACN,sDAAsD;QAEtD,4CAA4C;QAE5C,oEAAoE;QACpE,MAAM;QAEN,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjB,IAAI,CAAC,MAAM,GAAG,IAAI,mBAAU,EAAE,CAAC;gBACjC,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAC5D,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC;YAC9B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,IAAA,iCAAuB,EAAC,eAAe,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QAED,GAAG,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAC;QAC3C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAE7C,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;QAC1C,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAYD,mBAAmB;QACjB,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAC1C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAClC,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,gBAAgB;IAChB,IAAI,gBAAgB,CAAC,KAAkB;QACrC,IAAI,IAAI,CAAC,mBAAmB;YAC1B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC5B,KAAK,MAAM,eAAe,IAAI,KAAK,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,IAAA,iCAAuB,EAAC,eAAe,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS;YACX,CAAC;YACD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAClC,CAAC;IACD,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAEO,aAAa;QACnB,IAAA,4BAAkB,EAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1D,CAAC;IAEO,QAAQ,CAAC,QAAkB,EAAE,eAA0B;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC9B,CAAC,IAAI,EAAE,EAAE,CACP,IAAA,oBAAO,EAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;YAChC,IAAA,oBAAO,EAAC,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CACjD,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,UAAU,CAAC,cAAuB;QACxC,GAAG,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,aAAa,CAAC,IAAmB;QACvC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,IAAI,CAAC,KAAK,KAAK,4BAAkB,CAAC,SAAS,EAAE,CAAC;YAChD,8BAA8B;YAE9B,0DAA0D;YAC1D,sEAAsE;YACtE,mEAAmE;YACnE,mEAAmE;YACnE,IACE,IAAI,CAAC,SAAS;gBACd,qEAAqE;gBACrE,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,IAAI,SAAS;oBAC3C,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU;oBACrD,CAAC,CAAC,IAAI,CAAC;gBACT,IAAI,CAAC,SAAS,IAAI,SAAS,EAC3B,CAAC;gBACD,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;gBAExB,0BAA0B;gBAE1B,kEAAkE;gBAClE,+DAA+D;gBAC/D,yCAAyC;gBACzC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBAC/B,IACE,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS;wBAC9B,CAAC,4BAAkB,CAAC,OAAO,EAAE,4BAAkB,CAAC,MAAM,CAAC,CAAC,QAAQ,CAC9D,CAAC,CAAC,KAAK,CACR,EACD,CAAC;wBACD,CAAC,CAAC,WAAW,CAAC,4BAAkB,CAAC,MAAM,CAAC,CAAC;oBAC3C,CAAC;gBACH,CAAC;YACH,CAAC;YAED,kEAAkE;YAClE,oEAAoE;YACpE,yBAAyB;YACzB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;oBACxB,GAAG,CAAC,eAAe,CAAC,CAAC;oBACrB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,uBAAa,CAAC,CAAC,CAAC,CAAC;oBAC9D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gBAC5B,CAAC;gBACD,OAAO;YACT,CAAC;YAED,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAEpC,mCAAmC;YACnC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC/B,IACE,CAAC,CAAC,cAAc,CAAC,UAAU,KAAK,IAAI,CAAC,cAAc,CAAC,UAAU;oBAC9D,CAAC,CAAC,KAAK,KAAK,4BAAkB,CAAC,MAAM,EACrC,CAAC;oBACD,CAAC,CAAC,WAAW,CAAC,4BAAkB,CAAC,OAAO,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;QAED,CAAC;YACC,MAAM,IAAI,GAAG,CAAC,4BAAkB,CAAC,SAAS,EAAE,4BAAkB,CAAC,MAAM,CAAC,CAAC;YACvE,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC9D,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,4BAAkB,CAAC,SAAS,CAAC;YAC5C,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,EAAE,CAAC;gBACzD,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,GAAG,CAAC,YAAY,CAAC,CAAC;YAClB,IAAI,CAAC,cAAc,CAAC,GAAG,CACrB,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBAChB,CAAC,CAAC,oBAAU,CAAC,CAAC;YAChB,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAuHO,OAAO,CAAC,IAAmB;QACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,+BAA+B;IAC/B,6BAA6B;IAC7B,aAAa,CAAC,OAAgB,EAAE,IAAa,EAAE,QAAkB;QAC/D,MAAM;QACN,sCAAsC;QACtC,MAAM;QAEN,MAAM,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAEvE,wBAAwB;QACxB,IAAI,eAAsC,CAAC;QAC3C,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACvC,eAAe,GAAG,CAAC,CAAC;gBACpB,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,+CAA+C;YAC/C,eAAe,GAAG,IAAI,qBAAS,CAC7B,IAAA,qBAAY,EAAC,EAAE,CAAC,EAChB,CAAC,EACD,KAAK,EACL,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,EACrC,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,CACV,CAAC;YACF,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/C,CAAC;QAED,YAAY;QACZ,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,uBAAa,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YACzE,IAAI,CAAC,WAAW,CAAC,4BAAkB,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,KAAK,GAAG,aAAa,CAAC;QAE1C,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;YACvD,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAC;QAEH,6BAA6B;QAC7B,IACE,CAAC,4BAAkB,CAAC,OAAO,EAAE,4BAAkB,CAAC,MAAM,CAAC,CAAC,QAAQ,CAC9D,IAAI,CAAC,KAAK,CACX,EACD,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,uCAAuC;QACvC,IACE,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,eAAe,CAAC;YAChD,CAAC,IAAI,CAAC,cAAc,EACpB,CAAC;YACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,IAAI,CAAC,KAAK,KAAK,4BAAkB,CAAC,SAAS,EAAE,CAAC;gBAChD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAEO,OAAO,CAAC,QAAkB,EAAE,eAA0B;QAC5D,IACE,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,eAAe,CAAC;YACrD,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,EACzC,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,uBAAa,CAC5B,QAAQ,EACR,eAAe,EACf,IAAI,CAAC,cAAc,CACpB,CAAC;YACF,IACE,IAAI,CAAC,OAAO,CAAC,mBAAmB;gBAChC,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,EACvC,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,4BAAkB,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,QAAkB;QAC1C,KAAK,MAAM,eAAe,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACpD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAQO,YAAY,CAAC,EACnB,QAAQ,EACR,cAAc,EACd,aAAa,EACb,cAAc,GAMf;QACC,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,eAAO,CAAC,OAAO,EAAE,eAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,OAAO;aACJ,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC;aACpC,YAAY,CAAC,UAAU,EAAE,IAAA,6BAAiB,EAAC,OAAO,CAAC,CAAC,CAAC;QACxD,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,YAAY,CAAC,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACzD,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,YAAY,CAAC,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,YAAY,CAClB,OAAgB,EAChB,IAAa,EACb,QAAkB,EAClB,SAA2B;QAE3B,MAAM,QAAQ,GAAG,IAAI,iBAAO,CAC1B,OAAO,CAAC,aAAa,EACrB,eAAO,CAAC,KAAK,EACb,OAAO,CAAC,aAAa,CACtB,CAAC;QACF,QAAQ;aACL,YAAY,CAAC,YAAY,EAAE,SAAS,CAAC;aACrC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;aAC5D,cAAc,EAAE,CAAC;QACpB,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5C,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AArmCD,gCAqmCC;AAED,MAAM,gBAAgB,GAAG,CAAC,EACxB,cAAc,EACd,aAAa,GAId,EAAE,EAAE;IACH,OAAO,GAAG,cAAc,IAAI,aAAa,EAAE,CAAC;AAC9C,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,UAAkB,EAAE,EAAE;IAC9C,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;AAC3C,CAAC,CAAC","sourcesContent":["import { randomBytes } from \"crypto\";\nimport { isIPv4 } from \"net\";\n\nimport * as Int64 from \"int64-buffer\";\n\nimport isEqual from \"lodash/isEqual.js\";\nimport timers from \"timers/promises\";\nimport { type Address, Event, debug } from \"./imports/common\";\n\nimport { Candidate, candidateFoundation, candidatePriority } from \"./candidate\";\nimport { MdnsLookup } from \"./dns/lookup\";\nimport type { TransactionError } from \"./exceptions\";\nimport { type Cancelable, PQueue, cancelable, randomString } from \"./helper\";\nimport {\n CONSENT_FAILURES,\n CONSENT_INTERVAL,\n CandidatePair,\n CandidatePairState,\n ICE_COMPLETED,\n ICE_FAILED,\n type IceConnection,\n type IceOptions,\n type IceState,\n defaultOptions,\n serverReflexiveCandidate,\n sortCandidatePairs,\n validateAddress,\n validateRemoteCandidate,\n} from \"./iceBase\";\nimport { classes, methods } from \"./stun/const\";\nimport { Message } from \"./stun/message\";\nimport { StunProtocol } from \"./stun/protocol\";\nimport { createStunOverTurnClient } from \"./turn/protocol\";\nimport type { Protocol } from \"./types/model\";\nimport { getHostAddresses } from \"./utils\";\n\nconst log = debug(\"werift-ice : packages/ice/src/ice.ts : log\");\n\nexport class Connection implements IceConnection {\n localUsername = randomString(4);\n localPassword = randomString(22);\n remoteIsLite = false;\n remotePassword: string = \"\";\n remoteUsername: string = \"\";\n checkList: CandidatePair[] = [];\n localCandidates: Candidate[] = [];\n stunServer?: Address;\n turnServer?: Address;\n options: IceOptions;\n remoteCandidatesEnd = false;\n localCandidatesEnd = false;\n generation = -1;\n userHistory: { [username: string]: string } = {};\n private readonly tieBreaker: bigint = BigInt(\n new Int64.Uint64BE(randomBytes(64)).toString(),\n );\n state: IceState = \"new\";\n lookup?: MdnsLookup;\n\n private _remoteCandidates: Candidate[] = [];\n // P2P接続完了したソケット\n nominated?: CandidatePair;\n private nominating = false;\n private checkListDone = false;\n private checkListState = new PQueue<number>();\n private earlyChecks: [Message, Address, Protocol][] = [];\n private earlyChecksDone = false;\n private localCandidatesStart = false;\n private protocols: Protocol[] = [];\n private queryConsentHandle?: Cancelable<void>;\n private promiseGatherCandidates?: Event<[]>;\n\n readonly onData = new Event<[Buffer]>();\n readonly stateChanged = new Event<[IceState]>();\n readonly onIceCandidate: Event<[Candidate]> = new Event();\n\n constructor(\n private _iceControlling: boolean,\n options?: Partial<IceOptions>,\n ) {\n this.options = {\n ...defaultOptions,\n ...options,\n };\n const { stunServer, turnServer } = this.options;\n this.stunServer = validateAddress(stunServer) ?? [\n \"stun.l.google.com\",\n 19302,\n ];\n this.turnServer = validateAddress(turnServer);\n this.restart();\n log(\"new Connection\", this.options);\n }\n\n get iceControlling() {\n return this._iceControlling;\n }\n\n set iceControlling(value: boolean) {\n if (this.generation > 0 || this.nominated) {\n return;\n }\n this._iceControlling = value;\n for (const pair of this.checkList) {\n pair.iceControlling = value;\n }\n }\n\n async restart() {\n this.generation++;\n\n this.localUsername = randomString(4);\n this.localPassword = randomString(22);\n if (this.options.localPasswordPrefix) {\n this.localPassword =\n this.options.localPasswordPrefix +\n this.localPassword.slice(this.options.localPasswordPrefix.length);\n }\n this.userHistory[this.localUsername] = this.localPassword;\n\n this.remoteUsername = \"\";\n this.remotePassword = \"\";\n this.localCandidates = [];\n this._remoteCandidates = [];\n this.remoteCandidatesEnd = false;\n this.localCandidatesEnd = false;\n this.state = \"new\";\n this.lookup?.close?.();\n this.lookup = undefined;\n this.nominated = undefined;\n this.nominating = false;\n this.checkList = [];\n this.checkListDone = false;\n this.checkListState = new PQueue<number>();\n this.earlyChecks = [];\n this.earlyChecksDone = false;\n this.localCandidatesStart = false;\n\n // protocolsはincomingのearlyCheckに使うかもしれないので残す\n for (const protocol of this.protocols) {\n if (protocol.localCandidate) {\n protocol.localCandidate.generation = this.generation;\n protocol.localCandidate.ufrag = this.localUsername;\n }\n }\n\n this.queryConsentHandle?.resolve?.();\n this.queryConsentHandle = undefined;\n this.promiseGatherCandidates = undefined;\n }\n\n resetNominatedPair() {\n log(\"resetNominatedPair\");\n this.nominated = undefined;\n this.nominating = false;\n }\n\n setRemoteParams({\n iceLite,\n usernameFragment,\n password,\n }: {\n iceLite: boolean;\n usernameFragment: string;\n password: string;\n }) {\n log(\"setRemoteParams\", { iceLite, usernameFragment, password });\n this.remoteIsLite = iceLite;\n this.remoteUsername = usernameFragment;\n this.remotePassword = password;\n }\n\n // 4.1.1 Gathering Candidates\n async gatherCandidates() {\n if (!this.localCandidatesStart) {\n this.localCandidatesStart = true;\n this.promiseGatherCandidates = new Event();\n\n let address = getHostAddresses(\n this.options.useIpv4,\n this.options.useIpv6,\n {\n useLinkLocalAddress: this.options.useLinkLocalAddress,\n },\n );\n const { interfaceAddresses } = this.options;\n if (interfaceAddresses) {\n const filteredAddresses = address.filter((check) =>\n Object.values(interfaceAddresses).includes(check),\n );\n if (filteredAddresses.length) {\n address = filteredAddresses;\n }\n }\n if (this.options.additionalHostAddresses) {\n address = Array.from(\n new Set([...this.options.additionalHostAddresses, ...address]),\n );\n }\n\n const candidates = await this.getCandidates(address, 5);\n this.localCandidates = [...this.localCandidates, ...candidates];\n\n this.localCandidatesEnd = true;\n this.promiseGatherCandidates.execute();\n }\n this.setState(\"completed\");\n }\n\n private ensureProtocol(protocol: Protocol) {\n protocol.onRequestReceived.subscribe((msg, addr, data) => {\n if (msg.messageMethod !== methods.BINDING) {\n this.respondError(msg, addr, protocol, [400, \"Bad Request\"]);\n return;\n }\n\n const txUsername = msg.getAttributeValue(\"USERNAME\");\n // 相手にとってのremoteは自分にとってのlocal\n const { remoteUsername: localUsername } = decodeTxUsername(txUsername);\n const localPassword =\n this.userHistory[localUsername] ?? this.localPassword;\n\n const { iceControlling } = this;\n\n // 7.2.1.1. Detecting and Repairing Role Conflicts\n if (iceControlling && msg.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n if (this.tieBreaker >= msg.getAttributeValue(\"ICE-CONTROLLING\")) {\n this.respondError(msg, addr, protocol, [487, \"Role Conflict\"]);\n return;\n } else {\n this.switchRole(false);\n }\n } else if (\n !iceControlling &&\n msg.attributesKeys.includes(\"ICE-CONTROLLED\")\n ) {\n if (this.tieBreaker < msg.getAttributeValue(\"ICE-CONTROLLED\")) {\n this.respondError(msg, addr, protocol, [487, \"Role Conflict\"]);\n } else {\n this.switchRole(true);\n return;\n }\n }\n\n if (\n this.options.filterStunResponse &&\n !this.options.filterStunResponse(msg, addr, protocol)\n ) {\n return;\n }\n\n // # send binding response\n const response = new Message(\n methods.BINDING,\n classes.RESPONSE,\n msg.transactionId,\n );\n\n response\n .setAttribute(\"XOR-MAPPED-ADDRESS\", addr)\n .addMessageIntegrity(Buffer.from(localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n\n if (this.checkList.length === 0 && !this.earlyChecksDone) {\n this.earlyChecks.push([msg, addr, protocol]);\n } else {\n this.checkIncoming(msg, addr, protocol);\n }\n });\n protocol.onDataReceived.subscribe((data) => {\n try {\n this.onData.execute(data);\n } catch (error) {\n log(\"dataReceived\", error);\n }\n });\n }\n\n private async getCandidates(addresses: string[], timeout = 5) {\n let candidates: Candidate[] = [];\n\n addresses = addresses.filter((address) => {\n // ice restartで同じアドレスが追加されるのを防ぐ\n if (this.protocols.find((protocol) => protocol.localIp === address)) {\n return false;\n }\n return true;\n });\n\n await Promise.allSettled(\n addresses.map(async (address) => {\n // # create transport\n const protocol = new StunProtocol();\n this.ensureProtocol(protocol);\n try {\n await protocol.connectionMade(\n isIPv4(address),\n this.options.portRange,\n this.options.interfaceAddresses,\n );\n } catch (error) {\n log(\"error protocol STUN\", error);\n return;\n }\n\n protocol.localIp = address;\n this.protocols.push(protocol);\n\n // # add host candidate\n const candidateAddress: Address = [address, protocol.getExtraInfo()[1]];\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"udp\", candidateAddress[0]),\n 1,\n \"udp\",\n candidatePriority(\"host\"),\n candidateAddress[0],\n candidateAddress[1],\n \"host\",\n undefined,\n undefined,\n undefined,\n this.generation,\n this.localUsername,\n );\n\n this.pairLocalProtocol(protocol);\n candidates.push(protocol.localCandidate);\n this.onIceCandidate.execute(protocol.localCandidate);\n }),\n );\n\n log(\n \"protocols\",\n this.protocols.map((p) => p.localIp),\n );\n\n let candidatePromises: Promise<Candidate | void>[] = [];\n\n // # query STUN server for server-reflexive candidates (IPv4 only)\n const { stunServer, turnServer } = this;\n if (stunServer) {\n const stunPromises = this.protocols.map((protocol) =>\n new Promise<Candidate | void>(async (r, f) => {\n const timer = setTimeout(f, timeout * 1000);\n if (\n protocol.localCandidate?.host &&\n isIPv4(protocol.localCandidate?.host)\n ) {\n const candidate = await serverReflexiveCandidate(\n protocol,\n stunServer,\n ).catch((error) => {\n log(\"error\", error);\n });\n if (candidate) {\n this.onIceCandidate.execute(candidate);\n }\n\n clearTimeout(timer);\n r(candidate);\n } else {\n clearTimeout(timer);\n r();\n }\n }).catch((error) => {\n log(\"query STUN server\", error);\n }),\n );\n\n candidatePromises.push(...stunPromises);\n }\n\n const { turnUsername, turnPassword } = this.options;\n if (turnServer && turnUsername && turnPassword) {\n const turnCandidate = (async () => {\n const protocol = await createStunOverTurnClient(\n {\n address: turnServer,\n username: turnUsername,\n password: turnPassword,\n },\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n transport: this.options.turnTransport === \"tcp\" ? \"tcp\" : \"udp\",\n },\n ).catch(async (e) => {\n if (this.options.turnTransport !== \"tcp\") {\n return await createStunOverTurnClient(\n {\n address: turnServer,\n username: turnUsername,\n password: turnPassword,\n },\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n transport: \"tcp\",\n },\n );\n } else {\n throw e;\n }\n });\n this.ensureProtocol(protocol);\n this.protocols.push(protocol);\n\n const candidateAddress = protocol.turn.relayedAddress;\n const relatedAddress = protocol.turn.mappedAddress;\n\n log(\"turn candidateAddress\", candidateAddress);\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"relay\", \"udp\", candidateAddress[0]),\n 1,\n \"udp\",\n candidatePriority(\"relay\"),\n candidateAddress[0],\n candidateAddress[1],\n \"relay\",\n relatedAddress[0],\n relatedAddress[1],\n undefined,\n this.generation,\n this.localUsername,\n );\n this.onIceCandidate.execute(protocol.localCandidate);\n\n return protocol.localCandidate;\n })().catch((error) => {\n log(\"query TURN server\", error);\n });\n\n if (this.options.forceTurn) {\n candidates = [];\n candidatePromises = [];\n }\n\n candidatePromises.push(turnCandidate);\n }\n\n const extraCandidates = [...(await Promise.allSettled(candidatePromises))]\n .filter(\n (\n v,\n ): v is PromiseFulfilledResult<\n Awaited<(typeof candidatePromises)[number]>\n > => v.status === \"fulfilled\",\n )\n .map((v) => v.value)\n .filter((v): v is Candidate => typeof v !== \"undefined\");\n\n candidates.push(...extraCandidates);\n\n return candidates;\n }\n\n async connect() {\n // \"\"\"\n // Perform ICE handshake.\n //\n // This coroutine returns if a candidate pair was successfully nominated\n // and raises an exception otherwise.\n // \"\"\"\n log(\"start connect ice\");\n if (!this.localCandidatesEnd) {\n if (!this.localCandidatesStart) {\n throw new Error(\"Local candidates gathering was not performed\");\n }\n if (this.promiseGatherCandidates) {\n // wait for GatherCandidates finish\n await this.promiseGatherCandidates.asPromise();\n }\n }\n if (!this.remoteUsername || !this.remotePassword) {\n throw new Error(\"Remote username or password is missing\");\n }\n\n // # 5.7.1. Forming Candidate Pairs\n for (const c of this.remoteCandidates) {\n this.pairRemoteCandidate(c);\n }\n this.sortCheckList();\n\n this.unfreezeInitial();\n\n log(\"earlyChecks\", this.localPassword, this.earlyChecks.length);\n // # handle early checks\n for (const earlyCheck of this.earlyChecks) {\n this.checkIncoming(...earlyCheck);\n }\n this.earlyChecks = [];\n this.earlyChecksDone = true;\n\n // # perform checks\n // 5.8. Scheduling Checks\n for (;;) {\n if (this.state === \"closed\") break;\n if (!this.schedulingChecks()) break;\n await timers.setTimeout(20);\n }\n\n // # wait for completion\n let res: number = ICE_FAILED;\n while (this.checkList.length > 0 && res === ICE_FAILED) {\n res = await this.checkListState.get();\n log(\"checkListState\", res);\n }\n\n // # cancel remaining checks\n for (const check of this.checkList) {\n check.handle?.resolve?.();\n }\n\n if (res !== ICE_COMPLETED) {\n throw new Error(\"ICE negotiation failed\");\n }\n\n // # start consent freshness tests\n this.queryConsent();\n\n this.setState(\"connected\");\n }\n\n private unfreezeInitial() {\n // # unfreeze first pair for the first component\n const [firstPair] = this.checkList;\n if (!firstPair) return;\n if (firstPair.state === CandidatePairState.FROZEN) {\n firstPair.updateState(CandidatePairState.WAITING);\n }\n\n // # unfreeze pairs with same component but different foundations\n const seenFoundations = new Set(firstPair.localCandidate.foundation);\n for (const pair of this.checkList) {\n if (\n pair.component === firstPair.component &&\n !seenFoundations.has(pair.localCandidate.foundation) &&\n pair.state === CandidatePairState.FROZEN\n ) {\n pair.updateState(CandidatePairState.WAITING);\n seenFoundations.add(pair.localCandidate.foundation);\n }\n }\n }\n\n // 5.8 Scheduling Checks\n private schedulingChecks() {\n // Ordinary Check\n {\n // # find the highest-priority pair that is in the waiting state\n const pair = this.checkList\n .filter((pair) => {\n if (\n this.options.forceTurn &&\n pair.protocol.type === StunProtocol.type\n )\n return false;\n return true;\n })\n .find((pair) => pair.state === CandidatePairState.WAITING);\n if (pair) {\n pair.handle = this.checkStart(pair);\n return true;\n }\n }\n\n {\n // # find the highest-priority pair that is in the frozen state\n const pair = this.checkList.find(\n (pair) => pair.state === CandidatePairState.FROZEN,\n );\n if (pair) {\n pair.handle = this.checkStart(pair);\n return true;\n }\n }\n\n // # if we expect more candidates, keep going\n if (!this.remoteCandidatesEnd) {\n return !this.checkListDone;\n }\n\n return false;\n }\n\n // 4.1.1.4 ? 生存確認 life check\n private queryConsent = () => {\n if (this.queryConsentHandle) {\n this.queryConsentHandle.resolve();\n }\n\n this.queryConsentHandle = cancelable(async (_, __, onCancel) => {\n let failures = 0;\n let canceled = false;\n\n const cancelEvent = new AbortController();\n onCancel.once(() => {\n canceled = true;\n failures += CONSENT_FAILURES;\n cancelEvent.abort();\n this.queryConsentHandle = undefined;\n });\n\n const { localUsername, remoteUsername, iceControlling } = this;\n\n // \"\"\"\n // Periodically check consent (RFC 7675).\n // \"\"\"\n\n try {\n while (this.state !== \"closed\" && !canceled) {\n // # randomize between 0.8 and 1.2 times CONSENT_INTERVAL\n await timers.setTimeout(\n CONSENT_INTERVAL * (0.8 + 0.4 * Math.random()) * 1000,\n undefined,\n { signal: cancelEvent.signal },\n );\n\n const nominated = this.nominated;\n if (!nominated || canceled) {\n break;\n }\n\n const request = this.buildRequest({\n nominate: false,\n localUsername,\n remoteUsername,\n iceControlling,\n });\n try {\n await nominated.protocol.request(\n request,\n nominated.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n 0,\n );\n failures = 0;\n if (this.state === \"disconnected\") {\n this.setState(\"connected\");\n }\n } catch (error) {\n if (nominated.id === this.nominated?.id) {\n log(\"no stun response\");\n failures++;\n this.setState(\"disconnected\");\n break;\n }\n }\n if (failures >= CONSENT_FAILURES) {\n log(\"Consent to send expired\");\n this.queryConsentHandle = undefined;\n this.setState(\"closed\");\n break;\n }\n }\n } catch (error) {}\n });\n };\n\n async close() {\n // \"\"\"\n // Close the connection.\n // \"\"\"\n\n this.setState(\"closed\");\n\n // # stop consent freshness tests\n this.queryConsentHandle?.resolve?.();\n\n // # stop check list\n if (this.checkList && !this.checkListDone) {\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n }),\n );\n }\n\n this.nominated = undefined;\n for (const protocol of this.protocols) {\n if (protocol.close) {\n await protocol.close();\n }\n }\n\n this.protocols = [];\n this.localCandidates = [];\n\n this.lookup?.close?.();\n this.lookup = undefined;\n }\n\n private setState(state: IceState) {\n this.state = state;\n this.stateChanged.execute(state);\n }\n\n async addRemoteCandidate(remoteCandidate: Candidate | undefined) {\n // \"\"\"\n // Add a remote candidate or signal end-of-candidates.\n\n // To signal end-of-candidates, pass `None`.\n\n // :param remote_candidate: A :class:`Candidate` instance or `None`.\n // \"\"\"\n\n if (!remoteCandidate) {\n this.remoteCandidatesEnd = true;\n return;\n }\n\n if (remoteCandidate.host.includes(\".local\")) {\n try {\n if (!this.lookup) {\n this.lookup = new MdnsLookup();\n }\n const host = await this.lookup.lookup(remoteCandidate.host);\n remoteCandidate.host = host;\n } catch (error) {\n return;\n }\n }\n\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n return;\n }\n\n log(\"addRemoteCandidate\", remoteCandidate);\n this._remoteCandidates.push(remoteCandidate);\n\n this.pairRemoteCandidate(remoteCandidate);\n this.sortCheckList();\n }\n\n send = async (data: Buffer) => {\n const activePair = this.nominated;\n if (activePair) {\n await activePair.protocol.sendData(data, activePair.remoteAddr);\n } else {\n // log(\"Cannot send data, ice not connected\");\n return;\n }\n };\n\n getDefaultCandidate() {\n const candidates = this.localCandidates.sort(\n (a, b) => a.priority - b.priority,\n );\n const [candidate] = candidates;\n return candidate;\n }\n\n // for test only\n set remoteCandidates(value: Candidate[]) {\n if (this.remoteCandidatesEnd)\n throw new Error(\"Cannot set remote candidates after end-of-candidates.\");\n this._remoteCandidates = [];\n for (const remoteCandidate of value) {\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n continue;\n }\n this._remoteCandidates.push(remoteCandidate);\n }\n\n this.remoteCandidatesEnd = true;\n }\n get remoteCandidates() {\n return this._remoteCandidates;\n }\n\n private sortCheckList() {\n sortCandidatePairs(this.checkList, this.iceControlling);\n }\n\n private findPair(protocol: Protocol, remoteCandidate: Candidate) {\n const pair = this.checkList.find(\n (pair) =>\n isEqual(pair.protocol, protocol) &&\n isEqual(pair.remoteCandidate, remoteCandidate),\n );\n return pair;\n }\n\n private switchRole(iceControlling: boolean) {\n log(\"switch role\", iceControlling);\n this.iceControlling = iceControlling;\n this.sortCheckList();\n }\n\n private checkComplete(pair: CandidatePair) {\n pair.handle = undefined;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n // Updating the Nominated Flag\n\n // https://www.rfc-editor.org/rfc/rfc8445#section-7.3.1.5,\n // Once the nominated flag is set for a component of a data stream, it\n // concludes the ICE processing for that component. See Section 8.\n // So disallow overwriting of the pair nominated for that component\n if (\n pair.nominated &&\n // remoteのgenerationをチェックする.localのgenerationは更新が間に合わないかもしれないのでチェックしない\n (pair.remoteCandidate.generation != undefined\n ? pair.remoteCandidate.generation === this.generation\n : true) &&\n this.nominated == undefined\n ) {\n log(\"nominated\", pair.toJSON());\n this.nominated = pair;\n this.nominating = false;\n\n // 8.1.2. Updating States\n\n // The agent MUST remove all Waiting and Frozen pairs in the check\n // list and triggered check queue for the same component as the\n // nominated pairs for that media stream.\n for (const p of this.checkList) {\n if (\n p.component === pair.component &&\n [CandidatePairState.WAITING, CandidatePairState.FROZEN].includes(\n p.state,\n )\n ) {\n p.updateState(CandidatePairState.FAILED);\n }\n }\n }\n\n // Once there is at least one nominated pair in the valid list for\n // every component of at least one media stream and the state of the\n // check list is Running:\n if (this.nominated) {\n if (!this.checkListDone) {\n log(\"ICE completed\");\n this.checkListState.put(new Promise((r) => r(ICE_COMPLETED)));\n this.checkListDone = true;\n }\n return;\n }\n\n log(\"not completed\", pair.toJSON());\n\n // 7.1.3.2.3. Updating Pair States\n for (const p of this.checkList) {\n if (\n p.localCandidate.foundation === pair.localCandidate.foundation &&\n p.state === CandidatePairState.FROZEN\n ) {\n p.updateState(CandidatePairState.WAITING);\n }\n }\n }\n\n {\n const list = [CandidatePairState.SUCCEEDED, CandidatePairState.FAILED];\n if (this.checkList.find(({ state }) => !list.includes(state))) {\n return;\n }\n }\n\n if (!this.iceControlling) {\n const target = CandidatePairState.SUCCEEDED;\n if (this.checkList.find(({ state }) => state === target)) {\n return;\n }\n }\n\n if (!this.checkListDone) {\n log(\"ICE failed\");\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n }),\n );\n }\n }\n\n // 3. Terminology : Check\n checkStart = (pair: CandidatePair) =>\n cancelable<void>(async (r) => {\n // \"\"\"\n // Starts a check.\n // \"\"\"\n\n log(\"check start\", pair.toJSON());\n\n pair.updateState(CandidatePairState.IN_PROGRESS);\n const result: { response?: Message; addr?: Address } = {};\n const { remotePassword, remoteUsername, generation } = this;\n const localUsername = pair.localCandidate.ufrag ?? this.localUsername;\n\n const nominate = this.iceControlling && !this.remoteIsLite;\n const request = this.buildRequest({\n nominate,\n localUsername,\n remoteUsername,\n iceControlling: this.iceControlling,\n });\n\n try {\n const [response, addr] = await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(remotePassword, \"utf8\"),\n 4,\n );\n log(\"response received\", request.toJSON(), response.toJSON(), addr, {\n localUsername,\n remoteUsername,\n remotePassword,\n generation,\n });\n result.response = response;\n result.addr = addr;\n } catch (error: any) {\n const exc: TransactionError = error;\n // 7.1.3.1. Failure Cases\n log(\n \"failure case\",\n request.toJSON(),\n exc.response ? JSON.stringify(exc.response.toJSON(), null, 2) : error,\n {\n localUsername,\n remoteUsername,\n remotePassword,\n generation,\n },\n pair.remoteAddr,\n );\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 487) {\n if (request.attributesKeys.includes(\"ICE-CONTROLLED\")) {\n this.switchRole(true);\n } else if (request.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n this.switchRole(false);\n }\n await this.checkStart(pair).awaitable;\n r();\n return;\n }\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 401) {\n log(\"retry 401\", pair.toJSON());\n await this.checkStart(pair).awaitable;\n r();\n return;\n } else {\n // timeout\n log(\"checkStart CandidatePairState.FAILED\", pair.toJSON());\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n }\n\n // # check remote address matches\n if (!isEqual(result.addr, pair.remoteAddr)) {\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n\n // # success\n if (nominate || pair.remoteNominated) {\n // # nominated by agressive nomination or the remote party\n pair.nominated = true;\n } else if (this.iceControlling && !this.nominating) {\n // # perform regular nomination\n this.nominating = true;\n const request = this.buildRequest({\n nominate: true,\n localUsername,\n remoteUsername,\n iceControlling: this.iceControlling,\n });\n try {\n await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n );\n } catch (error) {\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n return;\n }\n pair.nominated = true;\n }\n\n pair.updateState(CandidatePairState.SUCCEEDED);\n this.checkComplete(pair);\n r();\n });\n\n private addPair(pair: CandidatePair) {\n this.checkList.push(pair);\n this.sortCheckList();\n }\n\n // 7.2. STUN Server Procedures\n // 7.2.1.3、7.2.1.4、および7.2.1.5\n checkIncoming(message: Message, addr: Address, protocol: Protocol) {\n // \"\"\"\n // Handle a successful incoming check.\n // \"\"\"\n\n const txUsername = message.getAttributeValue(\"USERNAME\");\n const { remoteUsername: localUsername } = decodeTxUsername(txUsername);\n\n // find remote candidate\n let remoteCandidate: Candidate | undefined;\n const [host, port] = addr;\n for (const c of this.remoteCandidates) {\n if (c.host === host && c.port === port) {\n remoteCandidate = c;\n break;\n }\n }\n if (!remoteCandidate) {\n // 7.2.1.3. Learning Peer Reflexive Candidates\n remoteCandidate = new Candidate(\n randomString(10),\n 1,\n \"udp\",\n message.getAttributeValue(\"PRIORITY\"),\n host,\n port,\n \"prflx\",\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n );\n this._remoteCandidates.push(remoteCandidate);\n }\n\n // find pair\n let pair = this.findPair(protocol, remoteCandidate);\n if (!pair) {\n pair = new CandidatePair(protocol, remoteCandidate, this.iceControlling);\n pair.updateState(CandidatePairState.WAITING);\n this.addPair(pair);\n }\n pair.localCandidate.ufrag = localUsername;\n\n log(\"Triggered Checks\", message.toJSON(), pair.toJSON(), {\n localUsername: this.localUsername,\n remoteUsername: this.remoteUsername,\n localPassword: this.localPassword,\n remotePassword: this.remotePassword,\n generation: this.generation,\n });\n\n // 7.2.1.4. Triggered Checks\n if (\n [CandidatePairState.WAITING, CandidatePairState.FAILED].includes(\n pair.state,\n )\n ) {\n pair.handle = this.checkStart(pair);\n }\n\n // 7.2.1.5. Updating the Nominated Flag\n if (\n message.attributesKeys.includes(\"USE-CANDIDATE\") &&\n !this.iceControlling\n ) {\n pair.remoteNominated = true;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n pair.nominated = true;\n this.checkComplete(pair);\n }\n }\n }\n\n private tryPair(protocol: Protocol, remoteCandidate: Candidate) {\n if (\n protocol.localCandidate?.canPairWith(remoteCandidate) &&\n !this.findPair(protocol, remoteCandidate)\n ) {\n const pair = new CandidatePair(\n protocol,\n remoteCandidate,\n this.iceControlling,\n );\n if (\n this.options.filterCandidatePair &&\n !this.options.filterCandidatePair(pair)\n ) {\n return;\n }\n pair.updateState(CandidatePairState.WAITING);\n this.addPair(pair);\n }\n }\n\n private pairLocalProtocol(protocol: Protocol) {\n for (const remoteCandidate of this.remoteCandidates) {\n this.tryPair(protocol, remoteCandidate);\n }\n }\n\n private pairRemoteCandidate = (remoteCandidate: Candidate) => {\n for (const protocol of this.protocols) {\n this.tryPair(protocol, remoteCandidate);\n }\n };\n\n private buildRequest({\n nominate,\n remoteUsername,\n localUsername,\n iceControlling,\n }: {\n nominate: boolean;\n remoteUsername: string;\n localUsername: string;\n iceControlling: boolean;\n }) {\n const txUsername = encodeTxUsername({ remoteUsername, localUsername });\n const request = new Message(methods.BINDING, classes.REQUEST);\n request\n .setAttribute(\"USERNAME\", txUsername)\n .setAttribute(\"PRIORITY\", candidatePriority(\"prflx\"));\n if (iceControlling) {\n request.setAttribute(\"ICE-CONTROLLING\", this.tieBreaker);\n if (nominate) {\n request.setAttribute(\"USE-CANDIDATE\", null);\n }\n } else {\n request.setAttribute(\"ICE-CONTROLLED\", this.tieBreaker);\n }\n return request;\n }\n\n private respondError(\n request: Message,\n addr: Address,\n protocol: Protocol,\n errorCode: [number, string],\n ) {\n const response = new Message(\n request.messageMethod,\n classes.ERROR,\n request.transactionId,\n );\n response\n .setAttribute(\"ERROR-CODE\", errorCode)\n .addMessageIntegrity(Buffer.from(this.localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n }\n}\n\nconst encodeTxUsername = ({\n remoteUsername,\n localUsername,\n}: {\n remoteUsername: string;\n localUsername: string;\n}) => {\n return `${remoteUsername}:${localUsername}`;\n};\n\nconst decodeTxUsername = (txUsername: string) => {\n const [remoteUsername, localUsername] = txUsername.split(\":\");\n return { remoteUsername, localUsername };\n};\n"]}
|
package/lib/ice/src/iceBase.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iceBase.js","sourceRoot":"","sources":["../../../../ice/src/iceBase.ts"],"names":[],"mappings":";;;AAqKA,0DASC;AAED,gDAsBC;AAGD,sDAQC;AAED,4DAkCC;AAED,0CAKC;AA5PD,mCAAoC;AACpC,2CAAgF;AAGhF,6CAK0B;AAC1B,wCAAgD;AAChD,4CAAyC;AAGzC,MAAM,GAAG,GAAG,IAAA,cAAK,EAAC,4CAA4C,CAAC,CAAC;AA+ChE,MAAa,aAAa;IAOxB,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,IAAI,IAAI;QACN,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YAC5B,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;YAC3C,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;SAC9C,CAAC;IACJ,CAAC;IAED,YACS,QAAkB,EAClB,eAA0B,EAC1B,cAAuB;QAF9B;;;;mBAAO,QAAQ;WAAU;QACzB;;;;mBAAO,eAAe;WAAW;QACjC;;;;mBAAO,cAAc;WAAS;QAzBvB;;;;mBAAK,IAAA,mBAAU,GAAE;WAAC;QAC3B;;;;;WAA0B;QAC1B;;;;mBAAY,KAAK;WAAC;QAClB;;;;mBAAkB,KAAK;WAAC;QACxB,2BAA2B;QACnB;;;;mBAAS,kBAAkB,CAAC,MAAM;WAAC;IAqBxC,CAAC;IAEJ,WAAW,CAAC,KAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,IAAI,cAAc;QAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;IACtC,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;IACvC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,qBAAqB,CAC1B,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,cAAc,CACpB,CAAC;IACJ,CAAC;CACF;AAvDD,sCAuDC;AAEY,QAAA,aAAa,GAAG,CAAU,CAAC;AAC3B,QAAA,UAAU,GAAG,CAAU,CAAC;AAExB,QAAA,gBAAgB,GAAG,CAAC,CAAC;AACrB,QAAA,gBAAgB,GAAG,CAAC,CAAC;AAElC,IAAY,kBAMX;AAND,WAAY,kBAAkB;IAC5B,+DAAU,CAAA;IACV,iEAAW,CAAA;IACX,yEAAe,CAAA;IACf,qEAAa,CAAA;IACb,+DAAU,CAAA;AACZ,CAAC,EANW,kBAAkB,kCAAlB,kBAAkB,QAM7B;AA8BY,QAAA,cAAc,GAAe;IACxC,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,IAAI;CACd,CAAC;AAEF,SAAgB,uBAAuB,CAAC,SAAoB;IAC1D,MAAM;IACN,2CAA2C;IAC3C,MAAM;IACN,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC;IAEnE,uCAAuC;IACvC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,kBAAkB,CAChC,KAGG,EACH,cAAuB;IAEvB,OAAO,KAAK;SACT,IAAI,CACH,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,qBAAqB,CACnB,CAAC,CAAC,cAAc,EAChB,CAAC,CAAC,eAAe,EACjB,cAAc,CACf;QACD,qBAAqB,CACnB,CAAC,CAAC,cAAc,EAChB,CAAC,CAAC,eAAe,EACjB,cAAc,CACf,CACJ;SACA,OAAO,EAAE,CAAC;AACf,CAAC;AAED,qDAAqD;AACrD,SAAgB,qBAAqB,CACnC,KAAkC,EAClC,MAAmC,EACnC,cAAuB;IAEvB,MAAM,CAAC,GAAG,CAAC,cAAc,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC;IAChE,MAAM,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC;IAChE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAEM,KAAK,UAAU,wBAAwB,CAC5C,QAAkB,EAClB,UAAmB;IAEnB,MAAM;IACN,4DAA4D;IAC5D,MAAM;IAEN,uBAAuB;IACvB,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,eAAO,CAAC,OAAO,EAAE,eAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAE/D,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;QAC/C,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,qBAAS,CAC7B,IAAA,+BAAmB,EAAC,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,EACxD,cAAc,CAAC,SAAS,EACxB,cAAc,CAAC,SAAS,EACxB,IAAA,6BAAiB,EAAC,OAAO,CAAC,EAC1B,QAAQ,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,EACnD,QAAQ,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,EACnD,OAAO,EACP,cAAc,CAAC,IAAI,EACnB,cAAc,CAAC,IAAI,CACpB,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW;QACX,GAAG,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,IAAc;IAC5C,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { randomUUID } from \"crypto\";\nimport { Candidate, candidateFoundation, candidatePriority } from \"./candidate\";\nimport type { MdnsLookup } from \"./dns/lookup\";\nimport type { Cancelable } from \"./helper\";\nimport {\n type Address,\n type Event,\n type InterfaceAddresses,\n debug,\n} from \"./imports/common\";\nimport { classes, methods } from \"./stun/const\";\nimport { Message } from \"./stun/message\";\nimport type { Protocol } from \"./types/model\";\n\nconst log = debug(\"werift-ice : packages/ice/src/ice.ts : log\");\n\nexport interface IceConnection {\n iceControlling: boolean;\n localUsername: string;\n localPassword: string;\n remotePassword: string;\n remoteUsername: string;\n remoteIsLite: boolean;\n checkList: CandidatePair[];\n localCandidates: Candidate[];\n stunServer?: Address;\n turnServer?: Address;\n generation: number;\n options: IceOptions;\n remoteCandidatesEnd: boolean;\n localCandidatesEnd: boolean;\n state: IceState;\n lookup?: MdnsLookup;\n nominated?: CandidatePair;\n\n readonly onData: Event<[Buffer]>;\n readonly stateChanged: Event<[IceState]>;\n readonly onIceCandidate: Event<[Candidate]>;\n\n restart(): void;\n\n setRemoteParams(params: {\n iceLite: boolean;\n usernameFragment: string;\n password: string;\n }): void;\n\n gatherCandidates(): Promise<void>;\n\n connect(): Promise<void>;\n\n close(): Promise<void>;\n\n addRemoteCandidate(remoteCandidate: Candidate | undefined): Promise<void>;\n\n send(data: Buffer): Promise<void>;\n\n getDefaultCandidate(): Candidate | undefined;\n resetNominatedPair(): void;\n}\n\nexport class CandidatePair {\n readonly id = randomUUID();\n handle?: Cancelable<void>;\n nominated = false;\n remoteNominated = false;\n // 5.7.4. Computing States\n private _state = CandidatePairState.FROZEN;\n get state() {\n return this._state;\n }\n\n toJSON() {\n return this.json;\n }\n\n get json() {\n return {\n protocol: this.protocol.type,\n localCandidate: this.localCandidate.toSdp(),\n remoteCandidate: this.remoteCandidate.toSdp(),\n };\n }\n\n constructor(\n public protocol: Protocol,\n public remoteCandidate: Candidate,\n public iceControlling: boolean,\n ) {}\n\n updateState(state: CandidatePairState) {\n this._state = state;\n }\n\n get localCandidate() {\n if (!this.protocol.localCandidate) {\n throw new Error(\"localCandidate not exist\");\n }\n return this.protocol.localCandidate;\n }\n\n get remoteAddr(): Address {\n return [this.remoteCandidate.host, this.remoteCandidate.port];\n }\n\n get component() {\n return this.localCandidate.component;\n }\n\n get priority() {\n return candidatePairPriority(\n this.localCandidate,\n this.remoteCandidate,\n this.iceControlling,\n );\n }\n}\n\nexport const ICE_COMPLETED = 1 as const;\nexport const ICE_FAILED = 2 as const;\n\nexport const CONSENT_INTERVAL = 5;\nexport const CONSENT_FAILURES = 6;\n\nexport enum CandidatePairState {\n FROZEN = 0,\n WAITING = 1,\n IN_PROGRESS = 2,\n SUCCEEDED = 3,\n FAILED = 4,\n}\n\nexport type IceState =\n | \"disconnected\"\n | \"closed\"\n | \"completed\"\n | \"new\"\n | \"connected\";\n\nexport interface IceOptions {\n stunServer?: Address;\n turnServer?: Address;\n turnUsername?: string;\n turnPassword?: string;\n turnTransport?: \"udp\" | \"tcp\";\n forceTurn?: boolean;\n localPasswordPrefix?: string;\n useIpv4: boolean;\n useIpv6: boolean;\n portRange?: [number, number];\n interfaceAddresses?: InterfaceAddresses;\n additionalHostAddresses?: string[];\n filterStunResponse?: (\n message: Message,\n addr: Address,\n protocol: Protocol,\n ) => boolean;\n filterCandidatePair?: (pair: CandidatePair) => boolean;\n}\n\nexport const defaultOptions: IceOptions = {\n useIpv4: true,\n useIpv6: true,\n};\n\nexport function validateRemoteCandidate(candidate: Candidate) {\n // \"\"\"\n // Check the remote candidate is supported.\n // \"\"\"\n if (![\"host\", \"relay\", \"srflx\"].includes(candidate.type))\n throw new Error(`Unexpected candidate type \"${candidate.type}\"`);\n\n // ipaddress.ip_address(candidate.host)\n return candidate;\n}\n\nexport function sortCandidatePairs(\n pairs: {\n localCandidate: Pick<Candidate, \"priority\">;\n remoteCandidate: Pick<Candidate, \"priority\">;\n }[],\n iceControlling: boolean,\n) {\n return pairs\n .sort(\n (a, b) =>\n candidatePairPriority(\n a.localCandidate,\n a.remoteCandidate,\n iceControlling,\n ) -\n candidatePairPriority(\n b.localCandidate,\n b.remoteCandidate,\n iceControlling,\n ),\n )\n .reverse();\n}\n\n// 5.7.2. Computing Pair Priority and Ordering Pairs\nexport function candidatePairPriority(\n local: Pick<Candidate, \"priority\">,\n remote: Pick<Candidate, \"priority\">,\n iceControlling: boolean,\n) {\n const G = (iceControlling && local.priority) || remote.priority;\n const D = (iceControlling && remote.priority) || local.priority;\n return (1 << 32) * Math.min(G, D) + 2 * Math.max(G, D) + (G > D ? 1 : 0);\n}\n\nexport async function serverReflexiveCandidate(\n protocol: Protocol,\n stunServer: Address,\n) {\n // \"\"\"\n // Query STUN server to obtain a server-reflexive candidate.\n // \"\"\"\n\n // # perform STUN query\n const request = new Message(methods.BINDING, classes.REQUEST);\n try {\n const [response] = await protocol.request(request, stunServer);\n\n const localCandidate = protocol.localCandidate;\n if (!localCandidate) {\n throw new Error(\"not exist\");\n }\n\n const candidate = new Candidate(\n candidateFoundation(\"srflx\", \"udp\", localCandidate.host),\n localCandidate.component,\n localCandidate.transport,\n candidatePriority(\"srflx\"),\n response.getAttributeValue(\"XOR-MAPPED-ADDRESS\")[0],\n response.getAttributeValue(\"XOR-MAPPED-ADDRESS\")[1],\n \"srflx\",\n localCandidate.host,\n localCandidate.port,\n );\n return candidate;\n } catch (error) {\n // todo fix\n log(\"error serverReflexiveCandidate\", error);\n }\n}\n\nexport function validateAddress(addr?: Address): Address | undefined {\n if (addr && Number.isNaN(addr[1])) {\n return [addr[0], 443];\n }\n return addr;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"iceBase.js","sourceRoot":"","sources":["../../../../ice/src/iceBase.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\nimport { Candidate, candidateFoundation, candidatePriority } from \"./candidate\";\nimport type { MdnsLookup } from \"./dns/lookup\";\nimport type { Cancelable } from \"./helper\";\nimport {\n type Address,\n type Event,\n type InterfaceAddresses,\n debug,\n} from \"./imports/common\";\nimport { classes, methods } from \"./stun/const\";\nimport { Message } from \"./stun/message\";\nimport type { Protocol } from \"./types/model\";\n\nconst log = debug(\"werift-ice : packages/ice/src/ice.ts : log\");\n\nexport interface IceConnection {\n iceControlling: boolean;\n localUsername: string;\n localPassword: string;\n remotePassword: string;\n remoteUsername: string;\n remoteIsLite: boolean;\n checkList: CandidatePair[];\n localCandidates: Candidate[];\n stunServer?: Address;\n turnServer?: Address;\n generation: number;\n options: IceOptions;\n remoteCandidatesEnd: boolean;\n localCandidatesEnd: boolean;\n state: IceState;\n lookup?: MdnsLookup;\n nominated?: CandidatePair;\n\n readonly onData: Event<[Buffer]>;\n readonly stateChanged: Event<[IceState]>;\n readonly onIceCandidate: Event<[Candidate]>;\n\n restart(): void;\n\n setRemoteParams(params: {\n iceLite: boolean;\n usernameFragment: string;\n password: string;\n }): void;\n\n gatherCandidates(): Promise<void>;\n\n connect(): Promise<void>;\n\n close(): Promise<void>;\n\n addRemoteCandidate(remoteCandidate: Candidate | undefined): Promise<void>;\n\n send(data: Buffer): Promise<void>;\n\n getDefaultCandidate(): Candidate | undefined;\n resetNominatedPair(): void;\n}\n\nexport class CandidatePair {\n readonly id = randomUUID();\n handle?: Cancelable<void>;\n nominated = false;\n remoteNominated = false;\n // 5.7.4. Computing States\n private _state = CandidatePairState.FROZEN;\n get state() {\n return this._state;\n }\n\n toJSON() {\n return this.json;\n }\n\n get json() {\n return {\n protocol: this.protocol.type,\n localCandidate: this.localCandidate.toSdp(),\n remoteCandidate: this.remoteCandidate.toSdp(),\n };\n }\n\n constructor(\n public protocol: Protocol,\n public remoteCandidate: Candidate,\n public iceControlling: boolean,\n ) {}\n\n updateState(state: CandidatePairState) {\n this._state = state;\n }\n\n get localCandidate() {\n if (!this.protocol.localCandidate) {\n throw new Error(\"localCandidate not exist\");\n }\n return this.protocol.localCandidate;\n }\n\n get remoteAddr(): Address {\n return [this.remoteCandidate.host, this.remoteCandidate.port];\n }\n\n get component() {\n return this.localCandidate.component;\n }\n\n get priority() {\n return candidatePairPriority(\n this.localCandidate,\n this.remoteCandidate,\n this.iceControlling,\n );\n }\n}\n\nexport const ICE_COMPLETED = 1 as const;\nexport const ICE_FAILED = 2 as const;\n\nexport const CONSENT_INTERVAL = 5;\nexport const CONSENT_FAILURES = 6;\n\nexport enum CandidatePairState {\n FROZEN = 0,\n WAITING = 1,\n IN_PROGRESS = 2,\n SUCCEEDED = 3,\n FAILED = 4,\n}\n\nexport type IceState =\n | \"disconnected\"\n | \"closed\"\n | \"completed\"\n | \"new\"\n | \"connected\";\n\nexport interface IceOptions {\n stunServer?: Address;\n turnServer?: Address;\n turnUsername?: string;\n turnPassword?: string;\n turnTransport?: \"udp\" | \"tcp\";\n forceTurn?: boolean;\n localPasswordPrefix?: string;\n useIpv4: boolean;\n useIpv6: boolean;\n useLinkLocalAddress?: boolean;\n portRange?: [number, number];\n interfaceAddresses?: InterfaceAddresses;\n additionalHostAddresses?: string[];\n filterStunResponse?: (\n message: Message,\n addr: Address,\n protocol: Protocol,\n ) => boolean;\n filterCandidatePair?: (pair: CandidatePair) => boolean;\n}\n\nexport const defaultOptions: IceOptions = {\n useIpv4: true,\n useIpv6: true,\n};\n\nexport function validateRemoteCandidate(candidate: Candidate) {\n // \"\"\"\n // Check the remote candidate is supported.\n // \"\"\"\n if (![\"host\", \"relay\", \"srflx\"].includes(candidate.type))\n throw new Error(`Unexpected candidate type \"${candidate.type}\"`);\n\n // ipaddress.ip_address(candidate.host)\n return candidate;\n}\n\nexport function sortCandidatePairs(\n pairs: {\n localCandidate: Pick<Candidate, \"priority\">;\n remoteCandidate: Pick<Candidate, \"priority\">;\n }[],\n iceControlling: boolean,\n) {\n return pairs\n .sort(\n (a, b) =>\n candidatePairPriority(\n a.localCandidate,\n a.remoteCandidate,\n iceControlling,\n ) -\n candidatePairPriority(\n b.localCandidate,\n b.remoteCandidate,\n iceControlling,\n ),\n )\n .reverse();\n}\n\n// 5.7.2. Computing Pair Priority and Ordering Pairs\nexport function candidatePairPriority(\n local: Pick<Candidate, \"priority\">,\n remote: Pick<Candidate, \"priority\">,\n iceControlling: boolean,\n) {\n const G = (iceControlling && local.priority) || remote.priority;\n const D = (iceControlling && remote.priority) || local.priority;\n return (1 << 32) * Math.min(G, D) + 2 * Math.max(G, D) + (G > D ? 1 : 0);\n}\n\nexport async function serverReflexiveCandidate(\n protocol: Protocol,\n stunServer: Address,\n) {\n // \"\"\"\n // Query STUN server to obtain a server-reflexive candidate.\n // \"\"\"\n\n // # perform STUN query\n const request = new Message(methods.BINDING, classes.REQUEST);\n try {\n const [response] = await protocol.request(request, stunServer);\n\n const localCandidate = protocol.localCandidate;\n if (!localCandidate) {\n throw new Error(\"not exist\");\n }\n\n const candidate = new Candidate(\n candidateFoundation(\"srflx\", \"udp\", localCandidate.host),\n localCandidate.component,\n localCandidate.transport,\n candidatePriority(\"srflx\"),\n response.getAttributeValue(\"XOR-MAPPED-ADDRESS\")[0],\n response.getAttributeValue(\"XOR-MAPPED-ADDRESS\")[1],\n \"srflx\",\n localCandidate.host,\n localCandidate.port,\n );\n return candidate;\n } catch (error) {\n // todo fix\n log(\"error serverReflexiveCandidate\", error);\n }\n}\n\nexport function validateAddress(addr?: Address): Address | undefined {\n if (addr && Number.isNaN(addr[1])) {\n return [addr[0], 443];\n }\n return addr;\n}\n"]}
|
|
@@ -37,11 +37,11 @@ class Transaction {
|
|
|
37
37
|
writable: true,
|
|
38
38
|
value: const_1.RETRY_RTO
|
|
39
39
|
});
|
|
40
|
-
Object.defineProperty(this, "
|
|
40
|
+
Object.defineProperty(this, "ended", {
|
|
41
41
|
enumerable: true,
|
|
42
42
|
configurable: true,
|
|
43
43
|
writable: true,
|
|
44
|
-
value:
|
|
44
|
+
value: false
|
|
45
45
|
});
|
|
46
46
|
Object.defineProperty(this, "tries", {
|
|
47
47
|
enumerable: true,
|
|
@@ -83,23 +83,17 @@ class Transaction {
|
|
|
83
83
|
writable: true,
|
|
84
84
|
value: async () => {
|
|
85
85
|
try {
|
|
86
|
-
this.retry()
|
|
86
|
+
this.retry().catch((e) => {
|
|
87
|
+
log("retry failed", e);
|
|
88
|
+
});
|
|
87
89
|
const res = await this.onResponse.asPromise();
|
|
88
90
|
return res;
|
|
89
91
|
}
|
|
90
92
|
catch (error) {
|
|
91
|
-
// log(
|
|
92
|
-
// "transaction run failed",
|
|
93
|
-
// error,
|
|
94
|
-
// this.protocol.type,
|
|
95
|
-
// this.request.toJSON(),
|
|
96
|
-
// );
|
|
97
93
|
throw error;
|
|
98
94
|
}
|
|
99
95
|
finally {
|
|
100
|
-
|
|
101
|
-
clearTimeout(this.timeoutHandle);
|
|
102
|
-
}
|
|
96
|
+
this.cancel();
|
|
103
97
|
}
|
|
104
98
|
}
|
|
105
99
|
});
|
|
@@ -107,26 +101,29 @@ class Transaction {
|
|
|
107
101
|
enumerable: true,
|
|
108
102
|
configurable: true,
|
|
109
103
|
writable: true,
|
|
110
|
-
value: () => {
|
|
104
|
+
value: async () => {
|
|
105
|
+
while (this.tries < this.triesMax && !this.ended) {
|
|
106
|
+
this.protocol.sendStun(this.request, this.addr).catch((e) => {
|
|
107
|
+
log("send stun failed", e);
|
|
108
|
+
});
|
|
109
|
+
await new Promise((r) => setTimeout(r, this.timeoutDelay));
|
|
110
|
+
if (this.ended) {
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
this.timeoutDelay *= 2;
|
|
114
|
+
this.tries++;
|
|
115
|
+
}
|
|
111
116
|
if (this.tries >= this.triesMax) {
|
|
112
117
|
log(`retry failed times:${this.tries} maxLimit:${this.triesMax}`);
|
|
113
118
|
this.onResponse.error(new exceptions_1.TransactionTimeout());
|
|
114
|
-
return;
|
|
115
119
|
}
|
|
116
|
-
this.protocol.sendStun(this.request, this.addr).catch((e) => {
|
|
117
|
-
log("send stun failed", e);
|
|
118
|
-
});
|
|
119
|
-
this.timeoutHandle = setTimeout(this.retry, this.timeoutDelay);
|
|
120
|
-
this.timeoutDelay *= 2;
|
|
121
|
-
this.tries++;
|
|
122
120
|
}
|
|
123
121
|
});
|
|
124
122
|
this.triesMax =
|
|
125
123
|
1 + (this.retransmissions ? this.retransmissions : const_1.RETRY_MAX);
|
|
126
124
|
}
|
|
127
125
|
cancel() {
|
|
128
|
-
|
|
129
|
-
clearTimeout(this.timeoutHandle);
|
|
126
|
+
this.ended = true;
|
|
130
127
|
}
|
|
131
128
|
}
|
|
132
129
|
exports.Transaction = Transaction;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../../../ice/src/stun/transaction.ts"],"names":[],"mappings":";;;AAAA,8CAA+D;AAE/D,8CAAsE;AAEtE,mCAAwD;AAGxD,MAAM,GAAG,GAAG,IAAA,cAAK,EAAC,iDAAiD,CAAC,CAAC;AAErE,MAAa,WAAW;IAOtB,YACU,OAAgB,EAChB,IAAa,EACb,QAAkB,EAClB,eAAwB;QAHhC;;;;mBAAQ,OAAO;WAAS;QACxB;;;;mBAAQ,IAAI;WAAS;QACrB;;;;mBAAQ,QAAQ;WAAU;QAC1B;;;;mBAAQ,eAAe;WAAS;QAV1B;;;;mBAAe,iBAAS;WAAC;
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../../../ice/src/stun/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Address, Event, debug } from \"../imports/common\";\n\nimport { TransactionFailed, TransactionTimeout } from \"../exceptions\";\nimport type { Protocol } from \"../types/model\";\nimport { RETRY_MAX, RETRY_RTO, classes } from \"./const\";\nimport type { Message } from \"./message\";\n\nconst log = debug(\"werift-ice:packages/ice/src/stun/transaction.ts\");\n\nexport class Transaction {\n private timeoutDelay = RETRY_RTO;\n ended = false;\n private tries = 0;\n private readonly triesMax: number;\n private readonly onResponse = new Event<[Message, Address]>();\n\n constructor(\n private request: Message,\n private addr: Address,\n private protocol: Protocol,\n private retransmissions?: number,\n ) {\n this.triesMax =\n 1 + (this.retransmissions ? this.retransmissions : RETRY_MAX);\n }\n\n responseReceived = (message: Message, addr: Address) => {\n if (this.onResponse.length > 0) {\n if (message.messageClass === classes.RESPONSE) {\n this.onResponse.execute(message, addr);\n this.onResponse.complete();\n } else {\n this.onResponse.error(new TransactionFailed(message, addr));\n }\n }\n };\n\n run = async () => {\n try {\n this.retry().catch((e) => {\n log(\"retry failed\", e);\n });\n const res = await this.onResponse.asPromise();\n return res;\n } catch (error) {\n throw error;\n } finally {\n this.cancel();\n }\n };\n\n private retry = async () => {\n while (this.tries < this.triesMax && !this.ended) {\n this.protocol.sendStun(this.request, this.addr).catch((e) => {\n log(\"send stun failed\", e);\n });\n await new Promise((r) => setTimeout(r, this.timeoutDelay));\n if (this.ended) {\n break;\n }\n this.timeoutDelay *= 2;\n this.tries++;\n }\n if (this.tries >= this.triesMax) {\n log(`retry failed times:${this.tries} maxLimit:${this.triesMax}`);\n this.onResponse.error(new TransactionTimeout());\n }\n };\n\n cancel() {\n this.ended = true;\n }\n}\n"]}
|