{"id":326833,"date":"2022-01-10T08:39:16","date_gmt":"2022-01-10T08:39:16","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=326833"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=326833","title":{"rendered":"<span>\u041b\u043e\u0433\u0438\u043a\u0430 \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435. \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u0435\u0442\u0435\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\" class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0438\u0436\u0435 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439; \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0441\u043a\u0440\u0435\u0441\u0442\u0438\u0442\u044c <s>\u0443\u0436\u0430 \u0441 \u0435\u0436\u043e\u043c<\/s> rust \u0441 typescript; \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0442\u044f\u0436\u0435\u043b\u043e \u0436\u0438\u0442\u044c \u0431\u0435\u0437 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0438 \u043a\u0430\u043a \u0436\u0435 \u043b\u0435\u0433\u043a\u043e \u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u0441 \u043d\u0438\u043c; \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0447\u0430\u0442 \u0437\u0430 10 \u043c\u0438\u043d\u0443\u0442 \u043d\u0430 typescript\/rust \u0438\u043b\u0438 \u043d\u0435 \u0437\u0430 10, \u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u2026 \u0412 \u043e\u0431\u0449\u0435\u043c \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0434\u043e\u043b\u0433\u0438\u0439, \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u043d\u0443\u0434\u043d\u044b\u0439 \u0440\u0430\u0441\u0441\u043a\u0430\u0437, \u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0434\u0430\u0436\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432. \u0412\u0441\u0435\u043c \u043a\u043e\u043c\u0443 \u043d\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0441\u043b\u043e\u0432\u0430: \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u2026 \u043f\u0440\u043e\u0448\u0443.<\/p>\n<hr\/>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u0438\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043e\u0431\u0449\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u0443\u0441\u0442\u044c \u0438 \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u044c, \u043d\u043e \u043f\u043e \u043a\u0430\u043a\u0438\u043c-\u043b\u0438\u0431\u043e \u0438\u043d\u044b\u043c \u043a\u0430\u043d\u0430\u043b\u0430\u043c), \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043e\u0431\u0434\u0443\u043c\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. \u041d\u0443 \u0434\u043e\u043b\u0436\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f\u2026 \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0437\u0430 \u0434\u043e\u043b\u0438 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0438 \u0438\u043c \u0441\u0442\u0430\u043b \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0439 JSON &#8212; \u044d\u0442\u043e \u0443\u0436\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b (\u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0435\u0433\u043e \u0447\u0430\u0441\u0442\u044c).  <\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 &#8212; \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u044d\u0442\u0430\u043f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u0435\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440, \u0435\u0449\u0451 \u0434\u043e \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u00ab\u043a\u0430\u043a?\u00bb (\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442) \u0438 \u00ab\u0447\u0435\u043c?\u00bb (\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b) \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u0417\u0430 \u043e\u0431\u043c\u0430\u043d\u0447\u0438\u0432\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u043e\u0439 \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0431\u0435\u0437\u0434\u043d\u0430 \u0431\u0430\u0433\u043e\u0432 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a: \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0441\u043a\u043e\u0447\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440 \u0438 \u043f\u043e\u0440\u043e\u0434\u0438\u0442\u044c \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442, \u0430 \u0432\u044b \u0438\u0449\u0438\u0442\u0435 \u0433\u0434\u0435 \u0438 \u043e\u0442 \u0447\u0435\u0433\u043e \u0432\u043e\u0437\u043d\u0438\u043a \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0436\u0443\u0447\u043e\u043a, \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u0435\u0431\u0435 \u0443\u0436\u0435 \u0433\u0434\u0435-\u0442\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 UI.<\/p>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u0430 \u0432\u0430\u0436\u043d\u0430 \u0448\u0442\u0443\u043a\u0430 &#8212; \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0438 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c. \u0427\u0430\u0441\u0442\u0435\u043d\u044c\u043a\u043e, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c \u043b\u0435\u0436\u0430\u0442 \u043d\u0435 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u0432 \u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0435. \u0425\u043e\u0440\u043e\u0448\u043e \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u043f\u043e\u043c\u043e\u0447\u044c \u0432 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430, \u043d\u043e \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u0448\u0430\u0442\u044c \u044d\u0442\u043e\u043c\u0443.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0435\u0442\u0435\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 &#8212; \u0447\u0430\u0442. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c (\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u0438 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c) \u0438 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043e \u043d\u0438\u0445 \u0437\u0430\u0431\u044b\u0442\u044c \u0438 \u043d\u0435 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c.<\/p>\n<p>\u0410 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u00ab\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u00bb \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 <a href=\"http:\/\/clibri.net\/\" rel=\"noopener noreferrer nofollow\">clibri<\/a>, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0435\u043c\u0443 (\u0438\u043b\u0438 \u0435\u0439) \u0438 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f. \u0421\u0443\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0430 \u2014 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443 &#8212; \u00ab\u043f\u043e\u0447\u0442\u0438\u00bb \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u043a \u0440\u0430\u0431\u043e\u0442\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0449\u0435?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (\u043a\u043e\u0438\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440) \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e JSON. \u041d\u0438\u0447\u0435\u0433\u043e \u043f\u043b\u043e\u0445\u043e\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043c\u044b \u0431\u0435\u0440\u0451\u043c \u043d\u0430 \u0441\u0435\u0431\u044f, \u0430 \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u043d\u0430 \u0442\u0440\u0430\u0444\u0438\u043a:<\/p>\n<ul>\n<li>\n<p>\u0435\u0441\u043b\u0438 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e web, \u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e typescript\/javascript, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u044b \u0438 \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c (\u043d\u0438 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445, \u043d\u0438 \u0432 \u043e\u0442\u0432\u0435\u0442\u0430\u0445) \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b JSON \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f human-readable, \u0447\u0442\u043e \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438; \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 &#8212; \u044d\u0442\u043e \u0442\u0435\u043a\u0441\u0442, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0440\u0430\u0437\u043c\u0435\u0440. \u041a\u043e\u0433\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u00ab\u0431\u0435\u0433\u0430\u0435\u0442\u00bb \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0435\u043d \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 &#8212; \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043d\u043e \u0435\u0441\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b, \u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043b\u0438\u0448\u043d\u0438\u0439 \u0431\u0430\u0439\u0442, \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 \u0442\u0440\u0430\u0444\u0438\u043a. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0438\u043c\u0451\u043d \u043f\u043e\u043b\u0435\u0439, \u0441\u043a\u0430\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 <code>{ \u00aba\u00bb: \u2026, \u00abb\u00bb: \u2026, \u2026 }<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>{ \u00abname\u00bb: \u2026, \u00abemail\u00bb: \u2026, \u2026 }<\/code>, \u043d\u043e \u043e\u0442 \u0441\u0430\u043c\u0438\u0445 \u0438\u043c\u0451\u043d \u043f\u043e\u043b\u0435\u0439 \u0438 \u0432\u0441\u0435\u0445 \u0441\u043a\u043e\u0431\u043e\u043a, \u0437\u0430\u043f\u044f\u0442\u044b\u0445 \u0432\u044b \u043d\u0435 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u0435\u0441\u044c, \u0430 \u044d\u0442\u043e \u0432\u0441\u0451 \u0431\u0430\u0439\u0442\u044b, \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 JSON \u0441\u0442\u0440\u043e\u043a\u0443. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0432\u044b\u0440\u0443\u0447\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0440\u0435\u0441\u0441\u0438\u044f, \u043d\u043e \u043e\u043f\u044f\u0442\u044c \u0436\u0435 &#8212; \u043c\u044b \u043b\u0438\u0448\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u0443\u0440\u043e\u0432\u043d\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 &#8212; \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u0442\u043e\u043a\u0435. \u0422\u0443\u0442 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043f\u0440\u043e\u043f\u0430\u0440\u0441\u0438\u0442\u044c JSON \u0441\u0442\u0440\u043e\u043a\u0443, \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0432\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430: \u043d\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u043c\u0435\u043d\u044c\u0448\u0435, \u043d\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0435. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043a\u0430\u0436\u0435\u043c \u0431\u0443\u0444\u0435\u0440, \u043a\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043a\u0438\u0434\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0431\u0430\u0439\u0442\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u041d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442, \u0431\u0435\u0437 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f header, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b \u0431\u044b \u0434\u043b\u0438\u043d\u0443 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u043e \u00ab\u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0435\u00bb \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0441\u0442\u0430\u0432\u0430\u044f\u0441\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438. \u0413\u0440\u0443\u0431\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043f\u0430\u043a\u0435\u0442 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:<\/p>\n<pre><code>[u16            ][u8        ][u32         ]    [message length ][type field][field value ]<\/code><\/pre>\n<p>\u041c\u044b \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0438\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0439\u0442 \u043d\u0430\u043c \u0436\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u0431\u044b \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0438 \u0431\u0435\u0437 \u043d\u0435\u0440\u0432\u043e\u0432 \u043f\u0440\u043e\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435; \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c header \u0441 \u043e\u0434\u043d\u0438\u043c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043f\u043e\u043b\u0435\u043c &#8212; \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0414\u0430\u043b\u044c\u0448\u0435 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0442\u0438\u043f \u043f\u043e\u043b\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 0 &#8212; \u044d\u0442\u043e u8, 1 &#8212; u16, 2 &#8212; u32 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0417\u043d\u0430\u044f \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043d \u00ab\u0432\u0435\u0441\u0438\u0442\u00bb \u0438 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c u32 \u043c\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u043c 4 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0431\u0430\u0439\u0442\u0430. <\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043d\u0430\u0448\u0435\u0433\u043e \u0447\u0430\u0442\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 clibri<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 clibri<\/summary>\n<div class=\"spoiler__content\">\n<p>Clibri \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043b\u0438\u0448\u044c \u0442\u0440\u0435\u043c\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438:<\/p>\n<ul>\n<li>\n<p><code>struct<\/code> &#8212; \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 (\u043e\u0431\u044a\u0435\u043a\u0442 \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435). \u0418\u043c\u0435\u0435\u0442 \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044f.<\/p>\n<\/li>\n<li>\n<p><code>enum<\/code> &#8212; \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u044f \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0422\u043e \u0435\u0441\u0442\u044c enum \u0432 clibri \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d enum \u0432 rust.<\/p>\n<\/li>\n<li>\n<p><code>group<\/code> &#8212; \u044d\u0442\u043e \u043a\u0430\u043a namespace \u0432 typescript \u0438\u043b\u0438 \u0436\u0435 mod \u0432 rust. \u041f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0435\u0435 \u0438 \u044f\u0441\u043d\u0435\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>Clibri \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>Type<\/p>\n<\/td>\n<td>\n<p>Array type<\/p>\n<\/td>\n<td>\n<p>Length<\/p>\n<\/td>\n<td>\n<p>Description<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>i8<\/p>\n<\/td>\n<td>\n<p>i8[]<\/p>\n<\/td>\n<td>\n<p>8-bit<\/p>\n<\/td>\n<td>\n<p>Signed integer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>i16<\/p>\n<\/td>\n<td>\n<p>i16[]<\/p>\n<\/td>\n<td>\n<p>16-bit<\/p>\n<\/td>\n<td>\n<p>Signed integer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>i32<\/p>\n<\/td>\n<td>\n<p>i32[]<\/p>\n<\/td>\n<td>\n<p>32-bit<\/p>\n<\/td>\n<td>\n<p>Signed integer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>i64<\/p>\n<\/td>\n<td>\n<p>i64[]<\/p>\n<\/td>\n<td>\n<p>64-bit<\/p>\n<\/td>\n<td>\n<p>Signed integer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>u8<\/p>\n<\/td>\n<td>\n<p>u8[]<\/p>\n<\/td>\n<td>\n<p>8-bit<\/p>\n<\/td>\n<td>\n<p>Unsigned integer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>u16<\/p>\n<\/td>\n<td>\n<p>u16[]<\/p>\n<\/td>\n<td>\n<p>16-bit<\/p>\n<\/td>\n<td>\n<p>Unsigned integer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>u32<\/p>\n<\/td>\n<td>\n<p>u32[]<\/p>\n<\/td>\n<td>\n<p>32-bit<\/p>\n<\/td>\n<td>\n<p>Unsigned integer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>u64<\/p>\n<\/td>\n<td>\n<p>u64[]<\/p>\n<\/td>\n<td>\n<p>64-bit<\/p>\n<\/td>\n<td>\n<p>Unsigned integer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>f32<\/p>\n<\/td>\n<td>\n<p>f32[]<\/p>\n<\/td>\n<td>\n<p>32-bit<\/p>\n<\/td>\n<td>\n<p>Floating-point number<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>f64<\/p>\n<\/td>\n<td>\n<p>f64[]<\/p>\n<\/td>\n<td>\n<p>64-bit<\/p>\n<\/td>\n<td>\n<p>Floating-point number<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>str<\/p>\n<\/td>\n<td>\n<p>str[]<\/p>\n<\/td>\n<td>\n<p>unlimited<\/p>\n<\/td>\n<td>\n<p>String value<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>bool<\/p>\n<\/td>\n<td>\n<p>bool[]<\/p>\n<\/td>\n<td>\n<p>8-bit<\/p>\n<\/td>\n<td>\n<p>Boolean value<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435<\/p>\n<pre><code># \u041f\u0440\u043e\u0441\u0442\u043e\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 (\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439) enum UserRole {     Admin;     User; }  struct Address {     str email;     # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0437\u043d\u0430\u043a ? \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f     str address?;     str phone?; }  struct User {     str nickname;     # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435     UserRole role;     # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443     Address addr;  }  struct Message { # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443     User author;      str field_str?;               u8 field_u8;               # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f [] \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c     u8[] field_array_u8;   }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<pre><code>enum IncomeMessage {     # \u041e\u043f\u0446\u0438\u044f Text \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443     str Text;                 # \u041e\u043f\u0446\u0438\u044f Bytes \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442     u8[] Bytes;            }<\/code><\/pre>\n<p>\u0421 \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e &#8212; \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0433\u0440\u0443\u043f\u043f\u0443 \u0438 \u00ab\u043a\u043b\u0430\u0434\u0435\u043c\u00bb \u0442\u0443\u0434\u0430 \u0432\u0441\u0435 \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u043c, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0434\u0440\u0443\u0433\u0438\u0435 (\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435) \u0433\u0440\u0443\u043f\u043f\u044b.<\/p>\n<pre><code>group Messages {     enum Content {         str Text;         u8[] Bytes;     }      struct Anonymous {         Content message;     }      struct Authorized {         str uuid;         Content message;     } }  struct AllMessages {     # \u0414\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043f\u0443\u0442\u0438 \u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0439\u0441\u044f \u0432 \u0433\u0440\u0443\u043f\u043f\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \".\" (\u0442\u043e\u0447\u043a\u0443)     Messages.Anonymous[] anonymous;         Messages.Authorized[] authorized;  }<\/code><\/pre>\n<\/div>\n<\/details>\n<pre><code># \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0440\u043e\u043b\u0438 \u043d\u0430\u0448\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 enum UserRole {     Admin;     User;     Manager; }  # \u0412 \u044d\u0442\u0443 \u0433\u0440\u0443\u043f\u043f\u0443 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 group Events {     # \u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f     struct UserConnected {         str username;         str uuid;     }     # \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f     struct UserDisconnected {         str username;         str uuid;     }     # \u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u0432 \u0447\u0430\u0442     struct Message {         u64 timestamp;         str user;         str message;         str uuid;     } }  # \u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0447\u0430\u0442 group Message {     struct Request {         str user;         str message;     }     struct Accepted {         str uuid;     }     struct Denied {         str reason;     }     struct Err {         str error;     } }  # \u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0447\u0430\u0442\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0432\u043d\u043e\u0432\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439) group Messages {     struct Message {         u64 timestamp;         str user;         str uuid;         str message;     }     struct Request { }     struct Response {         Message[] messages;     }     struct Err {         str error;     } }  # \u0417\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0432\u0445\u043e\u0434 (\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0435\u0437 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 \u0438 \u0445\u0435\u0448\u0435\u0439) group UserLogin {     struct Request {         str username;     }     struct Accepted {         str uuid;     }     struct Denied {         str reason;     }     struct Err {         str error;     } }  # \u0417\u0430\u043f\u0440\u043e\u0441 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0447\u0430\u0442\u0435. group Users {     struct User {         str name;         str uuid;     }     struct Request { }     struct Response {         User[] users;     }     struct Err {         str error;     } }<\/code><\/pre>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0432\u0430\u0441 \u0443\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043c\u0443\u0442\u0438\u043b\u043e, \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 <code>Accepted<\/code> \u0438 <code>Denied<\/code>. \u041c\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438, \u0432\u0438\u0434\u0435\u0442\u044c \u043e\u0442\u043a\u0430\u0437 \u0432 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0448\u0438\u0431\u043a\u0438. \u041d\u043e \u043e\u0448\u0438\u0431\u043a\u0430 \u043b\u0438 \u044d\u0442\u043e \u0432 \u0447\u0438\u0441\u0442\u043e\u043c \u0432\u0438\u0434\u0435? \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445: \u043b\u043e\u0433\u0438\u043d \/ \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b, \u043d\u043e \u0432\u043e\u0439\u0442\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d. \u0421 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u0441\u0435 &#8212; \u043e\u043a, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u044d\u0442\u043e \u043d\u0435 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441.  <\/p>\n<p>\u041d\u0438\u0436\u0435 \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435, clibri \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u043e\u0439 &#8212; \u043e\u0448\u0438\u0431\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u043d\u0435\u043a\u0438\u0439 \u0441\u0431\u043e\u0439. \u0421\u0435\u0439\u0447\u0430\u0441, \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u043e \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435 \u0432\u044b \u0432\u0441\u0451 \u0443\u0432\u0438\u0434\u0438\u0442\u0435.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b; \u0445\u043e\u0442\u044f \u044d\u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0448\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0438 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<p>\u0418 \u0432\u0440\u043e\u0434\u0435, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430, \u0441\u0445\u0435\u043c\u0430 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u043b\u0438 \u043c\u0435\u043d\u0435\u0435 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f. \u041c\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u041d\u043e \u043b\u0438\u0448\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u2026<\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0430 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. \u041f\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443 clibri &#8212; \u044d\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b. \u0412\u044b \u0434\u0430\u0451\u0442\u0435 clibri \u0441\u0445\u0435\u043c\u0443, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \u044f\u0437\u044b\u043a (\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f typescript \u0438 rust) \u0438 clibri \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f \u0432\u0430\u0441 \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0432\u043e\u043b\u044c\u043d\u044b \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0432 \u0441\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c. \u041d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0443\u0436\u0435\u043d \u043f\u0443\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 npm \u0434\u043b\u044f web-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0447\u0430\u0442\u0430 \u0438 \u043f\u0443\u0441\u0442\u043e\u0439 rust \u043f\u0440\u043e\u0435\u043a\u0442 &#8212; \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u043d\u0430 typescript &#8212; \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u0446\u0435\u043b\u0435\u0439 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u044f \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043e\u0441\u0432\u0435\u0442\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 \u0434\u0432\u0430 \u044f\u0437\u044b\u043a\u0430).<\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u0435\u0440\u0435\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>. \u251c\u2500\u2500 consumer \u2502   \u251c\u2500\u2500 package.json \u2502   \u251c\u2500\u2500 src \u2502   \u2502   \u2514\u2500\u2500 index.ts \u2502   \u251c\u2500\u2500 tsconfig.json \u2502   \u2514\u2500\u2500 tslint.json \u251c\u2500\u2500 producer \u2502   \u251c\u2500\u2500 Cargo.toml \u2502   \u2514\u2500\u2500 src \u2502       \u2514\u2500\u2500 main.rs \u2514\u2500\u2500 protocol     \u2514\u2500\u2500 protocol.prot<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c <a href=\"https:\/\/github.com\/DmitryAstafyev\/clibri\/releases\" rel=\"noopener noreferrer nofollow\">clibri<\/a> (\u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 &#8212; \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a, \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f), \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432\u044b\u0448\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0432 \u0444\u0430\u0439\u043b \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c.<\/p>\n<pre><code class=\"bash\">clibri --src .\/protocol\/protocol.prot -rs .\/producer\/src\/protocol.rs -ts .\/consumer\/src\/protocol.ts -o --em # --src \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 # -rs \u043f\u0443\u0442\u044c \u043a\u0443\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f rust # -ts \u043f\u0443\u0442\u044c \u043a\u0443\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f typescript<\/code><\/pre>\n<p>Clibri \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0434\u043b\u044f typescript \u0438 \u0434\u043b\u044f rust, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043d\u0430\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438, \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0431\u0443\u0444\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f typescript<\/p>\n<pre><code class=\"javascript\">import * as Protocol from \".\/protocol\";  \/\/ \u041d\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0431\u0443\u0444\u0435\u0440 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e clibri \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \/\/ \u043c\u0435\u0442\u043e\u0434 defaults(), \u0447\u0442\u043e \u0432\u0435\u0441\u044c\u043c\u0430 \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432. \/\/ \u041c\u0435\u0442\u043e\u0434 pack() \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 (\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 header) \/\/ \u0442\u0430\u043a \u0447\u0442\u043e \u0431\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 const buffer = Buffer.concat([     new Uint8Array(Protocol.Messages.Message.defaults().pack(1)),     new Uint8Array(Protocol.Users.User.defaults().pack(2)), ]);  \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c reader const reader: Protocol.BufferReaderMessages =     new Protocol.BufferReaderMessages();  \/\/ \u0411\u0440\u043e\u0441\u0430\u0435\u043c \u043d\u0430\u0448\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0431\u0430\u0439\u0442\u044b \u0432 reader reader.chunk(buffer);  do {     \/\/ \u0427\u0438\u0442\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u044b     const received:         | Protocol.IAvailableMessage         | undefined = reader.next();     if (received === undefined) {         \/\/ \u0411\u043e\u043b\u044c\u0448\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0435\u0442         break;     }     if (received.msg.Messages.Message !== undefined) {         console.log(`Message has been gotten`);     } else if (received.msg.Users.User !== undefined) {         console.log(`User has been gotten`);     } } while (true);<\/code><\/pre>\n<p>\u0418 \u0434\u043b\u044f rust<\/p>\n<pre><code class=\"rust\">pub mod protocol;  use protocol::{PackingStruct, StructDecode, StructEncode};  fn reading() -> Result&lt;(), String> {     \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u0440\u0443 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439     let mut message = protocol::Messages::Message::defaults();     let mut user = protocol::Users::User::defaults();        \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c reader     let mut reader = protocol::Buffer::new();      \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0441 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438     let buffer: Vec&lt;u8> = [         message.pack(1, None).map_err(|e| e.to_string())?,         user.pack(2, None).map_err(|e| e.to_string())?,     ]     .concat();      \/\/ \u041a\u0438\u0434\u0430\u0435\u043c \u0431\u0430\u0439\u0442\u044b \u0432 \u0440\u0438\u0434\u0435\u0440     reader         .chunk(&amp;buffer, None)         .map_err(|e| format!(\"Fail to add data: {:?}\", e))?;      \/\/ \u0427\u0438\u0442\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f     while let Some(msg) = reader.next() {         match msg.msg {             protocol::AvailableMessages::Messages(                 protocol::Messages::AvailableMessages::Message(msg),             ) => {                 println!(\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043e Message {:?}\", msg);             }             protocol::AvailableMessages::Users(                 protocol::Users::AvailableMessages::User(msg),             ) => {                 println!(\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043e User {:?}\", msg);             }             _ => {}         }     }     Ok(()) }  fn main() {     reading().expect(\"Oops!\"); }<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0442\u0435\u043b\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0431\u0443\u0444\u0435\u0440 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>sequence<\/code>, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 &#8212; \u043e\u0442\u0432\u0435\u0442 (\u044d\u0442\u043e \u0442\u0430 \u0441\u0430\u043c\u0430\u044f \u0446\u0438\u0444\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>pack(sequence: number)<\/code>).<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0437\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c. \u0423\u0432\u044b, \u043c\u043d\u043e\u0433\u0438\u0435 \u0437\u0434\u0435\u0441\u044c \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u044f \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0432\u0440\u043e\u0434\u0435 \u0435\u0441\u0442\u044c, \u0431\u0443\u0444\u0435\u0440 \u0435\u0441\u0442\u044c &#8212; \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0438 \u043d\u0435\u0442.<\/p>\n<p>\u042d\u0442\u043e \u0432\u0441\u0451 \u0442\u0430\u043a, \u043d\u043e \u043d\u0435\u0442 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e &#8212; \u043b\u043e\u0433\u0438\u043a\u0438. \u0414\u0430, \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043a\u0430\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f; \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u00ab\u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u043c\u00bb \u0438\u043c\u0435\u043d\u0430\u043c, \u043c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c (\u043d\u0435 \u0437\u043d\u0430\u0435\u043c) \u0432 \u043a\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0438 \u043a\u0430\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b. \u0422\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u0432\u044b \u0434\u0430\u0434\u0438\u0442\u0435 \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443, \u0432\u044b \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c, \u0447\u0442\u043e \u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u043b\u043e\u0433\u0438\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0431\u0443\u0434\u0435\u0442 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u0432\u0430\u0448\u0435\u043c\u0443.  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u044b \u0447\u0442\u043e\u0431\u044b \u0432 \u0447\u0430\u0442 \u043e\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u043e\u0441\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u00ab<em>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c ______ \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043a \u0447\u0430\u0442\u0443<\/em>\u00bb. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0438 <code>UserConnected<\/code> \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c <code>Message<\/code> \u0432 \u0447\u0430\u0442 \u0438 \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u0442\u044c \u0432\u0441\u0435\u0445 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u043e\u0431 \u044d\u0442\u043e\u043c. \u0413\u043b\u044f\u0434\u044f \u043d\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u044d\u0442\u0443 \u043b\u043e\u0433\u0438\u043a\u0443 \u043c\u044b \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u043c.  <\/p>\n<p>\u041a\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0448\u0443 \u0441\u0445\u0435\u043c\u0443, \u0447\u0442\u043e \u0431\u044b \u00ab\u043f\u043e\u043a\u0440\u044b\u0442\u044c\u00bb \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043e\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0447\u0430\u0442 \u043d\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\/\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f? \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 &#8212; \u043d\u0438\u043a\u0430\u043a. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e &#8212; \u044d\u0442\u043e \u0434\u0430\u0436\u0435 \u00ab\u0432\u0440\u0435\u0434\u043d\u043e\u00bb. \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u0430\u044f \u0432\u044b\u0448\u0435 \u0441\u0445\u0435\u043c\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u043d\u0435 \u043b\u043e\u0433\u0438\u043a\u0443. \u0418 \u043a\u0440\u043e\u043c\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043d\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430.<\/p>\n<p>\u0414\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u0438 clibri \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c workflow. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435.<\/p>\n<pre><code># \u041d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 (UserLogin.Request) \u0443 \u043d\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0432\u0430 \u043e\u0442\u0432\u0435\u0442\u0430: # \u043e\u0434\u043e\u0431\u0440\u0435\u043d\u043e (Accept) \u0438 \u043e\u0442\u043a\u0430\u0437\u0430\u043d\u043e (Deny). \u0410 \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0438 \u043e\u0448\u0438\u0431\u043a\u0430, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 # \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0443 UserLogin.Err. # # - \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u044f (Accept), \u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u043e\u0442\u0432\u0435\u0442 #   UserLogin.Accepted, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f #   Events.UserConnected \u0438 Events.Message # # - \u0432 \u0441\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442\u043a\u0430\u0437\u0430 (Deny), \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c UserLogin.Denied \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e # UserLogin.Request !UserLogin.Err {     (Accept    > UserLogin.Accepted) > Events.UserConnected;                                      > Events.Message;     (Deny      > UserLogin.Denied); }  # \u041d\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0440\u0430\u043f\u043e\u0440\u0442\u0443\u0435\u043c \u043e\u0431 \u0443\u0441\u043f\u0435\u0445\u0435 (Users.Response), \u043b\u0438\u0431\u043e # \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u043c  Users.Err Users.Request !Users.Err {     (Users.Response); }  Message.Request !Message.Err {     (Accept    > Message.Accepted) > Events.Message;     (Deny      > Message.Denied); }  Messages.Request !Messages.Err {     (Messages.Response); }  # \u0415\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f (\u0441\u043e\u0431\u044b\u0442\u0438\u0435 disconnected) \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c # \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f  Events.Message \u0438 Events.UserDisconnected. # \u0417\u043d\u0430\u043a ? \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f.   @disconnected {     > Events.Message?;     > Events.UserDisconnected; }<\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u0430, \u043d\u043e \u0441\u0443\u043c\u0435\u043b\u0438 \u0438\u0441\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0449\u0435 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u0447\u0430\u0442\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0432\u0438\u0434\u0438\u043c <strong>\u043a\u043e\u0433\u0434\u0430<\/strong>, <strong>\u043a\u043e\u043c\u0443<\/strong> \u0438 <strong>\u043a\u0430\u043a\u0438\u0435<\/strong> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u0440\u0430\u0442\u043e\u043a\u043e \u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0435 clibri workflow<\/summary>\n<div class=\"spoiler__content\">\n<p><strong>\u0417\u0430\u043f\u0440\u043e\u0441\/\u043e\u0442\u0432\u0435\u0442<\/strong><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0440\u043e\u0434\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043e\u0442\u0432\u0435\u0442\u0430, \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445. \u0412 \u0440\u0430\u043c\u043a\u0430\u0445 clibri \u044d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f &#8212; \u00ab\u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u00bb (<strong>conclusion<\/strong>). \u041a\u0430\u0436\u0434\u043e\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c (ConclusionA, ConclusionB) \u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 (ResponseA, ResponseB). \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0437\u0430 \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0434\u0440\u0443\u0433\u0438\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c (<strong>broadcasting<\/strong>), \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (BroadcastA, BroadcastB).<\/p>\n<pre><code>Request !Error {     (ConclusionA    > ResponseA) > BroadcastA;                                  > BroadcastB;     (ConclusionB    > ResponseB); }<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 (Request, ResponseA, ResponseB, BroadcastA, BroadcastB) \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. \u0422\u043e \u0435\u0441\u0442\u044c \u0441\u0445\u0435\u043c\u0430 workflow \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u0430 \u043d\u0435 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 (\u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0441, \u043e\u0442\u0432\u0435\u0442 \u0438 \u043e\u0448\u0438\u0431\u043a\u0430) \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code>Request !Error {     (Response); }<\/code><\/pre>\n<p><strong>\u0421\u043e\u0431\u044b\u0442\u0438\u044f<\/strong><\/p>\n<p>\u041d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 connected (\u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f), disconnected (\u043a\u043b\u0438\u0435\u043d\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f). \u041d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439 \u044d\u0442\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043c\u044b \u0442\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c.<\/p>\n<pre><code># \u0427\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b @ @connected {     > BroadcastStructureA;     ...     > BroadcastStructureB; }  @disconnected {     > BroadcastStructureA;     ...     > BroadcastStructureB; }<\/code><\/pre>\n<p><code>@connected<\/code> \u0438 <code>@disconnected<\/code> &#8212; \u044d\u0442\u043e \u0434\u0432\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u041d\u043e \u0432\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u0414\u043b\u044f \u0447\u0435\u0433\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043e\u0431\u044a\u0435\u043a\u0442 (\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443) \u0441\u043e\u0431\u044b\u0442\u0438\u044f:<\/p>\n<pre><code>group ServerEvents {     struct UserKickOff {         str reason?;         str uuid;     } }<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 workflow \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f:<\/p>\n<pre><code>@ServerEvents.UserKickOff {     > Events.Message;     > Events.UserDisconnected; }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <code>UserKickOff<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c <code>Message<\/code> \u0438 <code>UserDisconnected<\/code>.<\/p>\n<p><strong>\u041c\u0430\u044f\u0447\u043a\u0438<\/strong><\/p>\n<p>\u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0431\u0435\u0437 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0432\u0435\u0434\u043e\u043c\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u043e \u0447\u0435\u043c-\u043b\u0438\u0431\u043e \u0431\u0435\u0437 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u043e\u0442\u0432\u0435\u0442\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c <code>@beacons<\/code>.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u0430\u0440\u0443 \u043d\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440<\/p>\n<pre><code>group Beacons {     struct LikeUser {         str uuid;     }     struct LikeMessage {         str uuid;     } }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432 workflow \u0443\u043a\u0430\u0436\u0435\u043c \u0438\u0445 \u043a\u0430\u043a \u043c\u0430\u044f\u0447\u043a\u0438<\/p>\n<pre><code>@beacons {     > Beacons.LikeUser;     > Beacons.LikeMessage; }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0447\u0442\u043e \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u043c\u0438\u043c\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f <code>LikeUser<\/code>, <code>LikeMessage<\/code> \u0431\u0435\u0437 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043b\u0438\u0435\u043d\u0442 \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0438 \u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0438 \u043e \u043b\u043e\u0433\u0438\u043a\u0435 \u0438\u0445 \u043e\u0431\u043c\u0435\u043d\u0430, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u044d\u0442\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<pre><code class=\"bash\">clibri --src .\/protocol\/protocol.prot --workflow .\/protocol\/protocol.workflow --puml .\/plantuml.puml # --src \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 # --workflow \u043f\u0443\u0442\u044c \u043a \u0441\u0445\u0435\u043c\u0435 workflow # --puml \u043f\u0443\u0442\u044c \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b<\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"1313\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ae4\/dd5\/492\/ae4dd54922e06ce4b210fe2ac37d710a.png\" data-width=\"563\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u043e\u043c puml <a href=\"https:\/\/plantuml.com\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0442\u043e \u0432\u0430\u0448 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0438 \u043b\u043e\u0433\u0438\u043a\u0443, \u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u0438\u0445 \u0432\u044b, \u0438 \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>\u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 &#8212; \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043a\u0443\u0434\u0430 \u0432\u0430\u0436\u043d\u0435\u0435 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430.<\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0435\u0449\u0451 \u0434\u0432\u0430 \u043c\u043e\u043c\u0435\u043d\u0442\u0430. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043a\u043b\u0438\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u0435\u0431\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 (\u0447\u0430\u0441\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e\u0436\u0435).<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0430\u0448 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u0430\u0440\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440:<\/p>\n<pre><code># \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0447\u0430\u0442\u0430 group Identification {     # \u042d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f     struct SelfKey {         str uuid?;         u64 id?;         str location?;     }          # \u042d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430     # \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043a\u043b\u0438\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u0441 AssignedKey     # \u0438 c SelfKey     struct AssignedKey {         str uuid?;         bool auth?;     } }<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0432\u0430\u0436\u043d\u043e \u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f, <code>SelfKey<\/code> \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c \u043a\u043b\u0438\u0435\u043d\u0442, \u0440\u0430\u0432\u043d\u043e \u043a\u0430\u043a \u0438 <code>AssignedKey<\/code> \u043c\u043e\u0436\u0435\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0435\u0440. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u043f\u043e <code>SelfKey<\/code> \u0438  <code>AssignedKey<\/code>.<\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0441\u0445\u0435\u043c\u0443 workflow \u0441\u0435\u043a\u0446\u0438\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c clibri \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code># \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0441\u0445\u0435\u043c\u044b workflow. # \u0411\u0435\u0437 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 &amp;config {     # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 self-key \u043a\u043b\u0438\u0435\u043d\u0442\u0430     SelfKey: Identification.SelfKey;     # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 assigned-key \u043a\u043b\u0438\u0435\u043d\u0442\u0430     AssignedKey: Identification.AssignedKey;     # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044f\u0437\u043a \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430     Producer: rust;     # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430     Consumer: typescript; }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0451 \u0433\u043e\u0442\u043e\u0432\u043e \u043a \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b.  <\/p>\n<pre><code class=\"bash\">clibri --src .\/protocol\/protocol.prot -wf .\/protocol\/protocol.workflow -cd .\/consumer\/src\/consumer\/ -pd .\/producer\/src\/producer\/ # --src \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 # -wf \u043f\u0443\u0442\u044c \u043a \u0441\u0445\u0435\u043c\u0435 workflow # -cd \u043f\u0443\u0442\u044c \u0434\u043b\u044f \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430 # -pd \u043f\u0443\u0442\u044c \u0434\u043b\u044f \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a \u0434\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b \u043d\u0430\u0448\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u0442\u0430\u043a<\/p>\n<pre><code>\u251c\u2500\u2500 consumer \u2502   \u251c\u2500\u2500 package.json \u2502   \u251c\u2500\u2500 src \u2502   \u2502   \u2514\u2500\u2500 index.ts \u2502   \u251c\u2500\u2500 tsconfig.json \u2502   \u2514\u2500\u2500 tslint.json \u251c\u2500\u2500 producer \u2502   \u251c\u2500\u2500 Cargo.toml \u2502   \u2514\u2500\u2500 src \u2502       \u2514\u2500\u2500 main.rs \u2514\u2500\u2500 protocol     \u251c\u2500\u2500 protocol.prot     \u2514\u2500\u2500 protocol.workflow<\/code><\/pre>\n<p>\u0410 \u043f\u043e\u0441\u043b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b \u0443\u0436\u0435 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">. \u251c\u2500\u2500 consumer \u2502   \u251c\u2500\u2500 package.json \u2502   \u251c\u2500\u2500 src \u2502   \u2502   \u251c\u2500\u2500 consumer \u2502   \u2502   \u2502   \u251c\u2500\u2500 beacons # \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0438 \u043c\u0430\u0438\u0447\u043a\u043e\u0432 \u2502   \u2502   \u2502   \u2502   \u251c\u2500\u2500 beacons.likemessage.ts \u2502   \u2502   \u2502   \u2502   \u2514\u2500\u2500 beacons.likeuser.ts \u2502   \u2502   \u2502   \u251c\u2500\u2500 index.ts \u2502   \u2502   \u2502   \u251c\u2500\u2500 interfaces \u2502   \u2502   \u2502   \u2502   \u2514\u2500\u2500 request.ts \u2502   \u2502   \u2502   \u251c\u2500\u2500 options.ts \u2502   \u2502   \u2502   \u251c\u2500\u2500 protocol \u2502   \u2502   \u2502   \u2502   \u2514\u2500\u2500 protocol.ts \u2502   \u2502   \u2502   \u2514\u2500\u2500 requests # \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u2502   \u2502   \u2502       \u251c\u2500\u2500 message.request.ts \u2502   \u2502   \u2502       \u251c\u2500\u2500 messages.request.ts \u2502   \u2502   \u2502       \u251c\u2500\u2500 userlogin.request.ts \u2502   \u2502   \u2502       \u2514\u2500\u2500 users.request.ts \u2502   \u2502   \u2514\u2500\u2500 index.ts \u2502   \u251c\u2500\u2500 tsconfig.json \u2502   \u2514\u2500\u2500 tslint.json \u251c\u2500\u2500 producer \u2502   \u251c\u2500\u2500 Cargo.toml \u2502   \u2514\u2500\u2500 src \u2502       \u251c\u2500\u2500 main.rs \u2502       \u2514\u2500\u2500 producer \u2502           \u251c\u2500\u2500 beacons # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043c\u0430\u0438\u0447\u043a\u043e\u0432 \u2502           \u2502   \u251c\u2500\u2500 beacons_likemessage.rs \u2502           \u2502   \u251c\u2500\u2500 beacons_likeuser.rs \u2502           \u2502   \u2514\u2500\u2500 mod.rs \u2502           \u251c\u2500\u2500 context.rs # \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u2502           \u251c\u2500\u2500 events # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u2502           \u2502   \u251c\u2500\u2500 connected.rs \u2502           \u2502   \u251c\u2500\u2500 disconnected.rs \u2502           \u2502   \u251c\u2500\u2500 error.rs \u2502           \u2502   \u251c\u2500\u2500 mod.rs \u2502           \u2502   \u251c\u2500\u2500 ready.rs \u2502           \u2502   \u251c\u2500\u2500 serverevents_useralert.rs \u2502           \u2502   \u251c\u2500\u2500 serverevents_userkickoff.rs \u2502           \u2502   \u2514\u2500\u2500 shutdown.rs \u2502           \u251c\u2500\u2500 implementation \u2502           \u2502   \u2514\u2500\u2500 ... # \u0417\u0434\u0435\u0441\u044c \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u2502           \u251c\u2500\u2500 mod.rs \u2502           \u2514\u2500\u2500 responses # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u2502               \u251c\u2500\u2500 message_request.rs \u2502               \u251c\u2500\u2500 messages_request.rs \u2502               \u251c\u2500\u2500 mod.rs \u2502               \u251c\u2500\u2500 userlogin_request.rs \u2502               \u2514\u2500\u2500 users_request.rs \u2514\u2500\u2500 protocol     \u251c\u2500\u2500 protocol.prot     \u2514\u2500\u2500 protocol.workflow<\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a clibri \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443. \u041f\u0440\u0438 \u043a\u0430\u0436\u0443\u0449\u0435\u0439\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0442\u043e\u0432\u043e. \u0412\u0441\u0435 \u0447\u0442\u043e \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c &#8212; \u044d\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438.   <\/p>\n<p><strong>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/strong><\/p>\n<blockquote>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0434\u0430 \u043d\u0438\u0436\u0435, \u043c\u043e\u0435\u0439 \u0446\u0435\u043b\u044c\u044e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 API \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u042f \u043b\u0438\u0448\u044c \u0445\u043e\u0447\u0443 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 clibri \u0438 \u0442\u043e \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u0436\u0438\u0437\u043d\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443. \u041f\u043e\u043b\u043d\u043e\u0435 \u0438 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 API \u0432\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 <a href=\"http:\/\/clibri.net\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<\/blockquote>\n<p>\u041d\u0430\u043c \u0441\u0442\u0430\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043a\u043b\u0430\u0441\u0441 <code>Consumer<\/code>, \u043a\u043b\u0430\u0441\u0441 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043f\u043e\u0431\u043b\u0438\u0436\u0435.<\/p>\n<pre><code class=\"javascript\">class Consumer {     \/\/ Subject \u0434\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f connected. \u0421\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443     \/\/ \u0412\u0430\u0436\u043d\u043e, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d - \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442 \u0433\u043e\u0442\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f     \/\/ \u00ab\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f\u00bb \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443.       public readonly connected: Subject&lt;void>;     \/\/ Subject \u0434\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f ready. \u0421\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 connected \u0442\u043e\u0433\u0434\u0430 \u043a\u043e\u0433\u0434\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c     \/\/ \u0431\u044b\u043b \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0433\u043e\u0442\u043e\u0432 \u043a \u0440\u0430\u0431\u043e\u0442\u0435.     public readonly ready: Subject&lt;string>;     \/\/ Subject \u0434\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f disconnected. \u0421\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438 \u043e\u0431\u0440\u044b\u0432\u0435 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c (     \/\/ \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u043f\u0440\u0438\u0447\u0438\u043d)     public readonly disconnected: Subject&lt;void>;     \/\/ Subject \u0434\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438. \u0421\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430.     public readonly error: Subject&lt;ExtError.TError>;     \/\/ Subjects \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c. \u042d\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f broadcast     public readonly broadcast: {                  EventsUserConnected: Subject&lt;Protocol.Events.UserConnected>,         EventsMessage: Subject&lt;Protocol.Events.Message>,         EventsUserDisconnected: Subject&lt;Protocol.Events.UserDisconnected>,     };     \/\/ \u041f\u043e\u043b\u043d\u0430\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441 \u0435\u0433\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430     public destroy(): Promise&lt;void>; }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u043f\u0440\u043e\u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"javascript\">const login: UserLoginRequest = new UserLoginRequest({     username: username, });  login     .accept((response: Protocol.UserLogin.Accepted) => {         \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f Accept     })     .deny((response: Protocol.UserLogin.Denied) => {         \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f Deny     })     .err((response: Protocol.UserLogin.Err) => {         \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043a\u0438     });  login.send().catch((err: Error) => {     \/\/ \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a \u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 });<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (<strong>conclusions<\/strong>) \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0445\u0435\u043c\u0435, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438. \u0425\u043e\u0442\u044f \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u0430\u044f \u0444\u043e\u0440\u043c\u0430 \u0432\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0430, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438 \u043f\u043e \u0441\u0442\u0430\u0440\u0438\u043d\u043a\u0435:<\/p>\n<pre><code class=\"javascript\">const login: UserLoginRequest = new UserLoginRequest({     username: username, });  login.send()     .then((         response:               Protocol.UserLogin.Accepted |               Protocol.UserLogin.Denied |               Protocol.UserLogin.Err) => {         \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0442\u0432\u0435\u0442\u0430     })     .catch((err: Error) => {         \/\/ \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a \u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439     });<\/code><\/pre>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u043c\u0430\u044f\u0447\u043a\u0438<\/p>\n<pre><code class=\"javascript\">const like = new BeaconsLikeMessage(     Protocol.Beacons.LikeMessage.defaults() );  like.send().then(() => {     \/\/ \u041c\u044b \u0437\u0434\u0435\u0441\u044c, \u0435\u0441\u043b\u0438 \u043c\u0430\u044f\u0447\u043e\u043a \u0431\u044b\u043b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c }).catch((err: Error) => {     \/\/ \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a \u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 });<\/code><\/pre>\n<p>\u041d\u0443 \u0438 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442:<\/p>\n<pre><code class=\"javascript\">\/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 const connection = new Connection(`ws:\/\/127.0.0.1:8080`);  \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442 const consumer = new Consumer(connection, {     id: BigInt(123),     uuid: \"Some UUID\",     location: \"London\", });  \/\/ \u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 broadcast \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f const subscriptions: { [key: string]: Subscription } = {}; subscriptions.onConnected = consumer.connected.subscribe(onConnected); subscriptions.onDisconnected = consumer.disconnected.subscribe(onDisconnected); subscriptions.onReady = consumer.ready.subscribe(onReady);  \/\/ \u0413\u0434\u0435-\u0442\u043e \u043d\u0438\u0436\u0435 \u043d\u0430\u0448\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 function onConnected(\u2026) { \u2026 } function onDisconnected(\u2026) { \u2026 } function onReady(\u2026) { \u2026 }<\/code><\/pre>\n<p><strong>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0435\u0440\u0432\u0435\u0440<\/strong><\/p>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 clibri \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u0442\u0438\u043f\u043e\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0422\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 (<strong>conclusion<\/strong>) \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0435\u0449\u0451 \u0438 <strong>broadcast<\/strong>, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0438\u0437 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u041d\u0438\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"rust\">use super::{identification, producer::Control, protocol, scope::Scope, Context}; use clibri::server;  type BroadcastEventsMessage = (Vec&lt;Uuid>, protocol::Events::Message);  \/\/ Response has a couple of possible responses pub enum Response {     \/\/ Response with broadcasting     Accept((protocol::Message::Accepted, BroadcastEventsMessage)),     \/\/ Response without broadcasting     Deny(protocol::Message::Denied), }  #[allow(unused_variables)] pub async fn response&lt;E: server::Error, C: server::Control&lt;E>>(     request: &amp;protocol::Message::Request,     scope: &amp;mut Scope&lt;'_, E, C>, ) -> Result&lt;Response, protocol::Message::Err> {     Err(protocol::Message::Err { error: String::from(\"Handler isn't implemented yet\") }) }<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c \u043e\u0431 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0435 <code>Scope<\/code>. \u0427\u0435\u0440\u0435\u0437 \u0434\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u0430\u0436\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"128\" width=\"128\">\n<p>Field \/ Method<\/p>\n<\/td>\n<td>\n<p>Access<\/p>\n<\/td>\n<td>\n<p>Description<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"128\" width=\"128\">\n<p>context<\/p>\n<\/td>\n<td>\n<p>scope.context<\/p>\n<\/td>\n<td>\n<p>\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 &#8212; \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0431\u0430\u0437\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u043e\u0447\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"128\" width=\"128\">\n<p>control<\/p>\n<\/td>\n<td>\n<p><code>scope.control<\/code><\/p>\n<\/td>\n<td>\n<p>API \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"128\" width=\"128\">\n<p>identification<\/p>\n<\/td>\n<td>\n<p><code>scope.identification<\/code><\/p>\n<\/td>\n<td>\n<p>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0435\u0433\u043e UUID, self-key \u0438 assigned-key<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"128\" width=\"128\">\n<p>filter<\/p>\n<\/td>\n<td>\n<p><code>scope.filter<\/code><\/p>\n<\/td>\n<td>\n<p>\u041e\u0431\u044a\u0435\u043a\u0442 \u0444\u0438\u043b\u044c\u0442\u0440\u0430. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c UUID \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 broadcast \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"128\" width=\"128\">\n<p>deferred<\/p>\n<\/td>\n<td>\n<p><code>scope.deferred(&amp;mut self, cb: Pin&lt;Box&lt;dyn Future&lt;Output = ()>>>)<\/code><\/p>\n<\/td>\n<td>\n<p>\u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0438\u0437 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u043e\u0442\u0432\u0435\u0442 \u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c broadcast \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (\u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e). \u041e\u0434\u043d\u0430\u043a\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0449\u0451 \u0447\u0442\u043e-\u0442\u043e, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0443. \u0418\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0438 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>deferred<\/code> &#8212; \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (\u0431\u0435\u0437 broadcast) \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0438 \u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0449\u0435 &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0443. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<pre><code class=\"rust\">use super::{identification, producer::Control, protocol, scope::Scope, Context}; use clibri::server;  #[allow(unused_variables)] pub async fn response&lt;E: server::Error, C: server::Control&lt;E>>(     request: &amp;protocol::Users::Request,     scope: &amp;mut Scope&lt;'_, E, C>, ) -> Result&lt;protocol::Users::Response, protocol::Users::Err> {     Err(protocol::Users::Err { error: String::from(\"Handler isn't implemented yet\") }) }<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043c\u0430\u044f\u0447\u043a\u043e\u0432 \u0438\u043c\u0435\u044e\u0442 \u0441\u0445\u043e\u0436\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0440\u0430\u0437\u0432\u0435 \u0447\u0442\u043e \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u0430\u044f\u0447\u043a\u0430 <code>LikeMessage<\/code><\/p>\n<pre><code class=\"rust\">use super::{identification, producer::Control, protocol, Context, scope::Scope}; use clibri::server;  #[allow(unused_variables)] pub async fn emit&lt;E: server::Error, C: server::Control&lt;E>>(     beacon: &amp;protocol::Beacons::LikeMessage,     scope: &amp;mut Scope&lt;'_, E, C>, ) -> Result&lt;(), String> {     println!(\"Handler for protocol::Beacons::LikeMessage isn't implemented\");     Ok(()) }<\/code><\/pre>\n<p>\u0412 \u0442\u043e\u043c \u0436\u0435 \u043a\u043b\u044e\u0447\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f <code>UserKickOff<\/code><\/p>\n<pre><code class=\"rust\">use super::{identification, producer::Control, protocol, Context, scope::AnonymousScope}; use clibri::server; use uuid::Uuid;  type BroadcastEventsMessage = (Vec&lt;Uuid>, protocol::Events::Message); type BroadcastEventsUserDisconnected = Option&lt;(Vec&lt;Uuid>, protocol::Events::UserDisconnected)>;  #[allow(unused_variables)] pub async fn emit&lt;E: server::Error, C: server::Control&lt;E>>(     event: protocol::ServerEvents::UserKickOff,     scope: &amp;mut AnonymousScope&lt;'_, E, C>, ) -> Result&lt;(BroadcastEventsMessage, BroadcastEventsUserDisconnected), String> {     panic!(\"Handler for protocol::ServerEvents:: UserKickOff isn't implemented\"); }<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f <code>connected<\/code><\/p>\n<pre><code class=\"rust\">use super::{identification, producer::Control, scope::Scope, Context}; use clibri::server;  #[allow(unused_variables)] pub async fn emit&lt;E: server::Error, C: server::Control&lt;E>>(     scope: &amp;mut Scope&lt;'_, E, C>, ) -> Result&lt;(), String> {     Ok(()) }<\/code><\/pre>\n<p>\u0427\u0442\u043e \u0436, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440<\/p>\n<pre><code class=\"rust\">mod producer;  use clibri_transport_server::{     options::{Listener, Options},     server::Server, }; use std::net::SocketAddr;  #[tokio::main] async fn main() -> Result&lt;(), String> {      \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442     let socket_addr = \"127.0.0.1:8080\".parse::&lt;SocketAddr>().unwrap();     let server = Server::new(Options {         listener: Listener::Direct(socket_addr),     });      \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 (\u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432\u043e \u0432\u0441\u0435\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u0445)     let context = producer::Context::new();      \/\/ \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440     producer::run(server, producer::Options::new(), context)         .await         .map_err(|e| e.to_string())?;      \/\/ Game is over     Ok(()) }<\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a, clibri \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0430 \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443 \u0438 \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041d\u0430\u043c \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u0436\u0435 \u043d\u0435 \u0441\u0430\u043c\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b. \u0422\u043e \u0435\u0441\u0442\u044c clibri \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f:<\/p>\n<ol>\n<li>\n<p>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\/\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u043a\u0438, \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u0439 \u0432 \u0441\u0445\u0435\u043c\u0435 workflow<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 (\u0447\u0430\u0442) \u043d\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e (\u00ab\u0441\u044b\u0440\u044b\u043c\u0438\u00bb \u0431\u0430\u0439\u0442\u0430\u043c\u0438) \u043d\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u043d\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041c\u044b \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430\u043c\u0438 \u0438\u0437 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043b\u0438\u0431\u043e \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u043d\u0430\u0441 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f\u043c\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u00ab\u043d\u0430 \u043d\u0451\u043c\u00bb \u043c\u0435\u0442\u043e\u0434 send).<\/p>\n<details class=\"spoiler\">\n<summary>\u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0434\u0435\u043b\u043e, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 clibri \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 clibri. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0432\u044b \u0441\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u043d\u0430 \u0441\u0432\u043e\u0439 \u0432\u043a\u0443\u0441 \u0438 \u0446\u0432\u0435\u0442.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb clibri \u0434\u0430\u0451\u0442 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u043d\u0430 \u0431\u0430\u0437\u0435 websocket. \u0418\u043c\u0435\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0443\u044e\u0449\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438: \u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 rust (crates), \u043a\u043b\u0438\u0435\u043d\u0442 (\u0434\u043b\u044f node \u0438 \u0434\u043b\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430) \u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f typescript (npm \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438).<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0432\u0442\u043e\u0440\u044e\u0441\u044c, \u044f \u043d\u0435 \u0441\u0442\u0430\u0432\u043b\u044e \u0441\u0432\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0434\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 API \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0430 \u0445\u043e\u0447\u0443 \u043b\u0438\u0448\u044c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u0441\u044f \u0432\u0430\u043c\u0438 \u0438\u0434\u0435\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u043e\u044f\u0442 \u0437\u0430 clibri. \u041f\u043e\u043b\u043d\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 <a href=\"http:\/\/clibri.net\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>, \u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u044b <a href=\"https:\/\/github.com\/DmitryAstafyev\/clibri\/tree\/master\/examples\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438 \u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445, \u0432\u043e\u0442 \u043a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0447\u0430\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e:<\/p>\n<pre><code class=\"bash\">git clone git@github.com:DmitryAstafyev\/clibri.git cd clibri\/examples # \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 rust \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0430 typescript sh .\/gen-rs-ts.sh # \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440 .\/producer\/rust\/target\/release\/clibri_producer_rs<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 <code>examples\/consumer\/typescript\/src\/index.html<\/code><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0443\u0436\u0435 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u043b\u0438 \u043d\u0430 <a href=\"http:\/\/clibri.net\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0430\u0439\u0442<\/a> \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0442\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u043f\u043b\u0430\u0448\u043a\u0443 \u00abalpha\u00bb. \u042d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e. \u0422\u0430\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u00ab\u043f\u0440\u044b\u0433\u043d\u0443\u0442\u044c\u00bb \u0432 production \u0438 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0435\u0441\u0442\u044c \u0433\u0434\u0435-\u0442\u043e \u0437\u0430\u0442\u0430\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u0431\u0430\u0433\u0438, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0435 \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 (\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 <a href=\"https:\/\/github.com\/DmitryAstafyev\/clibri\/actions\" rel=\"noopener noreferrer nofollow\">gitactions<\/a>).  <\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438 \u043e \u0442\u0435\u0441\u0442\u0430\u0445, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0431\u0430\u043b\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u0430\u043c\u0438 \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0440\u0430\u0432\u043d\u0438\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430 node \u0438 rust).<\/p>\n<pre><code class=\"bash\">git clone git@github.com:DmitryAstafyev\/clibri.git # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u00ab\u0442\u044f\u0436\u0435\u043b\u044b\u0439\u00bb \u0442\u0435\u0441\u0442 - \u0441\u0435\u0440\u0432\u0435\u0440 cd tests\/workflow sh .\/run-producer-rs-heavy.sh # \u0412 \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u043d\u0441\u043e\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u00ab\u0442\u044f\u0436\u0435\u043b\u044b\u0439\u00bb \u0442\u0435\u0441\u0442 - \u043a\u043b\u0438\u0435\u043d\u0442 cd tests\/workflow sh .\/run-consumer-rs-heavy.sh<\/code><\/pre>\n<p>\u041c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e<\/p>\n<pre><code class=\"bash\"># \u0414\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 exec .\/producer\/rust\/target\/release\/clibri_producer_rs --connections=120000 --multiple=1000<\/code><\/pre>\n<ul>\n<li>\n<p><code>--connections=number<\/code> &#8212; \u0447\u0438\u0441\u043b\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<li>\n<p><code>--multiple=number<\/code> &#8212; \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u043e\u0434\u0438\u043d \u043f\u043e\u0440\u0442<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"bash\"># \u0414\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 exec .\/consumer\/rust\/target\/release\/clibri_client_rs --connections=10000 --timeout=600000 --multiple -threads=12<\/code><\/pre>\n<ul>\n<li>\n<p><code>--connections=number<\/code> &#8212; \u0447\u0438\u0441\u043b\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441<\/p>\n<\/li>\n<li>\n<p><code>--threads=number<\/code> &#8212; \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432; \u043f\u0440\u0438 10000 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 1 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438 6 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u0445, \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u043e 60000 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432<\/p>\n<\/li>\n<li>\n<p><code>--multiple<\/code> &#8212; \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u0440\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043f\u0435\u0440\u0435\u0434 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c<\/p>\n<\/li>\n<li>\n<p><code>--timeout=number<\/code> &#8212; \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441\/\u043e\u0442\u0432\u0435\u0442; \u043b\u0443\u0447\u0448\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0430\u043c\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0442\u043e\u0439 \u0436\u0435 \u043c\u0430\u0448\u0438\u043d\u0435 \u0447\u0442\u043e \u0438 \u0442\u0435\u0441\u0442; \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 ms<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0434\u043d\u0430 \u0440\u0435\u043c\u0430\u0440\u043a\u0430. \u041a\u0430\u043a \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u043d\u0430 \u043e\u0434\u0438\u043d \u043f\u043e\u0440\u0442 \u043e\u0441\u043e\u0431\u043e \u043c\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 rust \u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u043c\u0435\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u0440\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u044b\u0439\u0442\u0438 \u0437\u0430 \u043b\u0438\u043c\u0438\u0442\u044b. \u041a\u043b\u0438\u0435\u043d\u0442 \u0434\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 \u0438 \u0443\u0436\u0435 \u043a \u043d\u0435\u043c\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u041d\u0430 \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u043a\u0440\u043e\u043c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 (i7, 16Gb RAM, ArchLinux) \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u0441\u0442 \u043d\u0430 200 000 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u0433\u0434\u0435 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u043c\u0438 \u0431\u044b\u043b\u043e \u043e\u043a\u043e\u043b\u043e 110 \u0442\u044b\u0441. \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u041d\u043e \u044d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0435\u043e\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0438 \u0441\u0435\u0440\u0432\u0435\u0440, \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u043c\u0430\u0448\u0438\u043d\u0435 (\u0438 \u043a\u0441\u0442\u0430\u0442\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u00ab\u0436\u0440\u0443\u0442\u00bb \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0434\u0430\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435). <\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u0443\u0442\u044c \u0442\u0435\u0441\u0442\u0430<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0415\u0441\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0441 \u043a\u0443\u0447\u0435\u0439 \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \u0435\u0441\u0442\u044c \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 broadcast \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0412\u0441\u0451 \u044d\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u0442 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u0441\u0451 \u0447\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u0435\u0442, \u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0432\u0441\u0435\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0438). \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u0438 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b &#8212; \u0442\u0435\u0441\u0442 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u044b\u043c. <\/p>\n<\/div>\n<\/details>\n<p>\u041c\u0435\u0436\u0434\u0443 \u0442\u0435\u043c, \u043a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u043e &#8212; \u044d\u0442\u043e alpha. \u0418 \u044f \u0431\u044b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 alpha \u043d\u0430 production. \u041d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0431\u0435\u0437 \u0432\u0430\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 \u0440\u0435\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041f\u043e\u0441\u0435\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432\u044b\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0437\u0434\u0435\u0441\u044c \u0438\u0434\u0435\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b, \u0438\u043b\u0438 \u0436\u0435 \u0432\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0448\u0430\u043d\u0441 \u043d\u0430 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 &#8212; \u043a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u043d\u0430 \u0437\u0432\u0435\u0437\u0434\u043e\u0447\u043a\u0443 \u043d\u0430 <a href=\"https:\/\/github.com\/DmitryAstafyev\/clibri\" rel=\"noopener noreferrer nofollow\">github<\/a>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0443 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 <a href=\"http:\/\/clibri.net\/page_roadmap.html\" rel=\"noopener noreferrer nofollow\">\u043f\u043b\u0430\u043d\u044b<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0430\u043a \u0440\u0430\u0437 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b \u0441 \u0432\u0430\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u044c\u044e.  <\/p>\n<p>\u041f\u043e\u044f\u0441\u043d\u044e. \u0421 \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0432\u043e\u0439 \u0437\u0432\u0435\u0437\u0434\u043e\u0439 \u0438\u043b\u0438 \u0444\u043e\u0440\u043a\u043e\u043c, <a href=\"http:\/\/clibri.net\/page_roadmap.html\" rel=\"noopener noreferrer nofollow\">deadline`\u044b<\/a> \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u0434\u0430\u0442\u044b \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0431\u043b\u0438\u0436\u0435. \u041c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0438 \u0441\u0430\u043c\u0438 \ud83d\ude09 \u041a\u0441\u0442\u0430\u0442\u0438, \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043e\u0431\u0435\u0449\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432.<\/p>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044e \u0432\u0441\u0435\u0445, \u043a\u0442\u043e \u043e\u0441\u0438\u043b\u0438\u043b \u0441\u0442\u043e\u043b\u044c \u0434\u043b\u0438\u043d\u043d\u0443\u044e \u0442\u044f\u0433\u043e\u043c\u043e\u0442\u0438\u043d\u0443 \u0438 \u0434\u043e\u0442\u044f\u043d\u0443\u043b \u0434\u043e \u043a\u043e\u043d\u0446\u0430 &#8212; <strong>\u0441\u043f\u0430\u0441\u0438\u0431\u043e<\/strong>!<\/p>\n<p>\u0414\u043e\u0431\u0440\u0430 \u0438 \u0441\u0432\u0435\u0442\u0430 \u0432\u0430\u043c \u0432 \u043d\u043e\u0432\u043e\u043c \u0433\u043e\u0434\u0443, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e \u0447\u0442\u043e \u043c\u0438\u0440, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u044a\u0435\u0445\u0430\u043b )<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u0441\u044b\u043b\u043a\u0438<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/DmitryAstafyev\/clibri\" rel=\"noopener noreferrer nofollow\">github<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/clibri.net\/\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/599717\/\"> https:\/\/habr.com\/ru\/post\/599717\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\" class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0438\u0436\u0435 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439; \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0441\u043a\u0440\u0435\u0441\u0442\u0438\u0442\u044c <s>\u0443\u0436\u0430 \u0441 \u0435\u0436\u043e\u043c<\/s> rust \u0441 typescript; \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0442\u044f\u0436\u0435\u043b\u043e \u0436\u0438\u0442\u044c \u0431\u0435\u0437 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0438 \u043a\u0430\u043a \u0436\u0435 \u043b\u0435\u0433\u043a\u043e \u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u0441 \u043d\u0438\u043c; \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0447\u0430\u0442 \u0437\u0430 10 \u043c\u0438\u043d\u0443\u0442 \u043d\u0430 typescript\/rust \u0438\u043b\u0438 \u043d\u0435 \u0437\u0430 10, \u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u2026 \u0412 \u043e\u0431\u0449\u0435\u043c \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0434\u043e\u043b\u0433\u0438\u0439, \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u043d\u0443\u0434\u043d\u044b\u0439 \u0440\u0430\u0441\u0441\u043a\u0430\u0437, \u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0434\u0430\u0436\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432. \u0412\u0441\u0435\u043c \u043a\u043e\u043c\u0443 \u043d\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0441\u043b\u043e\u0432\u0430: \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u2026 \u043f\u0440\u043e\u0448\u0443.<\/p>\n<hr\/>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u0438\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043e\u0431\u0449\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u0443\u0441\u0442\u044c \u0438 \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u044c, \u043d\u043e \u043f\u043e \u043a\u0430\u043a\u0438\u043c-\u043b\u0438\u0431\u043e \u0438\u043d\u044b\u043c \u043a\u0430\u043d\u0430\u043b\u0430\u043c), \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043e\u0431\u0434\u0443\u043c\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. \u041d\u0443 \u0434\u043e\u043b\u0436\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f\u2026 \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0437\u0430 \u0434\u043e\u043b\u0438 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0438 \u0438\u043c \u0441\u0442\u0430\u043b \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0439 JSON &#8212; \u044d\u0442\u043e \u0443\u0436\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b (\u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0435\u0433\u043e \u0447\u0430\u0441\u0442\u044c).  <\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 &#8212; \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u044d\u0442\u0430\u043f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u0435\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440, \u0435\u0449\u0451 \u0434\u043e \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u00ab\u043a\u0430\u043a?\u00bb (\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442) \u0438 \u00ab\u0447\u0435\u043c?\u00bb (\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b) \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u0417\u0430 \u043e\u0431\u043c\u0430\u043d\u0447\u0438\u0432\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u043e\u0439 \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0431\u0435\u0437\u0434\u043d\u0430 \u0431\u0430\u0433\u043e\u0432 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a: \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0441\u043a\u043e\u0447\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440 \u0438 \u043f\u043e\u0440\u043e\u0434\u0438\u0442\u044c \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442, \u0430 \u0432\u044b \u0438\u0449\u0438\u0442\u0435 \u0433\u0434\u0435 \u0438 \u043e\u0442 \u0447\u0435\u0433\u043e \u0432\u043e\u0437\u043d\u0438\u043a \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0436\u0443\u0447\u043e\u043a, \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u0435\u0431\u0435 \u0443\u0436\u0435 \u0433\u0434\u0435-\u0442\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 UI.<\/p>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u0430 \u0432\u0430\u0436\u043d\u0430 \u0448\u0442\u0443\u043a\u0430 &#8212; \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0438 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c. \u0427\u0430\u0441\u0442\u0435\u043d\u044c\u043a\u043e, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c \u043b\u0435\u0436\u0430\u0442 \u043d\u0435 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u0432 \u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0435. \u0425\u043e\u0440\u043e\u0448\u043e \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u043f\u043e\u043c\u043e\u0447\u044c \u0432 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430, \u043d\u043e \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u0448\u0430\u0442\u044c \u044d\u0442\u043e\u043c\u0443.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0435\u0442\u0435\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 &#8212; \u0447\u0430\u0442. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c (\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u0438 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c) \u0438 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043e \u043d\u0438\u0445 \u0437\u0430\u0431\u044b\u0442\u044c \u0438 \u043d\u0435 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c.<\/p>\n<p>\u0410 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u00ab\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u00bb \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 <a href=\"http:\/\/clibri.net\/\" rel=\"noopener noreferrer nofollow\">clibri<\/a>, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0435\u043c\u0443 (\u0438\u043b\u0438 \u0435\u0439) \u0438 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f. \u0421\u0443\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0430 \u2014 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443 &#8212; \u00ab\u043f\u043e\u0447\u0442\u0438\u00bb \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u043a \u0440\u0430\u0431\u043e\u0442\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0449\u0435?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (\u043a\u043e\u0438\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440) \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e JSON. \u041d\u0438\u0447\u0435\u0433\u043e \u043f\u043b\u043e\u0445\u043e\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043c\u044b \u0431\u0435\u0440\u0451\u043c \u043d\u0430 \u0441\u0435\u0431\u044f, \u0430 \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u043d\u0430 \u0442\u0440\u0430\u0444\u0438\u043a:<\/p>\n<ul>\n<li>\n<p>\u0435\u0441\u043b\u0438 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e web, \u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e typescript\/javascript, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u044b \u0438 \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c (\u043d\u0438 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445, \u043d\u0438 \u0432 \u043e\u0442\u0432\u0435\u0442\u0430\u0445) \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b JSON \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f human-readable, \u0447\u0442\u043e \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438; \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 &#8212; \u044d\u0442\u043e \u0442\u0435\u043a\u0441\u0442, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0440\u0430\u0437\u043c\u0435\u0440. \u041a\u043e\u0433\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u00ab\u0431\u0435\u0433\u0430\u0435\u0442\u00bb \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0435\u043d \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 &#8212; \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043d\u043e \u0435\u0441\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b, \u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043b\u0438\u0448\u043d\u0438\u0439 \u0431\u0430\u0439\u0442, \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 \u0442\u0440\u0430\u0444\u0438\u043a. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0438\u043c\u0451\u043d \u043f\u043e\u043b\u0435\u0439, \u0441\u043a\u0430\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 <code>{ \u00aba\u00bb: \u2026, \u00abb\u00bb: \u2026, \u2026 }<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>{ \u00abname\u00bb: \u2026, \u00abemail\u00bb: \u2026, \u2026 }<\/code>, \u043d\u043e \u043e\u0442 \u0441\u0430\u043c\u0438\u0445 \u0438\u043c\u0451\u043d \u043f\u043e\u043b\u0435\u0439 \u0438 \u0432\u0441\u0435\u0445 \u0441\u043a\u043e\u0431\u043e\u043a, \u0437\u0430\u043f\u044f\u0442\u044b\u0445 \u0432\u044b \u043d\u0435 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u0435\u0441\u044c, \u0430 \u044d\u0442\u043e \u0432\u0441\u0451 \u0431\u0430\u0439\u0442\u044b, \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 JSON \u0441\u0442\u0440\u043e\u043a\u0443. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0432\u044b\u0440\u0443\u0447\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0440\u0435\u0441\u0441\u0438\u044f, \u043d\u043e \u043e\u043f\u044f\u0442\u044c \u0436\u0435 &#8212; \u043c\u044b \u043b\u0438\u0448\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u0443\u0440\u043e\u0432\u043d\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 &#8212; \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u0442\u043e\u043a\u0435. \u0422\u0443\u0442 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043f\u0440\u043e\u043f\u0430\u0440\u0441\u0438\u0442\u044c JSON \u0441\u0442\u0440\u043e\u043a\u0443, \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0432\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430: \u043d\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u043c\u0435\u043d\u044c\u0448\u0435, \u043d\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0435. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043a\u0430\u0436\u0435\u043c \u0431\u0443\u0444\u0435\u0440, \u043a\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043a\u0438\u0434\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0431\u0430\u0439\u0442\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u041d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442, \u0431\u0435\u0437 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f header, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b \u0431\u044b \u0434\u043b\u0438\u043d\u0443 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u043e \u00ab\u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0435\u00bb \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0441\u0442\u0430\u0432\u0430\u044f\u0441\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438. \u0413\u0440\u0443\u0431\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043f\u0430\u043a\u0435\u0442 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:<\/p>\n<pre><code>[u16            ][u8        ][u32         ]    [message length ][type field][field value ]<\/code><\/pre>\n<p>\u041c\u044b \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0438\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0439\u0442 \u043d\u0430\u043c \u0436\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u0431\u044b \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0438 \u0431\u0435\u0437 \u043d\u0435\u0440\u0432\u043e\u0432 \u043f\u0440\u043e\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435; \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c header \u0441 \u043e\u0434\u043d\u0438\u043c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043f\u043e\u043b\u0435\u043c &#8212; \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0414\u0430\u043b\u044c\u0448\u0435 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0442\u0438\u043f \u043f\u043e\u043b\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 0 &#8212; \u044d\u0442\u043e u8, 1 &#8212; u16, 2 &#8212; u32 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0417\u043d\u0430\u044f \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043d \u00ab\u0432\u0435\u0441\u0438\u0442\u00bb \u0438 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c u32 \u043c\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u043c 4 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0431\u0430\u0439\u0442\u0430. <\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043d\u0430\u0448\u0435\u0433\u043e \u0447\u0430\u0442\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 clibri<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 clibri<\/summary>\n<div class=\"spoiler__content\">\n<p>Clibri \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043b\u0438\u0448\u044c \u0442\u0440\u0435\u043c\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438:<\/p>\n<ul>\n<li>\n<p><code>struct<\/code> &#8212; \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 (\u043e\u0431\u044a\u0435\u043a\u0442 \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435). \u0418\u043c\u0435\u0435\u0442 \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044f.<\/p>\n<\/li>\n<li>\n<p><code>enum<\/code> &#8212; \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u044f \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0422\u043e \u0435\u0441\u0442\u044c enum \u0432 clibri \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d enum \u0432 rust.<\/p>\n<\/li>\n<li>\n<p><code>group<\/code> &#8212; \u044d\u0442\u043e \u043a\u0430\u043a namespace \u0432 typescript \u0438\u043b\u0438 \u0436\u0435 mod \u0432 rust. \u041f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0435\u0435 \u0438 \u044f\u0441\u043d\u0435\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>Clibri \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>Type<\/p>\n<\/td>\n<td>\n<p>Array type<\/p>\n<\/td>\n<td>\n<p>Length<\/p>\n<\/td>\n<td>\n<p>Description<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>i8<\/p>\n<\/td>\n<td>\n<p>i8[]<\/p>\n<\/td>\n<td>\n<p>8-bit<\/p>\n<\/td>\n<td>\n<p>Signed integer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>i16<\/p>\n<\/td>\n<td>\n<p>i16[]<\/p>\n<\/td>\n<td>\n<p>16-bit<\/p>\n<\/td>\n<td>\n<p>Signed integer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>i32<\/p>\n<\/td>\n<td>\n<p>i32[]<\/p>\n<\/td>\n<td>\n<p>32-bit<\/p>\n<\/td>\n<td>\n<p>Signed integer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>i64<\/p>\n<\/td>\n<td>\n<p>i64[]<\/p>\n<\/td>\n<td>\n<p>64-bit<\/p>\n<\/td>\n<td>\n<p>Signed integer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>u8<\/p>\n<\/td>\n<td>\n<p>u8[]<\/p>\n<\/td>\n<td>\n<p>8-bit<\/p>\n<\/td>\n<td>\n<p>Unsigned integer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>u16<\/p>\n<\/td>\n<td>\n<p>u16[]<\/p>\n<\/td>\n<td>\n<p>16-bit<\/p>\n<\/td>\n<td>\n<p>Unsigned integer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>u32<\/p>\n<\/td>\n<td>\n<p>u32[]<\/p>\n<\/td>\n<td>\n<p>32-bit<\/p>\n<\/td>\n<td>\n<p>Unsigned integer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>u64<\/p>\n<\/td>\n<td>\n<p>u64[]<\/p>\n<\/td>\n<td>\n<p>64-bit<\/p>\n<\/td>\n<td>\n<p>Unsigned integer<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>f32<\/p>\n<\/td>\n<td>\n<p>f32[]<\/p>\n<\/td>\n<td>\n<p>32-bit<\/p>\n<\/td>\n<td>\n<p>Floating-point number<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>f64<\/p>\n<\/td>\n<td>\n<p>f64[]<\/p>\n<\/td>\n<td>\n<p>64-bit<\/p>\n<\/td>\n<td>\n<p>Floating-point number<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>str<\/p>\n<\/td>\n<td>\n<p>str[]<\/p>\n<\/td>\n<td>\n<p>unlimited<\/p>\n<\/td>\n<td>\n<p>String value<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>bool<\/p>\n<\/td>\n<td>\n<p>bool[]<\/p>\n<\/td>\n<td>\n<p>8-bit<\/p>\n<\/td>\n<td>\n<p>Boolean value<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435<\/p>\n<pre><code># \u041f\u0440\u043e\u0441\u0442\u043e\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 (\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439) enum UserRole {     Admin;     User; }  struct Address {     str email;     # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0437\u043d\u0430\u043a ? \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f     str address?;     str phone?; }  struct User {     str nickname;     # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435     UserRole role;     # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443     Address addr;  }  struct Message { # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443     User author;      str field_str?;               u8 field_u8;               # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f [] \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c     u8[] field_array_u8;   }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<pre><code>enum IncomeMessage {     # \u041e\u043f\u0446\u0438\u044f Text \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443     str Text;                 # \u041e\u043f\u0446\u0438\u044f Bytes \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442     u8[] Bytes;            }<\/code><\/pre>\n<p>\u0421 \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e &#8212; \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0433\u0440\u0443\u043f\u043f\u0443 \u0438 \u00ab\u043a\u043b\u0430\u0434\u0435\u043c\u00bb \u0442\u0443\u0434\u0430 \u0432\u0441\u0435 \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u043c, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0434\u0440\u0443\u0433\u0438\u0435 (\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435) \u0433\u0440\u0443\u043f\u043f\u044b.<\/p>\n<pre><code>group Messages {     enum Content {         str Text;         u8[] Bytes;     }      struct Anonymous {         Content message;     }      struct Authorized {         str uuid;         Content message;     } }  struct AllMessages {     # \u0414\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043f\u0443\u0442\u0438 \u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0439\u0441\u044f \u0432 \u0433\u0440\u0443\u043f\u043f\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \".\" (\u0442\u043e\u0447\u043a\u0443)     Messages.Anonymous[] anonymous;         Messages.Authorized[] authorized;  }<\/code><\/pre>\n<\/div>\n<\/details>\n<pre><code># \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0440\u043e\u043b\u0438 \u043d\u0430\u0448\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 enum UserRole {     Admin;     User;     Manager; }  # \u0412 \u044d\u0442\u0443 \u0433\u0440\u0443\u043f\u043f\u0443 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 group Events {     # \u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f     struct UserConnected {         str username;         str uuid;     }     # \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f     struct UserDisconnected {         str username;         str uuid;     }     # \u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u0432 \u0447\u0430\u0442     struct Message {         u64 timestamp;         str user;         str message;         str uuid;     } }  # \u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0447\u0430\u0442 group Message {     struct Request {         str user;         str message;     }     struct Accepted {         str uuid;     }     struct Denied {         str reason;     }     struct Err {         str error;     } }  # \u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0447\u0430\u0442\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0432\u043d\u043e\u0432\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439) group Messages {     struct Message {         u64 timestamp;         str user;         str uuid;         str message;     }     struct Request { }     struct Response {         Message[] messages;     }     struct Err {         str error;     } }  # \u0417\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0432\u0445\u043e\u0434 (\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0435\u0437 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 \u0438 \u0445\u0435\u0448\u0435\u0439) group UserLogin {     struct Request {         str username;     }     struct Accepted {         str uuid;     }     struct Denied {         str reason;     }     struct Err {         str error;     } }  # \u0417\u0430\u043f\u0440\u043e\u0441 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0447\u0430\u0442\u0435. group Users {     struct User {         str name;         str uuid;     }     struct Request { }     struct Response {         User[] users;     }     struct Err {         str error;     } }<\/code><\/pre>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0432\u0430\u0441 \u0443\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043c\u0443\u0442\u0438\u043b\u043e, \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 <code>Accepted<\/code> \u0438 <code>Denied<\/code>. \u041c\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438, \u0432\u0438\u0434\u0435\u0442\u044c \u043e\u0442\u043a\u0430\u0437 \u0432 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0448\u0438\u0431\u043a\u0438. \u041d\u043e \u043e\u0448\u0438\u0431\u043a\u0430 \u043b\u0438 \u044d\u0442\u043e \u0432 \u0447\u0438\u0441\u0442\u043e\u043c \u0432\u0438\u0434\u0435? \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445: \u043b\u043e\u0433\u0438\u043d \/ \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b, \u043d\u043e \u0432\u043e\u0439\u0442\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d. \u0421 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u0441\u0435 &#8212; \u043e\u043a, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u044d\u0442\u043e \u043d\u0435 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441.  <\/p>\n<p>\u041d\u0438\u0436\u0435 \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435, clibri \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u043e\u0439 &#8212; \u043e\u0448\u0438\u0431\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u043d\u0435\u043a\u0438\u0439 \u0441\u0431\u043e\u0439. \u0421\u0435\u0439\u0447\u0430\u0441, \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u043e \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435 \u0432\u044b \u0432\u0441\u0451 \u0443\u0432\u0438\u0434\u0438\u0442\u0435.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b; \u0445\u043e\u0442\u044f \u044d\u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0448\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0438 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<p>\u0418 \u0432\u0440\u043e\u0434\u0435, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430, \u0441\u0445\u0435\u043c\u0430 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u043b\u0438 \u043c\u0435\u043d\u0435\u0435 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f. \u041c\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u041d\u043e \u043b\u0438\u0448\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u2026<\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0430 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. \u041f\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443 clibri &#8212; \u044d\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b. \u0412\u044b \u0434\u0430\u0451\u0442\u0435 clibri \u0441\u0445\u0435\u043c\u0443, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \u044f\u0437\u044b\u043a (\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f typescript \u0438 rust) \u0438 clibri \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f \u0432\u0430\u0441 \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0432\u043e\u043b\u044c\u043d\u044b \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0432 \u0441\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c. \u041d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0443\u0436\u0435\u043d \u043f\u0443\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 npm \u0434\u043b\u044f web-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0447\u0430\u0442\u0430 \u0438 \u043f\u0443\u0441\u0442\u043e\u0439 rust \u043f\u0440\u043e\u0435\u043a\u0442 &#8212; \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u043d\u0430 typescript &#8212; \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u0446\u0435\u043b\u0435\u0439 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u044f \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043e\u0441\u0432\u0435\u0442\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 \u0434\u0432\u0430 \u044f\u0437\u044b\u043a\u0430).<\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u0435\u0440\u0435\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>. \u251c\u2500\u2500 consumer \u2502   \u251c\u2500\u2500 package.json \u2502   \u251c\u2500\u2500 src \u2502   \u2502   \u2514\u2500\u2500 index.ts \u2502   \u251c\u2500\u2500 tsconfig.json \u2502   \u2514\u2500\u2500 tslint.json \u251c\u2500\u2500 producer \u2502   \u251c\u2500\u2500 Cargo.toml \u2502   \u2514\u2500\u2500 src \u2502       \u2514\u2500\u2500 main.rs \u2514\u2500\u2500 protocol     \u2514\u2500\u2500 protocol.prot<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c <a href=\"https:\/\/github.com\/DmitryAstafyev\/clibri\/releases\" rel=\"noopener noreferrer nofollow\">clibri<\/a> (\u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 &#8212; \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a, \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f), \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432\u044b\u0448\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0432 \u0444\u0430\u0439\u043b \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c.<\/p>\n<pre><code class=\"bash\">clibri --src .\/protocol\/protocol.prot -rs .\/producer\/src\/protocol.rs -ts .\/consumer\/src\/protocol.ts -o --em # --src \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 # -rs \u043f\u0443\u0442\u044c \u043a\u0443\u0434\u0430<\/code><\/pre>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-326833","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/326833","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=326833"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/326833\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=326833"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=326833"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=326833"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}