mirror of
https://github.com/LingChair/LingChair-V0.git
synced 2025-12-08 10:05:49 +08:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9f456b95c1 | ||
|
|
7d2798d4fd | ||
|
|
0ccee91b3e | ||
|
|
48bad65df5 | ||
|
|
5b55ca77ec | ||
|
|
71b5b5b2df | ||
|
|
9c1dc4c540 | ||
|
|
f3bf5f88b5 | ||
|
|
971b8aff85 | ||
|
|
ddfbe547e1 | ||
|
|
b4bbe08ff2 | ||
|
|
6ec0005122 | ||
|
|
541f043531 | ||
|
|
7253f0a4ec | ||
|
|
f19c3c793a |
39
.github/QA.md
vendored
Normal file
39
.github/QA.md
vendored
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
### Q&A
|
||||||
|
|
||||||
|
#### 1. 协助项目
|
||||||
|
|
||||||
|
1. 若修改代码,请务必添加注释或者尽可能让方法名能被人所理解
|
||||||
|
|
||||||
|
2. 修改 readme 相关时,请不要留废话
|
||||||
|
|
||||||
|
3. 其它非代码注明性注释会不定期清理
|
||||||
|
|
||||||
|
4. 待补充
|
||||||
|
|
||||||
|
#### 2. 商业用途
|
||||||
|
|
||||||
|
不建议,不推荐,不赞同用于商业用途, 本项目的设计初衷是为了个人和团队使用, 而非用于圈钱, 因此如果确实需要商业化, 请考虑其他项目
|
||||||
|
|
||||||
|
因为这个项目还在初级阶段, 还有很多地方不够完善, 甚至有很多漏洞被利用, 造成不必要的损失
|
||||||
|
|
||||||
|
#### 3. 提问
|
||||||
|
|
||||||
|
1. 禁止人身攻击性回复
|
||||||
|
|
||||||
|
2. 请详细说明你的问题
|
||||||
|
|
||||||
|
3. 漏洞、BUG 类请给出代码位置
|
||||||
|
|
||||||
|
#### 4. 功能请求
|
||||||
|
|
||||||
|
目前不考虑,因为每一个做开源的人都应该以生活,以自己的感受为本
|
||||||
|
|
||||||
|
就像 weishu 大佬所说的:
|
||||||
|
|
||||||
|
> 我发现很多搞开源的开发者都把自己弄得很累
|
||||||
|
> 其实你把它当作是钓鱼,摩托,音响,单反那样的兴趣爱好就好多了
|
||||||
|
> 既然是爱好,就不要搞得像打第二份工一样,开心了就玩,玩腻了就扔一边
|
||||||
|
|
||||||
|
另外如果你提交功能 PR,我有可能会直接 Close,我没有太多精力去维护一个用不上的功能
|
||||||
|
|
||||||
|
#### 5. 待补充
|
||||||
BIN
.github/模块化_Babel.zip
vendored
Normal file
BIN
.github/模块化_Babel.zip
vendored
Normal file
Binary file not shown.
BIN
.github/模块化_Webpack.zip
vendored
Normal file
BIN
.github/模块化_Webpack.zip
vendored
Normal file
Binary file not shown.
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,2 @@
|
|||||||
node_modules/
|
node_modules/
|
||||||
ling_chair_data/
|
ling_chair_data/
|
||||||
ling_chair_config/
|
|
||||||
|
|||||||
@@ -43,3 +43,12 @@ body {
|
|||||||
margin-top: 60px;
|
margin-top: 60px;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[n-id=pageChatSeesion]::after {
|
||||||
|
content: "";
|
||||||
|
position: sticky;
|
||||||
|
bottom: 0;
|
||||||
|
display: block;
|
||||||
|
height: var(--pseudo-height); /* 设置伪元素的高度 */
|
||||||
|
z-index: -1; /* 防止遮挡实际内容 */
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,9 +28,8 @@
|
|||||||
<meta name="force-rendering" content="webkit" />
|
<meta name="force-rendering" content="webkit" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
||||||
|
|
||||||
<!-- 给老旧的设备提供支持 支持不了, 照样没法运行 -->
|
<!-- Maybe it can run :D -->
|
||||||
<!-- <script src='https://polyfill.io/v3/polyfill.min.js?features=default%2Cdom4%2Ces2015%2Ces2016%2Ces2017%2Ces2018%2Ces2019%2Ces2020%2Ces2021%2Ces2022%2Ces5%2Ces6%2Ces7'></script>
|
<script src='https://polyfill.io/v3/polyfill.min.js?features=default%2Cdom4%2Ces2015%2Ces2016%2Ces2017%2Ces2018%2Ces2019%2Ces2020%2Ces2021%2Ces2022%2Ces5%2Ces6%2Ces7'></script>
|
||||||
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script> -->
|
|
||||||
|
|
||||||
<!-- Styles -->
|
<!-- Styles -->
|
||||||
<link rel="stylesheet" href="https://unpkg.com/mdui@1.0.2/dist/css/mdui.min.css" />
|
<link rel="stylesheet" href="https://unpkg.com/mdui@1.0.2/dist/css/mdui.min.css" />
|
||||||
@@ -38,10 +37,11 @@
|
|||||||
<link rel="stylesheet" href="chat-message.css" />
|
<link rel="stylesheet" href="chat-message.css" />
|
||||||
<link rel="stylesheet" href="mdui-prettier.css" />
|
<link rel="stylesheet" href="mdui-prettier.css" />
|
||||||
|
|
||||||
<!-- 代替私人 fixed 并提供更好的兼容性 -->
|
<!-- Scripts -->
|
||||||
<script src="https://cdn.jsdelivr.net/gh/wilddeer/stickyfill@2.1.0/dist/stickyfill.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/gh/wilddeer/stickyfill@2.1.0/dist/stickyfill.min.js"></script>
|
||||||
<script src="https://unpkg.com/jquery@3.7.1/dist/jquery.min.js"></script>
|
<script src="https://unpkg.com/jquery@3.7.1/dist/jquery.min.js"></script>
|
||||||
<link rel="icon" href="icon.ico" />
|
<script src="https://cdn.jsdelivr.net/npm/clipboard@2.0.11/dist/clipboard.min.js"></script>
|
||||||
|
<link rel="icon" href="res/icon.ico" />
|
||||||
<title>铃之椅</title>
|
<title>铃之椅</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
@@ -49,23 +49,48 @@
|
|||||||
class="mdui-theme-primary-teal mdui-theme-accent-teal mdui-drawer-body-left mdui-appbar-with-toolbar mdui-theme-layout-auto"
|
class="mdui-theme-primary-teal mdui-theme-accent-teal mdui-drawer-body-left mdui-appbar-with-toolbar mdui-theme-layout-auto"
|
||||||
id="app">
|
id="app">
|
||||||
|
|
||||||
<input n-id="textCopier" class="mdui-hidden" />
|
<input n-id="textCopierBtn" class="mdui-hidden" />
|
||||||
|
|
||||||
<div id="lingchair-app" style="height: 100%;">
|
<div id="lingchair-app" style="height: 100%;">
|
||||||
<!-- 侧滑栏 -->
|
<!-- 侧滑栏 -->
|
||||||
<div class="mdui-drawer" id="main-drawer">
|
<div class="mdui-drawer" id="main-drawer">
|
||||||
<ul class="mdui-list">
|
<ul class="mdui-list" mdui-collapse="{accordion: true}">
|
||||||
<li class="mdui-list-item mdui-ripple">
|
<li class="mdui-list-item mdui-ripple">
|
||||||
<div class="mdui-list-item-avatar">
|
<div class="mdui-list-item-avatar">
|
||||||
<img src="default_head.png" n-id="userHead" onerror="this.src='default_head.png'" />
|
<img src="default_head.png" n-id="userHead" onerror="this.src='res/default_head.png'" />
|
||||||
</div>
|
</div>
|
||||||
<div class="mdui-list-item-content"><a n-id="helloText">早安</a>, <a n-id="userNick">Unknown</a></div>
|
<div class="mdui-list-item-content"><a n-id="helloText">早安</a>, <a n-id="userNick">Unknown</a></div>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="mdui-list-item mdui-ripple" onclick="new mdui.Dialog(viewBinding.dialogSettings.get(0)).open()">
|
||||||
|
<i class="mdui-list-item-icon mdui-icon material-icons">settings</i>
|
||||||
|
<div class="mdui-list-item-content">设置</div>
|
||||||
|
</li>
|
||||||
|
<li class="mdui-list-item mdui-ripple" n-id="drawerSignOut">
|
||||||
|
<i class="mdui-list-item-icon mdui-icon material-icons">exit_to_app</i>
|
||||||
|
<div class="mdui-list-item-content">登出</div>
|
||||||
|
</li>
|
||||||
|
<div class="mdui-subheader">聊天</div>
|
||||||
|
<li class="mdui-collapse-item">
|
||||||
|
<div class="mdui-collapse-item-header mdui-list-item mdui-ripple"><i class="mdui-list-item-icon mdui-icon material-icons">contacts</i>
|
||||||
|
<div class="mdui-list-item-content">联系人</div><i
|
||||||
|
class="mdui-collapse-item-arrow mdui-icon material-icons">keyboard_arrow_down</i>
|
||||||
|
</div>
|
||||||
|
<div class="mdui-collapse-item-body mdui-list" n-id="contactsList">
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<ul class="mdui-list mdui-hidden">
|
||||||
|
|
||||||
<li class="mdui-subheader">个人</li>
|
<li class="mdui-subheader">个人</li>
|
||||||
<li class="mdui-list-item mdui-ripple" onclick="new mdui.Dialog(viewBinding.dialogMyProfile.get(0)).open()">
|
<li class="mdui-list-item mdui-ripple" onclick="new mdui.Dialog(viewBinding.dialogMyProfile.get(0)).open()">
|
||||||
<i class="mdui-list-item-icon mdui-icon material-icons">account_circle</i>
|
<i class="mdui-list-item-icon mdui-icon material-icons">account_circle</i>
|
||||||
<div class="mdui-list-item-content">资料</div>
|
<div class="mdui-list-item-content">资料</div>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="mdui-list-item mdui-ripple" onclick="new mdui.Dialog(viewBinding.dialogMyProfile.get(0)).open()">
|
||||||
|
<i class="mdui-list-item-icon mdui-icon material-icons">person_add</i>
|
||||||
|
<div class="mdui-list-item-content">新的好友</div>
|
||||||
|
</li>
|
||||||
<li class="mdui-subheader">客户端</li>
|
<li class="mdui-subheader">客户端</li>
|
||||||
<li class="mdui-list-item mdui-ripple">
|
<li class="mdui-list-item mdui-ripple">
|
||||||
<i class="mdui-list-item-icon mdui-icon material-icons">settings</i>
|
<i class="mdui-list-item-icon mdui-icon material-icons">settings</i>
|
||||||
@@ -75,10 +100,6 @@
|
|||||||
<i class="mdui-list-item-icon mdui-icon material-icons">cloud_circle</i>
|
<i class="mdui-list-item-icon mdui-icon material-icons">cloud_circle</i>
|
||||||
<div class="mdui-list-item-content">更换服务器</div>
|
<div class="mdui-list-item-content">更换服务器</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="mdui-list-item mdui-ripple" n-id="drawerSignOut">
|
|
||||||
<i class="mdui-list-item-icon mdui-icon material-icons">exit_to_app</i>
|
|
||||||
<div class="mdui-list-item-content">退出登录</div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -91,10 +112,13 @@
|
|||||||
</a>
|
</a>
|
||||||
<a class="mdui-typo-title" n-id="appTitle"></a>
|
<a class="mdui-typo-title" n-id="appTitle"></a>
|
||||||
<div class="mdui-toolbar-spacer"></div>
|
<div class="mdui-toolbar-spacer"></div>
|
||||||
<a onclick="ContactsList.reloadList()" n-id="contactsRefresh" class="mdui-btn mdui-btn-icon mdui-ripple">
|
<a onclick="refreshAll()" n-id="contactsRefresh" class="mdui-btn mdui-btn-icon mdui-ripple">
|
||||||
<i class="mdui-icon material-icons">refresh</i>
|
<i class="mdui-icon material-icons">refresh</i>
|
||||||
</a>
|
</a>
|
||||||
<a class="mdui-btn mdui-btn-icon mdui-ripple" n-id="switchNotifications" mdui-tooltip="{content:'开/关通知'}">
|
<a onclick="ContactsList.openAddDialog()" n-id="contactsAdd" class="mdui-btn mdui-btn-icon mdui-ripple">
|
||||||
|
<i class="mdui-icon material-icons">add</i>
|
||||||
|
</a>
|
||||||
|
<a class="mdui-btn mdui-btn-icon mdui-ripple" n-id="switchNotifications">
|
||||||
<i class="mdui-icon material-icons" n-id="switchNotificationsIcon">notifications_off</i>
|
<i class="mdui-icon material-icons" n-id="switchNotificationsIcon">notifications_off</i>
|
||||||
</a>
|
</a>
|
||||||
<a mdui-menu="{target: '#appbar-menu'}" class="mdui-btn mdui-btn-icon mdui-ripple">
|
<a mdui-menu="{target: '#appbar-menu'}" class="mdui-btn mdui-btn-icon mdui-ripple">
|
||||||
@@ -110,38 +134,26 @@
|
|||||||
|
|
||||||
<!-- Tab 栏 -->
|
<!-- Tab 栏 -->
|
||||||
<div class="mdui-tab mdui-accent-theme mdui-theme-color-auto" style="position: fixed; z-index: 114;width: 100%;"
|
<div class="mdui-tab mdui-accent-theme mdui-theme-color-auto" style="position: fixed; z-index: 114;width: 100%;"
|
||||||
mdui-tab>
|
mdui-tab n-id="chatTab">
|
||||||
<!-- 侧滑栏的 z-index 是2000, 在移动端会直接覆盖 -->
|
<!-- 侧滑栏的 z-index 是2000, 在移动端会直接覆盖 -->
|
||||||
<a href="#page-chat-list" n-id="tabChatList" class="mdui-ripple">常用</a>
|
|
||||||
<a href="#page-contacts" n-id="tabContacts" class="mdui-ripple">通讯录</a>
|
|
||||||
<a href="#page-chat-seesion" n-id="tabChatSeesion" class="mdui-ripple" style="text-transform: none;"></a>
|
<a href="#page-chat-seesion" n-id="tabChatSeesion" class="mdui-ripple" style="text-transform: none;"></a>
|
||||||
</div>
|
</div>
|
||||||
<div id="page-chat-list" class="mdui-p-a-2 container">
|
|
||||||
<div class="mdui-valign content" style="margin-top: 40px;">
|
|
||||||
<span class="mdui-center">欢迎回来! (^▽^。)</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="page-contacts" class="mdui-p-a-2">
|
|
||||||
<ul class="mdui-list" style="margin-top: 30px;">
|
|
||||||
<li class="mdui-subheader">好友</li>
|
|
||||||
<div n-id="contactsList">
|
|
||||||
</div>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<!-- 滚动到底部咋这么难写... -->
|
<!-- 滚动到底部咋这么难写... -->
|
||||||
<div id="page-chat-seesion" class="mdui-p-a-2" style="display: flex;flex-direction: column;">
|
<div style="display: flex;flex-direction: column;">
|
||||||
<!-- 写时间居中写到吐了 这样式表不能要了 -->
|
<!-- 写时间居中写到吐了 这样式表不能要了 -->
|
||||||
<div
|
<div
|
||||||
style="margin-top: 30px;overflow: auto;width: 100%;max-width: 100%;height: 100%;max-height: 100%;min-height: 0;margin-bottom: 40px;flex: 1 1 auto;display: flex;flex-direction: column;">
|
style="margin-top: 50px;overflow: auto;width: 100%;max-width: 100%;height: 100%;max-height: 100%;min-height: 0;flex: 1 1 auto;display: flex;flex-direction: column;"
|
||||||
|
n-id="chatPager">
|
||||||
<div class="mdui-center" style="margin: 15px;"><a href="javascript:;" onclick="ChatMsgAdapter.loadMore()"
|
<div class="mdui-center" style="margin: 15px;"><a href="javascript:;" onclick="ChatMsgAdapter.loadMore()"
|
||||||
class="mdui-text-color-theme">点我</a>继续加载前面的聊天记录, 或者<a href="javascript:;"
|
class="mdui-text-color-theme">加载更多</a> | <a href="javascript:;"
|
||||||
onclick="ChatMsgAdapter.scrollToBottom()" class="mdui-text-color-theme">回到底部</a></div>
|
onclick="ChatMsgAdapter.scrollToBottom()" class="mdui-text-color-theme">回到底部</a></div>
|
||||||
<div n-id="pageChatSeesion" style="flex: 1 1 auto;display: flex;flex-direction: column;"></div>
|
<div n-id="pageChatSeesion" style="flex: 1 1 auto;display: flex;flex-direction: column;position: relative;">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 妈的黑化了 私人玩意这么难整 早知道 z-index 弄死它得了 浪费我时间 我就没试过这么离谱的样式表 第三方库真难写CSS 就应该先写后端的 啊啊啊啊啊啊 -->
|
<!-- 妈的黑化了 私人玩意这么难整 早知道 z-index 弄死它得了 浪费我时间 我就没试过这么离谱的样式表 第三方库真难写CSS 就应该先写后端的 啊啊啊啊啊啊 -->
|
||||||
<!-- 不黑化了 因为 stickyfill -->
|
<!-- 不黑化了 因为 stickyfill -->
|
||||||
<div class="mdui-toolbar mdui-theme-color-auto"
|
<div class="mdui-toolbar mdui-theme-color-auto"
|
||||||
style="position: sticky;max-width: 100%;margin-bottom: -30px;bottom: 0;z-index: 101;">
|
style="position: sticky;max-width: 100%;margin-bottom: -30px;bottom: 0;z-index: 101;" n-id="inputToolbar">
|
||||||
<ul class="mdui-menu" id="msg-input-more">
|
<ul class="mdui-menu" id="msg-input-more">
|
||||||
<li class="mdui-menu-item">
|
<li class="mdui-menu-item">
|
||||||
<a class="mdui-ripple">插入图片</a>
|
<a class="mdui-ripple">插入图片</a>
|
||||||
@@ -209,29 +221,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 资料编辑对话框 -->
|
|
||||||
<div class="mdui-dialog" n-id="dialogMyProfile">
|
|
||||||
<div class="mdui-dialog-title">
|
|
||||||
资料
|
|
||||||
</div>
|
|
||||||
<div class="mdui-dialog-content" style="margin-left:15px;margin-right:15px;">
|
|
||||||
<ul class="mdui-list">
|
|
||||||
<li class="mdui-list-item mdui-ripple" mdui-dialog-close
|
|
||||||
onclick="(async () => {viewBinding.dialogEditNickNick.val(await NickCache.getNick(localStorage.userName));new mdui.Dialog(viewBinding.dialogEditNick.get(0)).open()})()">
|
|
||||||
<i class="mdui-list-item-icon mdui-icon material-icons">edit</i>
|
|
||||||
<div class="mdui-list-item-content">修改昵称</div>
|
|
||||||
</li>
|
|
||||||
<li class="mdui-list-item mdui-ripple" onclick="User.uploadHeadImage()">
|
|
||||||
<i class="mdui-list-item-icon mdui-icon material-icons">account_circle</i>
|
|
||||||
<div class="mdui-list-item-content">上传头像</div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="mdui-dialog-actions">
|
|
||||||
<button class="mdui-btn mdui-ripple" mdui-dialog-close>关闭</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- 编辑昵称对话框 -->
|
<!-- 编辑昵称对话框 -->
|
||||||
<div class="mdui-dialog" n-id="dialogEditNick">
|
<div class="mdui-dialog" n-id="dialogEditNick">
|
||||||
<div class="mdui-dialog-title">
|
<div class="mdui-dialog-title">
|
||||||
@@ -245,11 +234,73 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="mdui-dialog-actions">
|
<div class="mdui-dialog-actions">
|
||||||
<button class="mdui-btn mdui-ripple" n-id="dialogEditNickClose" mdui-dialog-close
|
<button class="mdui-btn mdui-ripple" n-id="dialogEditNickClose" mdui-dialog-close
|
||||||
onclick="new mdui.Dialog(viewBinding.dialogMyProfile.get(0)).open()">关闭</button>
|
onclick="new mdui.Dialog(viewBinding.dialogSettings.get(0)).open()">关闭</button>
|
||||||
<button class="mdui-btn mdui-ripple"
|
<button class="mdui-btn mdui-ripple"
|
||||||
onclick="User.setNick(viewBinding.dialogEditNickNick.val(), () => {mdui.snackbar('已保存, 刷新页面生效');viewBinding.dialogEditNickClose.click()})">保存</button>
|
onclick="User.setNick(viewBinding.dialogEditNickNick.val(), () => {mdui.snackbar('已保存, 刷新页面生效');viewBinding.dialogEditNickClose.click()})">保存</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- 懂得都懂 -->
|
||||||
|
<div class="mdui-dialog" n-id="dialogNewFriendRequest">
|
||||||
|
<div class="mdui-dialog-title">
|
||||||
|
新的好友请求
|
||||||
|
</div>
|
||||||
|
<div class="mdui-dialog-content" style="margin-left:15px;margin-right:15px;">
|
||||||
|
<div class="mdui-textfield">
|
||||||
|
<label class="mdui-textfield-label">昵称</label>
|
||||||
|
<input n-id="" class="mdui-textfield-input" maxlength="30" type="text" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mdui-dialog-actions">
|
||||||
|
<button class="mdui-btn mdui-ripple" mdui-dialog-close>关闭</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 懂得都懂 -->
|
||||||
|
<div class="mdui-dialog" n-id="dialogNewContact">
|
||||||
|
<div class="mdui-dialog-title">
|
||||||
|
添加好友/群
|
||||||
|
</div>
|
||||||
|
<div class="mdui-dialog-content" style="margin-left:15px;margin-right:15px;">
|
||||||
|
<div class="mdui-textfield">
|
||||||
|
<label class="mdui-textfield-label">账号/群的ID (不是名称)</label>
|
||||||
|
<input n-id="dialogNewContactID" class="mdui-textfield-input" maxlength="30" type="text" />
|
||||||
|
</div>
|
||||||
|
<select class="mdui-select" mdui-select="{position: 'top'}" n-id="dialogNewContactType">
|
||||||
|
<option value="single">好友</option>
|
||||||
|
<option value="group">群聊</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="mdui-dialog-actions">
|
||||||
|
<button class="mdui-btn mdui-ripple" mdui-dialog-close
|
||||||
|
onclick="ContactsList.add(viewBinding.dialogNewContactID.val(), viewBinding.dialogNewContactType.val())">确认并关闭</button>
|
||||||
|
<button class="mdui-btn mdui-ripple" mdui-dialog-close>取消</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 懂得都懂 -->
|
||||||
|
<div class="mdui-dialog" n-id="dialogSettings">
|
||||||
|
<div class="mdui-dialog-title">
|
||||||
|
设置
|
||||||
|
</div>
|
||||||
|
<div class="mdui-dialog-content">
|
||||||
|
<ul class="mdui-list">
|
||||||
|
<div class="mdui-subheader">我的资料</div>
|
||||||
|
<li class="mdui-list-item mdui-ripple" mdui-dialog-close
|
||||||
|
onclick="(async () => {viewBinding.dialogEditNickNick.val(await NickCache.getNick(localStorage.userName));new mdui.Dialog(viewBinding.dialogEditNick.get(0)).open()})()">
|
||||||
|
<i class="mdui-list-item-icon mdui-icon material-icons">edit</i>
|
||||||
|
<div class="mdui-list-item-content">修改昵称</div>
|
||||||
|
</li>
|
||||||
|
<li class="mdui-list-item mdui-ripple" onclick="User.uploadHeadImage()">
|
||||||
|
<i class="mdui-list-item-icon mdui-icon material-icons">account_circle</i>
|
||||||
|
<div class="mdui-list-item-content">上传头像</div>
|
||||||
|
</li>
|
||||||
|
<div class="mdui-subheader">客户端</div>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="mdui-dialog-actions">
|
||||||
|
<button class="mdui-btn mdui-ripple" mdui-dialog-close>关闭</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mdui-hidden">
|
<div class="mdui-hidden">
|
||||||
@@ -261,11 +312,6 @@
|
|||||||
<script src="https://unpkg.com/crypto-js@4.2.0/crypto-js.js"></script>
|
<script src="https://unpkg.com/crypto-js@4.2.0/crypto-js.js"></script>
|
||||||
<script src="https://unpkg.com/socket.io-client@4.7.4/dist/socket.io.min.js"></script>
|
<script src="https://unpkg.com/socket.io-client@4.7.4/dist/socket.io.min.js"></script>
|
||||||
<script src="https://unpkg.com/mdui@1.0.2/dist/js/mdui.min.js"></script>
|
<script src="https://unpkg.com/mdui@1.0.2/dist/js/mdui.min.js"></script>
|
||||||
<!-- 加了babel也许能解决下浏览器兼容问题 -->
|
|
||||||
<!-- <script type="module" src="index.js"></script>
|
|
||||||
<script nomodule type="text/babel" src="index.js"></script> -->
|
|
||||||
|
|
||||||
<!-- 就算弄语法兼容其他老旧设备照样用不了, 比如我的 iPad4 -->
|
|
||||||
<script src="index.js"></script>
|
<script src="index.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|||||||
@@ -19,8 +19,15 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
const sleep = (t) => new Promise((res) => setTimeout(res, t))
|
||||||
|
|
||||||
const UrlArgs = new URL(location.href).searchParams
|
const UrlArgs = new URL(location.href).searchParams
|
||||||
|
|
||||||
|
// https://www.ruanyifeng.com/blog/2021/09/detecting-mobile-browser.html
|
||||||
|
function isMobile() {
|
||||||
|
return ('ontouchstart' in document.documentElement);
|
||||||
|
}
|
||||||
|
|
||||||
function setOnRightClick(e, cb) {
|
function setOnRightClick(e, cb) {
|
||||||
if (!(e instanceof jQuery))
|
if (!(e instanceof jQuery))
|
||||||
e = $(e)
|
e = $(e)
|
||||||
@@ -112,7 +119,7 @@ class NData {
|
|||||||
let viewBinding = NData.mount($("#app").get(0))
|
let viewBinding = NData.mount($("#app").get(0))
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: "config.json",
|
url: "res/config.json",
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
success: (c) => {
|
success: (c) => {
|
||||||
viewBinding.appTitle.text(c.appTitle)
|
viewBinding.appTitle.text(c.appTitle)
|
||||||
@@ -123,22 +130,26 @@ $.ajax({
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
// Toolbar 快捷按钮绑定
|
/* // Toolbar 快捷按钮绑定
|
||||||
viewBinding.contactsRefresh.hide()
|
viewBinding.contactsRefresh.hide()
|
||||||
|
viewBinding.contactsAdd.hide()
|
||||||
viewBinding.tabChatList.on("show.mdui.tab", () => {
|
viewBinding.tabChatList.on("show.mdui.tab", () => {
|
||||||
viewBinding.contactsRefresh.hide()
|
viewBinding.contactsRefresh.hide()
|
||||||
|
viewBinding.contactsAdd.hide()
|
||||||
})
|
})
|
||||||
viewBinding.tabContacts.on("show.mdui.tab", () => {
|
viewBinding.tabContacts.on("show.mdui.tab", () => {
|
||||||
viewBinding.contactsRefresh.show()
|
viewBinding.contactsRefresh.show()
|
||||||
|
viewBinding.contactsAdd.show()
|
||||||
})
|
})
|
||||||
viewBinding.tabChatSeesion.on("show.mdui.tab", () => {
|
viewBinding.tabChatSeesion.on("show.mdui.tab", () => {
|
||||||
viewBinding.contactsRefresh.hide()
|
viewBinding.contactsRefresh.hide()
|
||||||
})
|
viewBinding.contactsAdd.hide()
|
||||||
|
}) */
|
||||||
|
|
||||||
viewBinding.tabChatSeesion.hide()
|
/* viewBinding.tabChatSeesion.hide() */
|
||||||
|
|
||||||
// 关于页面
|
// 关于页面
|
||||||
viewBinding.menuAbout.click(() => mdui.alert('GitHub: MoonLeeeaf<br/><br/>欢迎各位大佬访问我们的<a class="mdui-text-color-theme-accent" href="https://github.com/LingChair/LingChair">项目主页</a>', '关于 铃之椅', () => { }, { confirmText: "关闭" }))
|
viewBinding.menuAbout.click(() => mdui.alert('这是一个开源项目<br/>作者: MoonLeeeaf<br/>欢迎访问我们的<a class="mdui-text-color-theme-accent" href="https://github.com/LingChair/LingChair">项目主页</a>', '关于 铃之椅', () => { }, { confirmText: "关闭" }))
|
||||||
|
|
||||||
viewBinding.drawerChangeServer.click(() => {
|
viewBinding.drawerChangeServer.click(() => {
|
||||||
mdui.prompt('输入服务器地址...(为空则使用当前页面地址)', (value) => {
|
mdui.prompt('输入服务器地址...(为空则使用当前页面地址)', (value) => {
|
||||||
@@ -189,11 +200,12 @@ if (localStorage.useNotifications == "true")
|
|||||||
|
|
||||||
// https://www.runoob.com/w3cnote/javascript-copy-clipboard.html
|
// https://www.runoob.com/w3cnote/javascript-copy-clipboard.html
|
||||||
function copyText(t) {
|
function copyText(t) {
|
||||||
let cp = viewBinding.textCopier.get(0)
|
let btn = viewBinding.textCopierBtn
|
||||||
cp.value = t
|
btn.attr("data-clipboard-text", t)
|
||||||
cp.select()
|
new ClipboardJS(btn.get(0)).on('success', (e) => {
|
||||||
cp.setSelectionRange(0, 99999)
|
e.clearSelection()
|
||||||
navigator.clipboard.writeText(cp.value)
|
})
|
||||||
|
btn.click()
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://zhuanlan.zhihu.com/p/162910462
|
// https://zhuanlan.zhihu.com/p/162910462
|
||||||
@@ -310,7 +322,7 @@ class ContactsList {
|
|||||||
/*client.emit("user.getNick", { name: localStorage.userName }, (re) => {
|
/*client.emit("user.getNick", { name: localStorage.userName }, (re) => {
|
||||||
let nick = re.data == null ? re.data.nick : null
|
let nick = re.data == null ? re.data.nick : null
|
||||||
let name = ls[index]*/
|
let name = ls[index]*/
|
||||||
$($.parseHTML(`<li class="mdui-list-item mdui-ripple"><div class="mdui-list-item-avatar"><img src="` + User.getUserHeadUrl(name) + `" onerror="this.src='default_head.png'" /></div><div class="mdui-list-item-content">` + dick + `</div></li>`)).appendTo(viewBinding.contactsList).click(() => {
|
$($.parseHTML(`<li class="mdui-list-item mdui-ripple" mdui-drawer-close><div class="mdui-list-item-avatar"><img src="` + User.getUserHeadUrl(name) + `" onerror="this.src='res/default_head.png'" /></div><div class="mdui-list-item-content">` + dick + `</div></li>`)).appendTo(viewBinding.contactsList).click(() => {
|
||||||
ChatMsgAdapter.switchTo(name, "single")
|
ChatMsgAdapter.switchTo(name, "single")
|
||||||
})
|
})
|
||||||
//})
|
//})
|
||||||
@@ -318,10 +330,32 @@ class ContactsList {
|
|||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
// 添加联系人,好友或者群聊
|
||||||
|
static add(name, type) {
|
||||||
|
if (type == "single") {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static openAddDialog() {
|
||||||
|
new mdui.Dialog(viewBinding.dialogNewContact.get(0)).open()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 第一次写前端的消息加载, 代码很乱, 还请原谅~
|
// 第一次写前端的消息加载, 代码很乱, 还请原谅~
|
||||||
|
|
||||||
|
// v0.7.0 大改UI 畏惧了 太庞大了
|
||||||
|
|
||||||
|
class ChatPage {
|
||||||
|
static cached = {}
|
||||||
|
constructor(name, type) {
|
||||||
|
|
||||||
|
}
|
||||||
|
static switchTo(name, type) {
|
||||||
|
if (!this.cached[name])
|
||||||
|
this.cached[name] = new ChatPage(name, type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class ChatMsgAdapter {
|
class ChatMsgAdapter {
|
||||||
static type
|
static type
|
||||||
static target
|
static target
|
||||||
@@ -329,6 +363,7 @@ class ChatMsgAdapter {
|
|||||||
static minMsgId
|
static minMsgId
|
||||||
static time
|
static time
|
||||||
static bbn
|
static bbn
|
||||||
|
static resizeDick
|
||||||
// 切换聊天对象
|
// 切换聊天对象
|
||||||
static async switchTo(name, type) {
|
static async switchTo(name, type) {
|
||||||
viewBinding.tabChatSeesion.show()
|
viewBinding.tabChatSeesion.show()
|
||||||
@@ -361,7 +396,7 @@ class ChatMsgAdapter {
|
|||||||
// 微机课闲的没事干玩玩 发现私聊会多发一个(一个是本地的, 另一个是发送成功的) 选择一个关掉就好了
|
// 微机课闲的没事干玩玩 发现私聊会多发一个(一个是本地的, 另一个是发送成功的) 选择一个关掉就好了
|
||||||
// 这里我选择服务端不发送回调, 不然多设备同步会吵死
|
// 这里我选择服务端不发送回调, 不然多设备同步会吵死
|
||||||
// 错了 应该是客户端少发条才对 不然不能多设备同步
|
// 错了 应该是客户端少发条才对 不然不能多设备同步
|
||||||
if (ChatMsgAdapter.target !== localStorage.userName && ChatMsgAdapter.type === "single") {
|
if ((ChatMsgAdapter.target !== localStorage.userName) && ChatMsgAdapter.type === "single") {
|
||||||
let i = ChatMsgAdapter.isAtBottom()
|
let i = ChatMsgAdapter.isAtBottom()
|
||||||
await ChatMsgAdapter.addMsg(localStorage.userName, msg, re.data.time, re.data.msgid)
|
await ChatMsgAdapter.addMsg(localStorage.userName, msg, re.data.time, re.data.msgid)
|
||||||
if (i) ChatMsgAdapter.scrollToBottom()
|
if (i) ChatMsgAdapter.scrollToBottom()
|
||||||
@@ -407,8 +442,10 @@ class ChatMsgAdapter {
|
|||||||
static addSystemMsg(m, re) {
|
static addSystemMsg(m, re) {
|
||||||
let e
|
let e
|
||||||
if (re)
|
if (re)
|
||||||
|
// 加到头部
|
||||||
e = $($.parseHTML(m)).prependTo(viewBinding.pageChatSeesion)
|
e = $($.parseHTML(m)).prependTo(viewBinding.pageChatSeesion)
|
||||||
else
|
else
|
||||||
|
// 加到尾部
|
||||||
e = $($.parseHTML(m)).appendTo(viewBinding.pageChatSeesion)
|
e = $($.parseHTML(m)).appendTo(viewBinding.pageChatSeesion)
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
@@ -416,7 +453,8 @@ class ChatMsgAdapter {
|
|||||||
let elementRect = viewBinding.pageChatSeesion.get(0).getBoundingClientRect()
|
let elementRect = viewBinding.pageChatSeesion.get(0).getBoundingClientRect()
|
||||||
return (elementRect.bottom <= window.innerHeight)
|
return (elementRect.bottom <= window.innerHeight)
|
||||||
}
|
}
|
||||||
// 不会压栈 只添加消息 返回消息的JQ对象
|
// 添加消息 返回消息的JQ对象
|
||||||
|
// name: 用户id m: 消息 t: 时间戳 re: 默认加到尾部 msgid: 消息id
|
||||||
static async addMsg(name, m, t, re, msgid) {
|
static async addMsg(name, m, t, re, msgid) {
|
||||||
|
|
||||||
let nick = await NickCache.getNick(name) // re.data == null ? name : re.data.nick
|
let nick = await NickCache.getNick(name) // re.data == null ? name : re.data.nick
|
||||||
@@ -432,11 +470,11 @@ class ChatMsgAdapter {
|
|||||||
<span id="msg-content">` + msg + `</span>
|
<span id="msg-content">` + msg + `</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<img class="avatar" src="` + User.getUserHeadUrl(name) + `" onerror="this.src='default_head.png'" />
|
<img class="avatar" src="` + User.getUserHeadUrl(name) + `" onerror="this.src='res/default_head.png'" />
|
||||||
</div>`
|
</div>`
|
||||||
else
|
else
|
||||||
temp = `<div class="chat-message-left">
|
temp = `<div class="chat-message-left">
|
||||||
<img class="avatar" src="` + User.getUserHeadUrl(name) + `" onerror="this.src='default_head.png'" />
|
<img class="avatar" src="` + User.getUserHeadUrl(name) + `" onerror="this.src='res/default_head.png'" />
|
||||||
<div class="message-content-with-nickname-left">
|
<div class="message-content-with-nickname-left">
|
||||||
<span class="nickname">` + nick + `</span>
|
<span class="nickname">` + nick + `</span>
|
||||||
<div class="message-content mdui-card" id="msgid_` + msgid + `">
|
<div class="message-content mdui-card" id="msgid_` + msgid + `">
|
||||||
@@ -488,10 +526,10 @@ class ChatMsgAdapter {
|
|||||||
} */
|
} */
|
||||||
static scrollToBottom() {
|
static scrollToBottom() {
|
||||||
// 吐了啊 原来这样就行了 我何必在子element去整啊
|
// 吐了啊 原来这样就行了 我何必在子element去整啊
|
||||||
window.scrollBy({
|
viewBinding.chatPager.get(0).scrollBy({
|
||||||
top: 1145141919810,
|
top: 1145141919810,
|
||||||
behavior: 'smooth'
|
behavior: 'smooth'
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
// 从本地加载
|
// 从本地加载
|
||||||
/*static loadMsgsFromLocal(target) {
|
/*static loadMsgsFromLocal(target) {
|
||||||
@@ -505,6 +543,26 @@ class ChatMsgAdapter {
|
|||||||
static saveToLocal() {
|
static saveToLocal() {
|
||||||
localStorage["chat_msg_" + this.target] = JSON.stringify(this.msgList)
|
localStorage["chat_msg_" + this.target] = JSON.stringify(this.msgList)
|
||||||
}*/
|
}*/
|
||||||
|
// 自动调整使输入框置底 CSS真tm靠不住啊
|
||||||
|
static initInputResizer() {
|
||||||
|
// 实验表面移动端切出输入法时会触发1-2次resize事件
|
||||||
|
// 可以利用这个特性来实现自动滚动文本
|
||||||
|
let resize = () => {
|
||||||
|
viewBinding.pageChatSeesion.height(window.innerHeight - viewBinding.inputToolbar.height() - $("header.mdui-appbar").height() - viewBinding.chatTab.height() - 50)
|
||||||
|
let ledi = this.resizeDick - window.innerHeight
|
||||||
|
if (isMobile()) viewBinding.chatPager.get(0).scrollBy({
|
||||||
|
// 5.19晚10:56分调配出来的秘方
|
||||||
|
// < 0 为窗口变大
|
||||||
|
// cnm的,调试十万次就你tm检测不到底是吧,就你语法天天错误是吧
|
||||||
|
// 欺负我现在用不了电脑
|
||||||
|
top: -(ledi) * ((ledi < 0 && this.isAtBottom()) ? 6 : -1), // (ledi < 0 ? 6 : 6),
|
||||||
|
behavior: 'smooth'
|
||||||
|
})
|
||||||
|
this.resizeDick = window.innerHeight
|
||||||
|
}
|
||||||
|
window.addEventListener("resize", resize)
|
||||||
|
resize()
|
||||||
|
}
|
||||||
// 为消息设置长按/右键事件
|
// 为消息设置长按/右键事件
|
||||||
static initMsgElementEvents() {
|
static initMsgElementEvents() {
|
||||||
let listeners = {}
|
let listeners = {}
|
||||||
@@ -546,11 +604,13 @@ class ChatMsgAdapter {
|
|||||||
callback(self)
|
callback(self)
|
||||||
break
|
break
|
||||||
case 'mousedown':
|
case 'mousedown':
|
||||||
|
if (!isMobile()) return
|
||||||
listeners[self + ""] = setTimeout(() => {
|
listeners[self + ""] = setTimeout(() => {
|
||||||
callback(self)
|
callback(self)
|
||||||
}, 300) // 300颗够吗 应该够吧
|
}, 300) // 300颗够吗 应该够吧
|
||||||
break
|
break
|
||||||
case 'mouseup':
|
case 'mouseup':
|
||||||
|
if (!isMobile()) return
|
||||||
clearTimeout(listeners[self + ""])
|
clearTimeout(listeners[self + ""])
|
||||||
listeners[self + ""] = null
|
listeners[self + ""] = null
|
||||||
break
|
break
|
||||||
@@ -671,11 +731,13 @@ class User {
|
|||||||
if (i) ChatMsgAdapter.scrollToBottom()
|
if (i) ChatMsgAdapter.scrollToBottom()
|
||||||
}
|
}
|
||||||
|
|
||||||
let n = new 通知().setTitle("新消息 - " + await NickCache.getNick(a.target)).setMessage(a.msg.msg).setIcon(User.getUserHeadUrl(a.target)).show(async () => {
|
if (ChatMsgAdapter.target !== localStorage.userName) {
|
||||||
await ChatMsgAdapter.switchTo(a.target, a.type)
|
let n = new 通知().setTitle("" + await NickCache.getNick(a.target)).setMessage(a.msg.msg).setIcon(User.getUserHeadUrl(a.target)).show(async () => {
|
||||||
location.replace("#msgid_" + a.msg.msgid)
|
await ChatMsgAdapter.switchTo(a.target, a.type)
|
||||||
n.close()
|
location.replace("#msgid_" + a.msg.msgid)
|
||||||
})
|
n.close()
|
||||||
|
})
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
static async openProfileDialog(name) {
|
static async openProfileDialog(name) {
|
||||||
@@ -716,7 +778,7 @@ else
|
|||||||
// 登录到账号
|
// 登录到账号
|
||||||
let dialogSignIn
|
let dialogSignIn
|
||||||
// 谨防 localStorage 字符串数据大坑
|
// 谨防 localStorage 字符串数据大坑
|
||||||
if (localStorage.isSignIn === "false")
|
if (localStorage.isSignIn == "false")
|
||||||
dialogSignIn = new mdui.Dialog(viewBinding.dialogSignIn.get(0), {
|
dialogSignIn = new mdui.Dialog(viewBinding.dialogSignIn.get(0), {
|
||||||
modal: true,
|
modal: true,
|
||||||
closeOnEsc: false,
|
closeOnEsc: false,
|
||||||
@@ -744,3 +806,11 @@ else {
|
|||||||
Stickyfill.add($("*").filter((a, b) => $(b).css('position') === 'sticky'))
|
Stickyfill.add($("*").filter((a, b) => $(b).css('position') === 'sticky'))
|
||||||
|
|
||||||
ChatMsgAdapter.initMsgElementEvents()
|
ChatMsgAdapter.initMsgElementEvents()
|
||||||
|
|
||||||
|
ChatMsgAdapter.initInputResizer()
|
||||||
|
|
||||||
|
function refreshAll() {
|
||||||
|
ContactsList.reloadList()
|
||||||
|
delete NickCache.data
|
||||||
|
NickCache.data = {}
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,9 +12,6 @@ body {
|
|||||||
.mdui-dialog {
|
.mdui-dialog {
|
||||||
border-radius: 23px;
|
border-radius: 23px;
|
||||||
}
|
}
|
||||||
.mdui-snackbar {
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
.mdui-menu {
|
.mdui-menu {
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
}
|
}
|
||||||
@@ -34,6 +31,14 @@ body {
|
|||||||
height: 40px;
|
height: 40px;
|
||||||
border-radius: 40px;
|
border-radius: 40px;
|
||||||
}
|
}
|
||||||
|
.mdui-select-open {
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
@media screen and (min-width: 768px) {
|
||||||
|
.mdui-snackbar {
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* 配色方案 */
|
/* 配色方案 */
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
242
package-lock.json
generated
242
package-lock.json
generated
@@ -1,17 +1,20 @@
|
|||||||
{
|
{
|
||||||
"name": "LingChair-Node.js",
|
"name": "lingchair",
|
||||||
|
"version": "0.7.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
|
"name": "lingchair",
|
||||||
|
"version": "0.7.0",
|
||||||
|
"license": "Apache License 2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"express": "^4.19.2",
|
"express": "^4.19.2",
|
||||||
"mime": "^4.0.1",
|
|
||||||
"socket.io": "^4.7.5"
|
"socket.io": "^4.7.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@socket.io/component-emitter": {
|
"node_modules/@socket.io/component-emitter": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.2",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/cookie": {
|
"node_modules/@types/cookie": {
|
||||||
@@ -26,7 +29,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "20.12.5",
|
"version": "20.12.12",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"undici-types": "~5.26.4"
|
"undici-types": "~5.26.4"
|
||||||
@@ -45,8 +48,7 @@
|
|||||||
},
|
},
|
||||||
"node_modules/array-flatten": {
|
"node_modules/array-flatten": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
"license": "MIT"
|
||||||
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
|
|
||||||
},
|
},
|
||||||
"node_modules/base64id": {
|
"node_modules/base64id": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
@@ -57,8 +59,7 @@
|
|||||||
},
|
},
|
||||||
"node_modules/body-parser": {
|
"node_modules/body-parser": {
|
||||||
"version": "1.20.2",
|
"version": "1.20.2",
|
||||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bytes": "3.1.2",
|
"bytes": "3.1.2",
|
||||||
"content-type": "~1.0.5",
|
"content-type": "~1.0.5",
|
||||||
@@ -80,29 +81,25 @@
|
|||||||
},
|
},
|
||||||
"node_modules/body-parser/node_modules/debug": {
|
"node_modules/body-parser/node_modules/debug": {
|
||||||
"version": "2.6.9",
|
"version": "2.6.9",
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ms": "2.0.0"
|
"ms": "2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/body-parser/node_modules/ms": {
|
"node_modules/body-parser/node_modules/ms": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
"license": "MIT"
|
||||||
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
|
|
||||||
},
|
},
|
||||||
"node_modules/bytes": {
|
"node_modules/bytes": {
|
||||||
"version": "3.1.2",
|
"version": "3.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.8"
|
"node": ">= 0.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/call-bind": {
|
"node_modules/call-bind": {
|
||||||
"version": "1.0.7",
|
"version": "1.0.7",
|
||||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"es-define-property": "^1.0.0",
|
"es-define-property": "^1.0.0",
|
||||||
"es-errors": "^1.3.0",
|
"es-errors": "^1.3.0",
|
||||||
@@ -119,8 +116,7 @@
|
|||||||
},
|
},
|
||||||
"node_modules/content-disposition": {
|
"node_modules/content-disposition": {
|
||||||
"version": "0.5.4",
|
"version": "0.5.4",
|
||||||
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"safe-buffer": "5.2.1"
|
"safe-buffer": "5.2.1"
|
||||||
},
|
},
|
||||||
@@ -130,14 +126,13 @@
|
|||||||
},
|
},
|
||||||
"node_modules/content-type": {
|
"node_modules/content-type": {
|
||||||
"version": "1.0.5",
|
"version": "1.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/cookie": {
|
"node_modules/cookie": {
|
||||||
"version": "0.4.2",
|
"version": "0.6.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
@@ -145,8 +140,7 @@
|
|||||||
},
|
},
|
||||||
"node_modules/cookie-signature": {
|
"node_modules/cookie-signature": {
|
||||||
"version": "1.0.6",
|
"version": "1.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
"license": "MIT"
|
||||||
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
|
|
||||||
},
|
},
|
||||||
"node_modules/cors": {
|
"node_modules/cors": {
|
||||||
"version": "2.8.5",
|
"version": "2.8.5",
|
||||||
@@ -176,8 +170,7 @@
|
|||||||
},
|
},
|
||||||
"node_modules/define-data-property": {
|
"node_modules/define-data-property": {
|
||||||
"version": "1.1.4",
|
"version": "1.1.4",
|
||||||
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"es-define-property": "^1.0.0",
|
"es-define-property": "^1.0.0",
|
||||||
"es-errors": "^1.3.0",
|
"es-errors": "^1.3.0",
|
||||||
@@ -192,16 +185,14 @@
|
|||||||
},
|
},
|
||||||
"node_modules/depd": {
|
"node_modules/depd": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.8"
|
"node": ">= 0.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/destroy": {
|
"node_modules/destroy": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.8",
|
"node": ">= 0.8",
|
||||||
"npm": "1.2.8000 || >= 1.4.16"
|
"npm": "1.2.8000 || >= 1.4.16"
|
||||||
@@ -209,13 +200,11 @@
|
|||||||
},
|
},
|
||||||
"node_modules/ee-first": {
|
"node_modules/ee-first": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
"license": "MIT"
|
||||||
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
|
|
||||||
},
|
},
|
||||||
"node_modules/encodeurl": {
|
"node_modules/encodeurl": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.8"
|
"node": ">= 0.8"
|
||||||
}
|
}
|
||||||
@@ -246,10 +235,16 @@
|
|||||||
"node": ">=10.0.0"
|
"node": ">=10.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/engine.io/node_modules/cookie": {
|
||||||
|
"version": "0.4.2",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/es-define-property": {
|
"node_modules/es-define-property": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"get-intrinsic": "^1.2.4"
|
"get-intrinsic": "^1.2.4"
|
||||||
},
|
},
|
||||||
@@ -259,21 +254,18 @@
|
|||||||
},
|
},
|
||||||
"node_modules/es-errors": {
|
"node_modules/es-errors": {
|
||||||
"version": "1.3.0",
|
"version": "1.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.4"
|
"node": ">= 0.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/escape-html": {
|
"node_modules/escape-html": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
|
"license": "MIT"
|
||||||
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
|
|
||||||
},
|
},
|
||||||
"node_modules/etag": {
|
"node_modules/etag": {
|
||||||
"version": "1.8.1",
|
"version": "1.8.1",
|
||||||
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
}
|
}
|
||||||
@@ -319,31 +311,20 @@
|
|||||||
"node": ">= 0.10.0"
|
"node": ">= 0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/express/node_modules/cookie": {
|
|
||||||
"version": "0.6.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
|
|
||||||
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/express/node_modules/debug": {
|
"node_modules/express/node_modules/debug": {
|
||||||
"version": "2.6.9",
|
"version": "2.6.9",
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ms": "2.0.0"
|
"ms": "2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/express/node_modules/ms": {
|
"node_modules/express/node_modules/ms": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
"license": "MIT"
|
||||||
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
|
|
||||||
},
|
},
|
||||||
"node_modules/finalhandler": {
|
"node_modules/finalhandler": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"debug": "2.6.9",
|
"debug": "2.6.9",
|
||||||
"encodeurl": "~1.0.2",
|
"encodeurl": "~1.0.2",
|
||||||
@@ -359,45 +340,39 @@
|
|||||||
},
|
},
|
||||||
"node_modules/finalhandler/node_modules/debug": {
|
"node_modules/finalhandler/node_modules/debug": {
|
||||||
"version": "2.6.9",
|
"version": "2.6.9",
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ms": "2.0.0"
|
"ms": "2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/finalhandler/node_modules/ms": {
|
"node_modules/finalhandler/node_modules/ms": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
"license": "MIT"
|
||||||
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
|
|
||||||
},
|
},
|
||||||
"node_modules/forwarded": {
|
"node_modules/forwarded": {
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/fresh": {
|
"node_modules/fresh": {
|
||||||
"version": "0.5.2",
|
"version": "0.5.2",
|
||||||
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/function-bind": {
|
"node_modules/function-bind": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
|
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/get-intrinsic": {
|
"node_modules/get-intrinsic": {
|
||||||
"version": "1.2.4",
|
"version": "1.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"es-errors": "^1.3.0",
|
"es-errors": "^1.3.0",
|
||||||
"function-bind": "^1.1.2",
|
"function-bind": "^1.1.2",
|
||||||
@@ -414,8 +389,7 @@
|
|||||||
},
|
},
|
||||||
"node_modules/gopd": {
|
"node_modules/gopd": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"get-intrinsic": "^1.1.3"
|
"get-intrinsic": "^1.1.3"
|
||||||
},
|
},
|
||||||
@@ -425,8 +399,7 @@
|
|||||||
},
|
},
|
||||||
"node_modules/has-property-descriptors": {
|
"node_modules/has-property-descriptors": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"es-define-property": "^1.0.0"
|
"es-define-property": "^1.0.0"
|
||||||
},
|
},
|
||||||
@@ -436,8 +409,7 @@
|
|||||||
},
|
},
|
||||||
"node_modules/has-proto": {
|
"node_modules/has-proto": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.4"
|
"node": ">= 0.4"
|
||||||
},
|
},
|
||||||
@@ -447,8 +419,7 @@
|
|||||||
},
|
},
|
||||||
"node_modules/has-symbols": {
|
"node_modules/has-symbols": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.4"
|
"node": ">= 0.4"
|
||||||
},
|
},
|
||||||
@@ -458,8 +429,7 @@
|
|||||||
},
|
},
|
||||||
"node_modules/hasown": {
|
"node_modules/hasown": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"function-bind": "^1.1.2"
|
"function-bind": "^1.1.2"
|
||||||
},
|
},
|
||||||
@@ -469,8 +439,7 @@
|
|||||||
},
|
},
|
||||||
"node_modules/http-errors": {
|
"node_modules/http-errors": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"depd": "2.0.0",
|
"depd": "2.0.0",
|
||||||
"inherits": "2.0.4",
|
"inherits": "2.0.4",
|
||||||
@@ -484,8 +453,7 @@
|
|||||||
},
|
},
|
||||||
"node_modules/iconv-lite": {
|
"node_modules/iconv-lite": {
|
||||||
"version": "0.4.24",
|
"version": "0.4.24",
|
||||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"safer-buffer": ">= 2.1.2 < 3"
|
"safer-buffer": ">= 2.1.2 < 3"
|
||||||
},
|
},
|
||||||
@@ -495,50 +463,41 @@
|
|||||||
},
|
},
|
||||||
"node_modules/inherits": {
|
"node_modules/inherits": {
|
||||||
"version": "2.0.4",
|
"version": "2.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
"license": "ISC"
|
||||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
|
|
||||||
},
|
},
|
||||||
"node_modules/ipaddr.js": {
|
"node_modules/ipaddr.js": {
|
||||||
"version": "1.9.1",
|
"version": "1.9.1",
|
||||||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.10"
|
"node": ">= 0.10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/media-typer": {
|
"node_modules/media-typer": {
|
||||||
"version": "0.3.0",
|
"version": "0.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/merge-descriptors": {
|
"node_modules/merge-descriptors": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
|
"license": "MIT"
|
||||||
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
|
|
||||||
},
|
},
|
||||||
"node_modules/methods": {
|
"node_modules/methods": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/mime": {
|
"node_modules/mime": {
|
||||||
"version": "4.0.1",
|
"version": "1.6.0",
|
||||||
"resolved": "https://registry.npmjs.org/mime/-/mime-4.0.1.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==",
|
|
||||||
"funding": [
|
|
||||||
"https://github.com/sponsors/broofa"
|
|
||||||
],
|
|
||||||
"bin": {
|
"bin": {
|
||||||
"mime": "bin/cli.js"
|
"mime": "cli.js"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=16"
|
"node": ">=4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/mime-db": {
|
"node_modules/mime-db": {
|
||||||
@@ -578,16 +537,14 @@
|
|||||||
},
|
},
|
||||||
"node_modules/object-inspect": {
|
"node_modules/object-inspect": {
|
||||||
"version": "1.13.1",
|
"version": "1.13.1",
|
||||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
|
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/on-finished": {
|
"node_modules/on-finished": {
|
||||||
"version": "2.4.1",
|
"version": "2.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ee-first": "1.1.1"
|
"ee-first": "1.1.1"
|
||||||
},
|
},
|
||||||
@@ -597,21 +554,18 @@
|
|||||||
},
|
},
|
||||||
"node_modules/parseurl": {
|
"node_modules/parseurl": {
|
||||||
"version": "1.3.3",
|
"version": "1.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.8"
|
"node": ">= 0.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/path-to-regexp": {
|
"node_modules/path-to-regexp": {
|
||||||
"version": "0.1.7",
|
"version": "0.1.7",
|
||||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
"license": "MIT"
|
||||||
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
|
|
||||||
},
|
},
|
||||||
"node_modules/proxy-addr": {
|
"node_modules/proxy-addr": {
|
||||||
"version": "2.0.7",
|
"version": "2.0.7",
|
||||||
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"forwarded": "0.2.0",
|
"forwarded": "0.2.0",
|
||||||
"ipaddr.js": "1.9.1"
|
"ipaddr.js": "1.9.1"
|
||||||
@@ -622,8 +576,7 @@
|
|||||||
},
|
},
|
||||||
"node_modules/qs": {
|
"node_modules/qs": {
|
||||||
"version": "6.11.0",
|
"version": "6.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
|
"license": "BSD-3-Clause",
|
||||||
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"side-channel": "^1.0.4"
|
"side-channel": "^1.0.4"
|
||||||
},
|
},
|
||||||
@@ -636,16 +589,14 @@
|
|||||||
},
|
},
|
||||||
"node_modules/range-parser": {
|
"node_modules/range-parser": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/raw-body": {
|
"node_modules/raw-body": {
|
||||||
"version": "2.5.2",
|
"version": "2.5.2",
|
||||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bytes": "3.1.2",
|
"bytes": "3.1.2",
|
||||||
"http-errors": "2.0.0",
|
"http-errors": "2.0.0",
|
||||||
@@ -658,8 +609,6 @@
|
|||||||
},
|
},
|
||||||
"node_modules/safe-buffer": {
|
"node_modules/safe-buffer": {
|
||||||
"version": "5.2.1",
|
"version": "5.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
|
||||||
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
|
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "github",
|
"type": "github",
|
||||||
@@ -673,17 +622,16 @@
|
|||||||
"type": "consulting",
|
"type": "consulting",
|
||||||
"url": "https://feross.org/support"
|
"url": "https://feross.org/support"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/safer-buffer": {
|
"node_modules/safer-buffer": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
"license": "MIT"
|
||||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
|
||||||
},
|
},
|
||||||
"node_modules/send": {
|
"node_modules/send": {
|
||||||
"version": "0.18.0",
|
"version": "0.18.0",
|
||||||
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"debug": "2.6.9",
|
"debug": "2.6.9",
|
||||||
"depd": "2.0.0",
|
"depd": "2.0.0",
|
||||||
@@ -705,37 +653,22 @@
|
|||||||
},
|
},
|
||||||
"node_modules/send/node_modules/debug": {
|
"node_modules/send/node_modules/debug": {
|
||||||
"version": "2.6.9",
|
"version": "2.6.9",
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ms": "2.0.0"
|
"ms": "2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/send/node_modules/debug/node_modules/ms": {
|
"node_modules/send/node_modules/debug/node_modules/ms": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
"license": "MIT"
|
||||||
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
|
|
||||||
},
|
|
||||||
"node_modules/send/node_modules/mime": {
|
|
||||||
"version": "1.6.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
|
|
||||||
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
|
|
||||||
"bin": {
|
|
||||||
"mime": "cli.js"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=4"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"node_modules/send/node_modules/ms": {
|
"node_modules/send/node_modules/ms": {
|
||||||
"version": "2.1.3",
|
"version": "2.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
"license": "MIT"
|
||||||
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
|
|
||||||
},
|
},
|
||||||
"node_modules/serve-static": {
|
"node_modules/serve-static": {
|
||||||
"version": "1.15.0",
|
"version": "1.15.0",
|
||||||
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"encodeurl": "~1.0.2",
|
"encodeurl": "~1.0.2",
|
||||||
"escape-html": "~1.0.3",
|
"escape-html": "~1.0.3",
|
||||||
@@ -748,8 +681,7 @@
|
|||||||
},
|
},
|
||||||
"node_modules/set-function-length": {
|
"node_modules/set-function-length": {
|
||||||
"version": "1.2.2",
|
"version": "1.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"define-data-property": "^1.1.4",
|
"define-data-property": "^1.1.4",
|
||||||
"es-errors": "^1.3.0",
|
"es-errors": "^1.3.0",
|
||||||
@@ -764,13 +696,11 @@
|
|||||||
},
|
},
|
||||||
"node_modules/setprototypeof": {
|
"node_modules/setprototypeof": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
|
"license": "ISC"
|
||||||
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
|
|
||||||
},
|
},
|
||||||
"node_modules/side-channel": {
|
"node_modules/side-channel": {
|
||||||
"version": "1.0.6",
|
"version": "1.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"call-bind": "^1.0.7",
|
"call-bind": "^1.0.7",
|
||||||
"es-errors": "^1.3.0",
|
"es-errors": "^1.3.0",
|
||||||
@@ -786,7 +716,8 @@
|
|||||||
},
|
},
|
||||||
"node_modules/socket.io": {
|
"node_modules/socket.io": {
|
||||||
"version": "4.7.5",
|
"version": "4.7.5",
|
||||||
"license": "MIT",
|
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz",
|
||||||
|
"integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"accepts": "~1.3.4",
|
"accepts": "~1.3.4",
|
||||||
"base64id": "~2.0.0",
|
"base64id": "~2.0.0",
|
||||||
@@ -821,24 +752,21 @@
|
|||||||
},
|
},
|
||||||
"node_modules/statuses": {
|
"node_modules/statuses": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.8"
|
"node": ">= 0.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/toidentifier": {
|
"node_modules/toidentifier": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.6"
|
"node": ">=0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/type-is": {
|
"node_modules/type-is": {
|
||||||
"version": "1.6.18",
|
"version": "1.6.18",
|
||||||
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"media-typer": "0.3.0",
|
"media-typer": "0.3.0",
|
||||||
"mime-types": "~2.1.24"
|
"mime-types": "~2.1.24"
|
||||||
@@ -853,16 +781,14 @@
|
|||||||
},
|
},
|
||||||
"node_modules/unpipe": {
|
"node_modules/unpipe": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.8"
|
"node": ">= 0.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/utils-merge": {
|
"node_modules/utils-merge": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
|
"license": "MIT",
|
||||||
"integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.4.0"
|
"node": ">= 0.4.0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "lingchair",
|
"name": "lingchair",
|
||||||
"description": "A simple, lightweight and powerful Instant Messaging application.",
|
"description": "A simple, lightweight and powerful Instant Messaging application.",
|
||||||
"version": "0.6.1",
|
"version": "0.7.0",
|
||||||
"license": "Apache License 2.0",
|
"license": "Apache License 2.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "MoonLeeeaf",
|
"name": "MoonLeeeaf",
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
"start": "node ./server_src/main.js"
|
"start": "node ./server_src/main.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"mime": "^4.0.1",
|
"express": "^4.19.2",
|
||||||
"socket.io": "^4.7.5"
|
"socket.io": "^4.7.5"
|
||||||
},
|
},
|
||||||
"type": "commonjs"
|
"type": "commonjs"
|
||||||
|
|||||||
16
readme.md
16
readme.md
@@ -3,19 +3,21 @@
|
|||||||
欢迎来到铃之椅! 这是一个即时通讯项目, 为通讯提供更多的选择, 为人民服务
|
欢迎来到铃之椅! 这是一个即时通讯项目, 为通讯提供更多的选择, 为人民服务
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> 本项目仍在实验阶段, 为防止源代码丢失, 先留存代码...
|
> 本项目仍在实验阶段, [点我](final.md)可查看进展
|
||||||
>
|
>
|
||||||
> 如果发现有任何疑问, 欢迎提问
|
> 如果有任何问题,欢迎你提出来,我会不定时查看
|
||||||
>
|
>
|
||||||
> 另外 Android 客户端也在开发, 但因为从头开始写且生地中考临近, 因此暂时搁置
|
> 另外 Android 客户端也在开发, 但进展缓慢
|
||||||
|
|
||||||
### 使用
|
### 使用
|
||||||
|
|
||||||
服务端:
|
服务端:
|
||||||
|
|
||||||
1. 克隆本仓库源代码到本地
|
0. 确保安装了 Node.js
|
||||||
|
|
||||||
2. 运行 run.sh 或 run.bat
|
1. 克隆本仓库源代码到本地,并运行 run_build.sh 构建网页
|
||||||
|
|
||||||
|
2. 运行 run.sh
|
||||||
|
|
||||||
网页端:
|
网页端:
|
||||||
|
|
||||||
@@ -23,7 +25,9 @@
|
|||||||
|
|
||||||
* 克隆本仓库到本地并运行本地 HTTP 服务端
|
* 克隆本仓库到本地并运行本地 HTTP 服务端
|
||||||
|
|
||||||
* 使用本仓库提供的网页 (不推荐, 有跨域问题)
|
* 静态网页 (不推荐)
|
||||||
|
|
||||||
|
### [Q&A](.github/QA.md)
|
||||||
|
|
||||||
### 鸣谢
|
### 鸣谢
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ const users = require("./api-users")
|
|||||||
let getSameHashedValue = (a, b) => {
|
let getSameHashedValue = (a, b) => {
|
||||||
let _a = [hash.md5(a) + hash.sha256(a), hash.md5(b) + hash.sha256(b)].sort()
|
let _a = [hash.md5(a) + hash.sha256(a), hash.md5(b) + hash.sha256(b)].sort()
|
||||||
let [_1, _2] = _a
|
let [_1, _2] = _a
|
||||||
return hash.sha256hex(hash.sha256hex(_1) + hash.sha256hex(_2))
|
return hash.sha256(hash.sha256(_1) + hash.sha256(_2))
|
||||||
}
|
}
|
||||||
|
|
||||||
let getSingleChatDir = (a, b) => {
|
let getSingleChatDir = (a, b) => {
|
||||||
|
|||||||
@@ -7,10 +7,8 @@
|
|||||||
const crypto = require("crypto")
|
const crypto = require("crypto")
|
||||||
|
|
||||||
let apis = {
|
let apis = {
|
||||||
sha256: (data) => crypto.createHash("sha256").update(data).digest("base64"),
|
sha256: (data) => crypto.createHash("sha256").update(data).digest("hex"),
|
||||||
md5: (data) => crypto.createHash("md5").update(data).digest("base64"),
|
md5: (data) => crypto.createHash("md5").update(data).digest("hex"),
|
||||||
sha256hex: (data) => crypto.createHash("sha256").update(data).digest("hex"),
|
|
||||||
md5hex: (data) => crypto.createHash("md5").update(data).digest("hex"),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = apis
|
module.exports = apis
|
||||||
|
|||||||
@@ -148,6 +148,21 @@ let api = {
|
|||||||
cb({ msg: msg, code: 0, data: { friends: friends } })
|
cb({ msg: msg, code: 0, data: { friends: friends } })
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 添加好友
|
||||||
|
// {name: 账号, accessToken: 访问令牌} 返回 {friends: []}
|
||||||
|
// WIP
|
||||||
|
"user.addFriend": (a, cb) => {
|
||||||
|
if (checkEmpty([a.name, a.accessToken]))
|
||||||
|
return cb({ msg: "参数缺失", code: -1 })
|
||||||
|
|
||||||
|
let { msg, code, friends } = users.getFriends(a.name, a.accessToken)
|
||||||
|
|
||||||
|
if (code !== 0)
|
||||||
|
return cb({ msg: msg, code: code })
|
||||||
|
|
||||||
|
cb({ msg: msg, code: 0, data: { friends: friends } })
|
||||||
|
},
|
||||||
|
|
||||||
"user.getNick": (a, cb) => {
|
"user.getNick": (a, cb) => {
|
||||||
if (checkEmpty([a.name]))
|
if (checkEmpty([a.name]))
|
||||||
return cb({ msg: "参数缺失", code: -1 })
|
return cb({ msg: "参数缺失", code: -1 })
|
||||||
|
|||||||
Reference in New Issue
Block a user