Sip.js: UserAgent.stop() ํ•จ์ˆ˜๋Š” ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๋งŽ์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2020๋…„ 10์›” 06์ผ  ยท  7์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: onsip/SIP.js

๋ฒ„๊ทธ ์„ค๋ช…
์–ด๋–ค ์ด์œ ๋กœ "UserAgent.stop()" ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ ์ ˆํ•œ ์•ฝ์†์œผ๋กœ ์‘๋‹ตํ•  ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์„ ์ค‘์ง€ํ•˜๋Š” ๋ฐ ์•ฝ 30์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋‹ฌ์„ฑํ•˜๋ ค๊ณ ํ•˜๋Š” ๊ฒƒ์€ ๋“ฑ๋ก ์ทจ์†Œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ „์ฒด ๋“ฑ๋ก ์ทจ์†Œ ๋ช…๋ น์ž…๋‹ˆ๋‹ค.

  1. ๋ชจ๋“  SIP ๊ตฌ๋… ์ง€์šฐ๊ธฐ.
  2. ์›น ์†Œ์ผ“ ์—ฐ๊ฒฐ์„ ๋‹ซ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด "stop()" ํ•จ์ˆ˜๊ฐ€ ์ •ํ™•ํžˆ ๊ทธ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๋งŽ์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

๋กœ๊ทธ
๋‹ค์Œ์€ ์ฝ˜์†”์˜ ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.

๊ด€์ฐฐ๋œ ํ–‰๋™
์•ฝ 32์ดˆ ํ›„์— 15:14:05.797์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ ๋กœ๊ทธ:
sip.subscribe-dialog | Timer N expired for SUBSCRIBE dialog. Timed out waiting for NOTIFY.
์œ„์˜ ๋กœ๊ทธ ์ดํ›„์—๋งŒ ๊ฒŒ์‹œ์ž์™€ ์ „์†ก(WS) ์ˆ˜์ค€์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
ํƒ€์ด๋จธ๊ฐ€ ๋งŒ๋ฃŒ๋˜์—ˆ์ง€๋งŒ ์™„์ „ํžˆ ํ™•์‹คํ•˜์ง€ ์•Š์€ SUBSCRIBE ๋ฉ”์‹œ์ง€์˜ ๊ฒฐ๊ณผ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ™˜๊ฒฝ์ •๋ณด

  • Kamailio 5.3.5(์›น ์†Œ์ผ“)
  • ๊ตฌ๊ธ€ ํฌ๋กฌ 85.0.4183.121

    • SIP.JS 0.17.1

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋…์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ WebSocket์„ ๋‹ซ๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค(20-50์ดˆ).

๋‚˜๋Š” ์‹œ๋„ํ–ˆ๋‹ค:

  • @slavikbialik์ด ์ œ์•ˆํ•œ ๋Œ€๋กœ ์ˆ˜๋™์œผ๋กœ ๊ฐœ์ฒด๋ฅผ ํŒŒ๊ดดํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚ด ๋ฌธ์ œ๊ฐ€ WebSocket๊ณผ ๊ด€๋ จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด userAgent.transport.ws.close() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WebSocket์„ ์ˆ˜๋™์œผ๋กœ ๋‹ซ์Šต๋‹ˆ๋‹ค.
  • ํฌ๋กฌ๊ณผ ํŒŒ์ด์–ดํญ์Šค์—์„œ.

ํŠน์ • ๊ตฌ์„ฑ์ด ์—†์œผ๋ฉฐ SIP.js ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ผ ์žฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋„์›€์ด ๋˜๊ฑฐ๋‚˜ ๋‚ด ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด sip ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ WebSocket์„ ์—ด๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ๋‹ซ์•˜์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค 1์ดˆ ๋ฏธ๋งŒ ์ง€์†๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

wss

๋ชจ๋“  7 ๋Œ“๊ธ€

์ฝ”๋“œ์—์„œ ํ™•์ธ...

@john-e-riordan ์ด๊ฒƒ์€ ์ž‘์—… ์ˆœ์„œ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

user-agent.stop() ์˜ ์ƒ๋‹จ์—์„œ Stopped ์ƒํƒœ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ registerers , sessions , subscriptions ์ˆœ์œผ๋กœ ์ˆœํ™˜ํ•ฉ๋‹ˆ๋‹ค.

subscription.dispose() ํ•จ์ˆ˜๋Š” Expires=0 ํ—ค๋”์™€ ํ•จ๊ป˜ SUBSCRIBE ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ตฌ๋…์ด ์ข…๋ฃŒ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” NOTIFY ๊ฐ€ SIP.js๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ user-agent.onTransportMessage() ์— user-agent ๊ฐ€ ์ค‘์ง€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ˆ˜ํ‘œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ ์ƒํƒœ๋กœ ์ธํ•ด NOTIFY ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋…์ž๊ฐ€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ํŒจ์น˜ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌ.

๊ตฌ๋…์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ user-agent.onTransportMessage() ์— user-agent ๊ฐ€ ์ค‘์ง€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒ€์‚ฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  'NOTIFY' ๋•Œ๋ฌธ์—

