ืืืื
ืืืืจื ืฉืื ื
ืืืืืื ืืืืฉืื ืฉืื, ืืืืื ื ืืืขืืืจ ืืฉืืง ืืจืืื ืืฉืชืชืคืื ืืจืฉืช ืืืืจื ื
ืคืืขื ืืืคืืคื Teeworlds
ืืืืื ื ืืืฉืชืืฉ ืืคืจืืืงื ืืื ืืื ืืืชื ืกืืช ืื ืคืชืจืื ืืช ืืืืืื ืืืขืืจืช ืงืื ืจืฉืช ืืืื ืืจื ื. ืื ื ืขืฉื ืืืจื ืืื ืืืจืืื ืืืืืช:
- XMLHttpRequest/ืืืืืจ, ืื ืืืง ืืจืฉืช ืืืจืื ืจืง ืืืงืฉืืช HTTP, ืื
- WebSockets.
ืฉื ื ืืคืชืจืื ืืช ืืืจืฉืื ืืืจืื ืฉื ืจืืื ืฉืจืช ืืฆื ืืฉืจืช, ืืืื ื ืืืคืฉืจืื ืฉืืืืฉ ืืคืจืืืืงืื ืชืืืืจื
ืืฉ ืืจื ืฉืืืฉืืช - ืืฉืชืืฉ ืืจืฉืช ืืืืคืืคื:
ืขื ืืืช, ืื ืื ืขื ืงืืฉื ื ืืกืฃ: ืืคื ื ืฉืฉื ื ืขืืืชืื ืฉื WebRTC ืืืืืื ืืชืงืฉืจ, ืื ืฆืจืืืื ืืืฆืข ืืืืฆืช ืื ืืืจืืืช ืืืกืืช ืืื ืืืชืืืจ, ืื ืฉืืฆืจืื ืืื ืืฉืืืืช ืฉื ืฆื ืฉืืืฉื (ืฉืจืช ืืืชืืช ืืฉืจืช ืืื ืื ืืืชืจ
ืืืืคื ืืืืืืื, ื ืจืฆื ืืืฆืืจ ืืืฉืง API ืืจืฉืช ืฉืืฉืชืืฉ ื-WebRTC ืืืืคื ืคื ืืื, ืื ืงืจืื ืืื ืืืคืฉืจ ืืืืฉืง UDP Sockets ืฉืืื ื ืฆืจืื ืืืฆืืจ ืืืืืจ.
ืื ืืืคืฉืจ ืื ื ืื ืฆื ืืช ืืืชืจืื ืืช ืฉื WebRTC ืืืื ืืืฉืืฃ ืคืจืืื ืืืจืืืื ืืงืื ืืืคืืืงืฆืื (ืฉืจืฆืื ื ืืฉื ืืช ืืื ืฉืคืืืช ืืคืจืืืงื ืฉืื ื).
ืืื ืืืื WebRTC
WebRTC ืืื ืงืืืฆื ืฉื ืืืฉืงื API ืืืืื ืื ืืืคืืคื ืื ืืืกืคืงืื ืฉืืืืจ ืขืืืช ืืขืืืช ืฉื ืืืืื, ืืืืื ืื ืชืื ืื ืฉืจืืจืืชืืื.
ืืืืืืจ ืืื ืขืืืชืื ื ืืฆืจ (ืื ืื ืืฉ NAT ืืืื ืืฆืืืื ืื ืืฉื ื ืืฆืืืื) ืืืืฆืขืืช ืฉืจืชื STUN ื/ืื TURN ืืืืฆืขืืช ืื ืื ืื ืื ืงืจื ICE. ืขืืืชืื ืืืืืคืื ืืืืข ICE ืืคืจืืืจืื ืฉื ืขืจืืฅ ืืืืฆืขืืช ืืฆืขื ืืชืฉืืื ืฉื ืคืจืืืืงืื SDP.
ืืืื! ืืื ืงืืฆืืจืื ืืืช ืืืช? ืืืื ื ืกืืืจ ืืงืฆืจื ืื ืืฉืืขืืช ืืืื ืืื ืืืื:
ืืื ืขืืจ ืืืขืืจ ืืคืขืื ืขืืืจ NAT (ืึฐืึทืขืึตืขึท) - ืคืจืืืืงืื ืืขืงืืฃ NAT ืืงืืืช ืืื (IP, ืืฆืืื) ืืืืืคืช ื ืชืื ืื ืืฉืืจืืช ืขื ืืืืจื. ืื ืืื ืืฆืืื ืืืฉืืื ืืช ืืืฉืืื ืฉืื, ืื ืขืืืชืื ืืืืืื ืืืืืืฃ ื ืชืื ืื ืื ืขื ืื ืืืืคื ืขืฆืืื.ืืขืืจ ืืืืฆืขืืช ืืืกืจืื ืกืืื NAT (ืชืืจ) ืืฉืืฉ ืื ืืืขืืจ NAT, ืื ืืื ืืืืฉื ืืืช ืขื ืืื ืืขืืจืช ื ืชืื ืื ืืจื ืคืจืืงืกื ืืืืื ืืฉื ื ืืขืืืชืื. ืื ืืืกืืฃ ืืืืื ืืืงืจ ืืืชืจ ืืืืฉืื ืืืฉืจ STUN (ืืืืืื ืฉืืื ืืืืฉื ืืืืจื ืื ืกืฉื ืืชืงืฉืืจืช), ืืื ืืคืขืืื ืื ืืืคืฉืจืืช ืืืืืื.ืืงืืช ืงืืฉืืจืืืช ืืื ืืจืืงืืืืืช (ืงืจื) ืืฉืืฉ ืืืืืจืช ืืฉืืื ืืืืื ืืืืชืจ ืืืืืืจ ืฉื ื ืขืืืชืื ืืืชืืกืก ืขื ืืืืข ืืืชืงืื ืืืืืืจ ืขืืืชืื ืืฉืืจืืช, ืืื ืื ืืืืข ืืืชืงืื ืขื ืืื ืื ืืกืคืจ ืฉื ืฉืจืชื STUN ื-TURN.ืคืจืืืืงืื ืชืืืืจ ืืคืขืื (SDP) ืืื ืคืืจืื ืืชืืืืจ ืคืจืืืจืื ืฉื ืขืจืืฆื ืืืืืจ, ืืืฉื, ืืืขืืื ICE, ืงืืืงืื ืืืืืืืืื (ืืืงืจื ืฉื ืขืจืืฅ ืืืืื/ืืืืื) ืืื'... ืืื ืืืขืืืชืื ืฉืืื ืืฆืขืช SDP, ืืืฉื ื ืืืื ื-SDP Answer . ืืืืจ ืืื, ื ืืฆืจ ืขืจืืฅ.
ืืื ืืืฆืืจ ืืืืืจ ืืื, ืขืืืชืื ืฆืจืืืื ืืืกืืฃ ืืช ืืืืืข ืฉืื ืืงืืืื ืืฉืจืชื STUN ื-TURN ืืืืืืืฃ ืืืชื ืื ืขื ืื.
ืืืขืื ืืื ืฉืขืืืื ืืื ืืื ืืช ืืืืืืช ืืชืงืฉืจ ืืฉืืจืืช, ืืืื ืืืื ืืืชืงืืื ืื ืื ืื ืืืืฅ ืืคืก ืืื ืืืืืืฃ ืืช ืื ืชืื ืื ืืืื: ืฉืจืช ืืืชืืช.
ืฉืจืช ืืืชืืชืื ืืืื ืืืืืช ืืืื ืคืฉืื ืืืืืื ืฉืชืคืงืืื ืืืืื ืืื ืืืขืืืจ ื ืชืื ืื ืืื ืขืืืชืื ืืฉืื ืืืืฆืช ืืื (ืืืชืืืจ ืืชืจืฉืื ืืืื).
ืืืืืจืืช ืจืฆืฃ ืืืืฆืช ืื WebRTC ืคืฉืืื
ืกืงืืจืช ืืืืืื ืฉื ืจืฉืช Teeworlds
ืืจืืืืงืืืจืช ืืจืฉืช ืฉื Teeworlds ืืื ืคืฉืืื ืืืื:
- ืจืืืื ืืืงืื ืืืฉืจืช ืื ืฉืชื ืชืืื ืืืช ืฉืื ืืช.
- ืืงืืืืช ื ืื ืกืื ืืืฉืืง ืขื ืืื ืืืืืจ ืืืื ืืืื ืฉืจืชืื, ืฉืื ืืื ืืื ืืืจื ืจืง ืืฉืืง ืืื ืืื ืคืขื.
- ืื ืืขืืจืช ืื ืชืื ืื ืืืฉืืง ืืชืืฆืขืช ืืจื ืืฉืจืช.
- ืฉืจืช ืจืืฉื ืืืืื ืืฉืืฉ ืืืืกืืฃ ืจืฉืืื ืฉื ืื ืืฉืจืชืื ืืฆืืืืจืืื ืืืืฆืืื ืืืงืื ืืืฉืืง.
ืืืืืช ืืฉืืืืฉ ื-WebRTC ืืืืืคืช ื ืชืื ืื, ืื ื ืืืืืื ืืืขืืืจ ืืช ืจืืื ืืฉืจืช ืฉื ืืืฉืืง ืืืคืืคื ืื ื ืืฆื ืืืงืื. ืื ื ืืชื ืื ื ืืืืื ืืช ืืฆืืื ืช...
ืืืคืืจ ืืฉืจืชืื
ืืืืกืจ ืืืืืงื ืฉื ืืฉืจืช ืืฉ ืืชืจืื ื ืืื: ืื ืื ื ืืืืืื ืืคืจืืก ืืช ืื ืืืคืืืงืฆืื ืืชืืื ืกืืื ืืืคื Github ืื ืืืืืจื ืฉืื ื ืืืืืจื Cloudflare, ืืืื ืืืืืื ืืืจืืืช ืืืืจืืช ืืืื ืคืขืืื ืืืื ืืืื ื. ืืืขืฉื, ืื ืื ื ืืืืืื ืืฉืืื ืืื, ืืื ืืชืืื ืืืื ื ืืืืฉืืง ืืืคืื ืืคืืคืืืจื, ืื ืืชืฉืชืืช ืื ืชืฆืืจื ืืขืืืจ ืืืืจื ืืืฆืื.
ืขื ืืืช, ืืื ืฉืืืขืจืืช ืชืขืืื, ืื ืื ื ืขืืืื ืฆืจืืืื ืืืฉืชืืฉ ืืืจืืืืงืืืจื ืืืฆืื ืืช:
- ืฉืจืช STUN ืืื ืื ืืืชืจ: ืืฉ ืื ื ืืื ืืคืฉืจืืืืช ืืื ืืืืช ืืืืืจื.
- ืืคืืืช ืฉืจืช TURN ืืื: ืืื ืืื ืืคืฉืจืืืืช ืืื ืืืืช, ืื ืื ืื ื ืืืืืื ืืืืืืจ ืืฉืื ื ืื ืืฉืื ืขืืืจ ืืฉืืจืืช. ืืืจืื ืืืื, ืจืื ืืืื ื ืืชื ืืืฆืืจ ืืช ืืืืืืจ ืืจื ืฉืจืชื STUN (ืืืกืคืง p2p ืืืืชื), ืืื ืืฉ ืฆืืจื ื-TURN ืืืคืฉืจืืช ืกืชืืจื.
- ืฉืจืช ืืืชืืช: ืื ืืืื ืืฉื ื ืืืืืืื ืืืืจืื, ืืืืชืืช ืืื ื ืกืื ืืจืื. ืขื ืื ืฉืจืช ืืืืชืืช ืืืื ืืืจืื ืืคืืขื ืชืืื ืืืืื ืืกืืืืช ืืืคืืืงืฆืื. ืืืงืจื ืฉืื ื, ืืคื ื ืืฆืืจืช ืืืืืจ, ืืฉ ืฆืืจื ืืืืืืฃ ืืืืช ืงืื ื ืฉื ื ืชืื ืื.
- Teeworlds Master Server: ืืื ืืฉืืฉ ืขื ืืื ืฉืจืชืื ืืืจืื ืืื ืืืืจืื ืขื ืงืืืื ืืขื ืืื ืืงืืืืช ืืื ืืืฆืื ืฉืจืชืื ืฆืืืืจืืื. ืืื ื ืื ืื ืืืจืื (ืืงืืืืช ืืืืืื ืชืืื ืืืชืืืจ ืืฉืจืช ืฉืื ืืืืจืื ืืื ืืช), ืื ืืืื ื ืืื ืืื ืฉืฉืืงื ืื ืืืืื ืืืฉืชืชืฃ ืืืฉืืงืื ืขื ืื ืฉืื ืืงืจืืืื.
ืืืืื ื ืืืฉืชืืฉ ืืฉืจืชื STUN ืืืื ืืืื ืฉื ืืืื, ืืคืจืกื ื ืฉืจืช TURN ืืื ืืขืฆืื ื.
ืขืืืจ ืฉืชื ืื ืงืืืืช ืืืืจืื ืืช ืืฉืชืืฉื ื
- ืฉืจืช ืืืืกืืจ ืฉื Teeworlds ืืืืฉื ืืฆืืจื ืคืฉืืื ืืืื: ืืจืฉืืื ืฉื ืืืืืืงืืื ืืืืืืื ืืืืข (ืฉื, IP, ืืคื, ืืฆื,...) ืฉื ืื ืฉืจืช ืคืขืื. ืฉืจืชืื ืืคืจืกืืื ืืืขืืื ืื ืืช ืืืืืืืงื ืฉืืื, ืืืงืืืืช ืืืงืืื ืืช ืื ืืจืฉืืื ืืืฆืืืื ืืืชื ืื ืื. ืื ืื ื ืื ืืฆืืืื ืืช ืืจืฉืืื ืืืฃ ืืืืช ื-HTML ืื ืฉืฉืืงื ืื ืืืืืื ืคืฉืื ืืืืืฅ ืขื ืืฉืจืช ืืืืืืงื ืืฉืจ ืืืฉืืง.
- ืืืชืืช ืงืฉืืจ ืงืฉืจ ืืืืง ืืืืฉืื ืืฉืงืขืื ืฉืื ื, ืืืชืืืจ ืืกืขืืฃ ืืื.
ืจืฉืืืช ืืฉืจืชืื ืืชืื ืืืฉืืง ืืืืฃ ืืืืช
ืืืฉืื ืฉืงืขืื
ืื ืื ื ืจืืฆืื ืืืฆืืจ API ืฉืงืจืื ืืื ืืืคืฉืจ ื-Posix UDP Sockets ืืื ืืืืขืจ ืืช ืืกืคืจ ืืฉืื ืืืื ืืืจืืฉืื.
ืื ืื ื ืื ืจืืฆืื ืืืืฉื ืืช ืืืื ืืืื ืื ืืจืฉ ืืืืืืคื ืื ืชืื ืื ืืคืฉืืืื ืืืืชืจ ืืจืฉืช.
ืืืืืื, ืื ืื ื ืื ืฆืจืืืื ื ืืชืื ืืืืชื: ืื ืืขืืืชืื ื ืืฆืืื ืืืืชื "LAN ืืืจืืืืื" ืืืฉืืื ืืืืคืข ืืกื ื ืชืื ืื ืกืคืฆืืคื ืฉื Firebase.
ืืื, ืื ืื ื ืื ืฆืจืืืื ืืชืืืืช IP ืืืืืืืืช: ืขืจืื ืืคืชื ืืืืืืืื ืฉื Firebase (ืืืืื ืืฉืืืช ืืืืืื) ืืกืคืืงืื ืืืืืื ืืืืืื ืฉื ืขืืืชืื, ืืื ืขืืืช ืืงืฆื ืืืืคื ืืงืืื ืืชืืืืช IP "ืืืืืคืืช" ืืื ืืคืชื ืฉืฆืจืื ืืชืจืื. ืื ืืืื ืืืืืืื ืืช ืืฆืืจื ืืืงืฆืืช ืืชืืืช IP ืืืืืืืช, ืฉืืื ืืฉืืื ืื ืืจืืืืืืืืช.
ืื ื ื-API ืืืื ืืืื ืฉืื ืื ื ืฆืจืืืื ืืืืฉื:
// Create and destroy a socket
int socket();
int close(int fd);
// Bind a socket to a port, and publish it on Firebase
int bind(int fd, AddrInfo* addr);
// Send a packet. This lazily create a WebRTC connection to the
// peer when necessary
int sendto(int fd, uint8_t* buf, int len, const AddrInfo* addr);
// Receive the packets destined to this socket
int recvfrom(int fd, uint8_t* buf, int len, AddrInfo* addr);
// Be notified when new packets arrived
int recvCallback(Callback cb);
// Obtain a local ip address for this peer key
uint32_t resolve(client::String* key);
// Get the peer key for this ip
String* reverseResolve(uint32_t addr);
// Get the local peer key
String* local_key();
// Initialize the library with the given Firebase database and
// WebRTc connection options
void init(client::FirebaseConfig* fb, client::RTCConfiguration* ice);
ื-API ืคืฉืื ืืืืื ื-Posix Sockets API, ืื ืืฉ ืื ืืื ืืืืืื ืืฉืืืื: ืจืืฉืื ืืชืงืฉืจืืืืช ืืืืจืืช, ืืงืฆืืช ืืชืืืืช IP ืืงืืืืืช ืืืืืืจืื ืขืฆืืื.
ืจืืฉืื ืืชืงืฉืจืืืืช ืืืืจืืช
ืื ืื ืืชืืื ื ืืืงืืจืืช ืืฉืชืืฉืช ื-I/O ืื ืืืกื, ืืฉ ืืฉื ืืช ืืช ืืงืื ืืืคืขืื ืืืคืืคื ืืื ืืจื ื.
ืืกืืื ืืื ืืื ืฉืืืืืช ืืืืจืืขืื ืืืคืืคื ืืืกืชืจืช ืืืชืืื ื (ืืื ืื ืื JavaScript ืื WebAssembly).
ืืกืืืื ืืืงืืืืช ื ืืื ืืืชืื ืงืื ืืื
while(running) {
select(...); // wait for I/O events
while(true) {
int r = readfrom(...); // try to read
if (r < 0 && errno == EWOULDBLOCK) // no more data available
break;
...
}
...
}
ืื ืืืืืช ืืืืจืืข ืืืกืชืจืช ืื ื, ืื ืื ืื ื ืฆืจืืืื ืืืคืื ืืืชื ืืืฉืื ืืื:
auto cb = []() { // this will be called when new data is available
while(true) {
int r = readfrom(...); // try to read
if (r < 0 && errno == EWOULDBLOCK) // no more data available
break;
...
}
...
};
recvCallback(cb); // register the callback
ืืงืฆืืช IP ืืงืืืืช
ืืืื ืืฆืืืช ื"ืจืฉืช" ืฉืื ื ืืื ื ืืชืืืืช IP, ืืื ืืคืชืืืช Firebase (ืืื ืืืจืืืืช ืฉื ืจืืืช ืื: -LmEC50PYZLCiCP-vqde
).
ืื ื ืื ืื ืื ืื ื ืื ืฆืจืืืื ืื ืื ืื ืืืงืฆืืช ืืชืืืืช IP ืืืืืงืช ืืืืืืืืืช ืฉืืื (ืืื ืื ืกืืืืงื ืืืืจ ืฉืืืงืื ืืชื ืชืง), ืืื ืืจืื ืืฉ ืฆืืจื ืืืืืช ืขืืืชืื ืืคื ืขืจื ืืกืคืจื.
ืืืืืง ืืฉืืื ืื ืืคืื ืงืฆืืืช ืืฉืืฉืืช. resolve
ะธ reverseResolve
: ืืืคืืืงืฆืื ืืงืืืช ืืืืฉืื ืืช ืขืจื ืืืืจืืืช ืฉื ืืืคืชื (ืืืืฆืขืืช ืงืื ืืฉืชืืฉ ืื ืืจื ืืฉืจืช ืืจืืฉื), ืืืืืื ืืืืืจ ืืืชื ืืืชืืืช IP ืืฉืืืืฉ ืคื ืืื. ืื ืฉืืจ ื-API ืืงืื ืืช ืืขืจื ืืื ืืืงืื ืืืจืืืช ืืฉื ืืคืฉืืืช.
ืื ืืืื ืืืืคืืฉ DNS, ืื ืืืืฆืข ืืืืคื ืืงืืื ืืืงืื.
ืืืืืจ, ืื ื ืืชื ืืฉืชืฃ ืืชืืืืช IP ืืื ืืงืืืืช ืฉืื ืื, ืืื ืืฉ ืฆืืจื ืืืืื ืืืืืื ืืืฉืื, โโืืืื ืฆืืจื ืืืคืืง ืืืชื ืืฆืืจื ืืืจืช.
ืืืืืจ ืขืฆืื
UDP ืื ืฆืจืื ืืืืืจ, ืืื ืืคื ืฉืจืืื ื, WebRTC ืืืจืฉ ืชืืืื ืืืืืจ ืืจืื ืืคื ื ืฉืืื ืืืื ืืืชืืื ืืืขืืืจ ื ืชืื ืื ืืื ืฉื ื ืขืืืชืื.
ืื ืื ืื ื ืจืืฆืื ืืกืคืง ืืช ืืืชื ืจืืช ืืคืฉืื, (sendto
/recvfrom
ืขื ืขืืืชืื ืฉืจืืจืืชืืื ืืื ืืืืืจ ืงืืื), ืื ืขืืืื ืืืฆืข ืืืืืจ "ืขืฆืื" (ืืขืืื) ืืชืื ื-API.
ืื ืื ืฉืงืืจื ืืืืื ืชืงืฉืืจืช ืจืืืื ืืื ื"ืฉืจืช" ื"ืืงืื" ืืขืช ืฉืืืืฉ ื-UDP, ืืื ืฉืืกืคืจืืื ืฉืื ื ืฆืจืืื ืืขืฉืืช:
- ืฉืืืืช ืฉืจืช
bind()
ืืืืจ ืืืขืจืืช ืืืคืขืื ืฉืืื ืจืืฆื ืืงืื ืื ืืช ืืืฆืืื ืฉืฆืืื ื.
ืืืงืื ืืืช, ื ืคืจืกื ืืฆืืื ืคืชืืื ื-Firebase ืืชืืช ืืืคืชื ืืฉืจืช ืื ืงืฉืื ืืืืจืืขืื ืืชืช-ืขืฅ ืฉืื.
- ืฉืืืืช ืฉืจืช
recvfrom()
, ืืงืื ืื ืืช ืฉืืืืขืืช ืืื ืืืจื ืืืฆืืื ืื.
ืืืงืจื ืฉืื ื, ืขืืื ื ืืืืืง ืืช ืืชืืจ ืื ืื ืก ืฉื ืื ืืช ืฉื ืฉืืืืช ืืืฆืืื ืื.
ืืื ืืฆืืื ืืฉ ืชืืจ ืืฉืื, ืืื ื ืืืกืืคืื ืืช ืืฆืืืืช ืืืงืืจ ืืืืขื ืืชืืืืช ืืืื ื-WebRTC, ืื ืฉื ืืข ืืืืื ืชืืจ ืืืขืืืจ ืืืฉืจ ืืืืขื ืืืืื ืืืฉื.
ืืฉืืื ืืื ื ืืืกืืช, ืื ืื ืืื ืื ืืช, ืื ืื ื ืคืฉืื ืืืืืจืื -1 ืืืืืืจืื errno=EWOULDBLOCK
.
- ืืืงืื ืืงืื ืืช ื-IP ืืืืฆืืื ืฉื ืืฉืจืช ืืืืฆืขืื ืืืฆืื ืืื, ืืืชืงืฉืจ
sendto()
. ืื ืื ืืืฆืข ืฉืืื ืคื ืืืืช.bind()
, ืืืื ืืืืจ ืืืrecvfrom()
ืืงืื ืืช ืืชืืืื ืืืื ืืืฆืข binding ืืืคืืจืฉ.
ืืืงืจื ืฉืื ื, ืืืงืื ืืงืื ืืืืืฅ ืืช ืืคืชื ืืืืจืืืช ืืืฉืชืืฉ ืืคืื ืงืฆืื resolve()
ืืื ืืงืื ืืชืืืช IP.
ืืฉืื ืื, ืื ื ืืืืืื ืืืืฆืช ืื ืฉื WebRTC ืื ืฉื ื ืืขืืืชืื ืขืืืื ืื ืืืืืจืื ืื ืืื. ืืืืืจืื ืืืฆืืืืช ืฉืื ืืช ืฉื ืืืชื ืขืืืช ืืฉืชืืฉืื ืืืืชื WebRTC DataChannel.
ืื ืื ื ืื ืืืฆืขืื ืืขืงืืคืื bind()
ืืื ืฉืืฉืจืช ืืืื ืืืชืืืจ ืืืืฉ ืืคืขื ืืืื sendto()
ืืืงืจื ืฉืืื ื ืกืืจ ืืกืืื ืืืฉืื.
ืืฉืจืช ืืงืื ืืืืขื ืขื ืืืืืืจ ืฉื ืืืงืื ืืืฉืจ ืืืงืื ืืืชื ืืช ืืฆืขืช ื-SDP ืฉืื ืืชืืช ืืืืืข ืขื ืืฆืืืช ืืฉืจืช ื-Firebase, ืืืฉืจืช ืืืื ืขื ืชืืืืชื ืฉื.
ืืชืจืฉืื ืฉืืืื ืืฆืื ืืืืื ืฉื ืืจืืืช ืืืืขืืช ืขืืืจ ืขืจืืช ืฉืงืขืื ืืืขืืจืช ืืืืืขื ืืจืืฉืื ื ืืืืงืื ืืฉืจืช:
ืชืจืฉืื ืฉืื ืฉื ืฉืื ืืืืืืจ ืืื ืืืงืื ืืฉืจืช
ืืกืงื ื
ืื ืงืจืืชื ืขื ืืื, ืื ืจืื ืฉืืชื ืืขืื ืืื ืื ืืจืืืช ืืช ืืชืืืืจืื ืืคืขืืื. ื ืืชื ืืฉืืง ืืืฉืืง
ืืฉืืง ืืืืืืช ืืื ืขืืืชืื
ืงืื ืกืคืจืืืช ืืจืฉืช ืืืื ืืืื ื ืืืชืืืช
ืืงืืจ: www.habr.com