๋น ๋ฅธ ๋Œ€์‘๊ณผ ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์„ ์ฐพ์•„์ฃผ์…”์„œ ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ณง ์ˆ˜์ •๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. :)
๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๋‚˜๋Š” REGISTER๋ฅผ ๋งŒ๋“ค ๋•Œ๋„ํ•˜๊ณ ์žˆ๋Š” ์ดˆ๊ธฐ SIP SUBSCRIBE๋ฅผํ•˜์ง€ ์•Š์„ ๋•Œ stop() ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ ๋ชจ๋“  ๊ฒƒ์ด ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌผ๋ก  ์ด ๊ตฌ๋…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์—์„œ stop() ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ๊ตฌ๋…์„ ์ˆ˜๋™์œผ๋กœ ํ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์—์„œ stop() ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ๊ตฌ๋…์„ ์ˆ˜๋™์œผ๋กœ ํ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ! ์ด๋ฏธ ์™„๋ฃŒ๋˜์—ˆ์ง€๋งŒ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋‚˜์—๊ฒŒ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š” ๋™์•ˆ ๋ช‡ ๊ฐ€์ง€ ๊ตฌ๋…์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ํ”„๋ ˆ์ฆŒ์Šค, ํšŒ์˜ ๋ฐ ๊ธฐํƒ€ ์ด๋ฒคํŠธ).
๋ชจ๋“  ํ™œ์„ฑ ๊ตฌ๋…์„ ๋ฐ˜๋ณตํ•˜๊ณ  dispose ๋˜๋Š” unsubscribe ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?
userAgentObject._subscriptions ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ตฌ๋… ๋ชฉ๋ก์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์•˜๊ณ  ๊ตฌ๋…์ž์˜ ์ผ๋ถ€ ๋ฐฐ์—ด์„ ๊ฐ€์ ธ์˜ค๊ณ  ์–ด๋–ค ์ด์œ ๋กœ ๋ฐ˜๋ณต์ด๋‚˜ ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ๊ฐ™์ด ๊ทธ๊ฒƒ์„ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋‚ด๊ฐ€ ํ•œ ๋ฐฉ์‹์ด์ง€๋งŒ ๋‹ค์‹œ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ตฌ๋… ์ด๋ฒคํŠธ ์œ ํ˜•์— ๋Œ€ํ•ด ๊ตฌ๋…์ž๋ฅผ ํด๋ž˜์Šค์˜ ๋‹ค๋ฅธ ์ „์—ญ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ  ๊ฐ ๊ตฌ๋…์ž ๋ณ€์ˆ˜์— ๋Œ€ํ•ด unsubscribe ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ dispose ์™€ unsubscribe ์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? dispose ๋Š” PBX์—์„œ ๊ตฌ๋…์„ ์ทจ์†Œํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ? ๊ทธ๋ ‡๋‹ค๋ฉด ๋œ ๊ถŒ์žฅ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ๊ตฌ๋…์„ ์™„์ „ํžˆ ์ทจ์†Œํ•˜์ง€ ์•Š์œผ๋ฉด PBX๊ฐ€ ๋‚ด Kamailio์— ๊ด€๋ จ ์—†๋Š” NOTIFY ๋ฉ”์‹œ์ง€๋ฅผ ๊ณ„์† ๋ณด๋‚ผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฅผ ๊ณผ๋ถ€ํ•˜).

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์—์„œ stop() ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ๊ตฌ๋…์„ ์ˆ˜๋™์œผ๋กœ ํ๊ธฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง„ํ–‰์ƒํ™ฉ๐Ÿ˜Š? ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋˜๊ธฐ ์ „์— ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ตฌ๋…์ด ์—†์ง€๋งŒ UA.stop() ๋„ ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๊ฑฐ์˜ 1๋ถ„...

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์—์„œ stop() ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ๊ตฌ๋…์„ ์ˆ˜๋™์œผ๋กœ ํ๊ธฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง„ํ–‰์ƒํ™ฉ๐Ÿ˜Š? ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋˜๊ธฐ ์ „์— ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ตฌ๋…์ด ์—†์ง€๋งŒ UA.stop() ๋„ ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๊ฑฐ์˜ 1๋ถ„...

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์ด ๋ฌธ์ œ๋Š” ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ํ•œ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ... ๋‹ค์Œ ๋…ผ๋ฆฌ์  ์ˆœ์„œ์— ๋”ฐ๋ผ ์ˆ˜๋™์œผ๋กœ ๊ฐœ์ฒด๋ฅผ ํ•˜๋‚˜์”ฉ ํŒŒ๊ดด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ตฌ๋…์žObj.unsubscribe();
  2. registerer.unregister();
  3. userAgent.transport.disconnect();
  4. userAgent.stop();

๊ฐ€๊ธ‰์ ์ด๋ฉด ๋ชจ๋“  ์ž‘์—…์„ ์•ฝ์†์œผ๋กœ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค. ๋‚ด ๋ง์€, then ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ํ–‰๋™ ์•ฝ์†์ด ๋Œ์•„์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ์— ๋”ฐ๋ผ ํ–‰๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋…์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ WebSocket์„ ๋‹ซ๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค(20-50์ดˆ).

๋‚˜๋Š” ์‹œ๋„ํ–ˆ๋‹ค:

  • @slavikbialik์ด ์ œ์•ˆํ•œ ๋Œ€๋กœ ์ˆ˜๋™์œผ๋กœ ๊ฐœ์ฒด๋ฅผ ํŒŒ๊ดดํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚ด ๋ฌธ์ œ๊ฐ€ WebSocket๊ณผ ๊ด€๋ จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด userAgent.transport.ws.close() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WebSocket์„ ์ˆ˜๋™์œผ๋กœ ๋‹ซ์Šต๋‹ˆ๋‹ค.
  • ํฌ๋กฌ๊ณผ ํŒŒ์ด์–ดํญ์Šค์—์„œ.

ํŠน์ • ๊ตฌ์„ฑ์ด ์—†์œผ๋ฉฐ SIP.js ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ผ ์žฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋„์›€์ด ๋˜๊ฑฐ๋‚˜ ๋‚ด ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด sip ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ WebSocket์„ ์—ด๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ๋‹ซ์•˜์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค 1์ดˆ ๋ฏธ๋งŒ ์ง€์†๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

wss

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