summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2020-11-01 11:39:38 +0900
committersyuilo <syuilotan@yahoo.co.jp>2020-11-01 11:39:38 +0900
commit75a9ff832a5927a4ad716c1cf25142f82137dcf2 (patch)
treee0c790eedb34df76b049c7b3315b9e6e8b81f4f9 /src
parentMerge branch 'develop' of https://github.com/syuilo/misskey into develop (diff)
downloadmisskey-75a9ff832a5927a4ad716c1cf25142f82137dcf2.tar.gz
misskey-75a9ff832a5927a4ad716c1cf25142f82137dcf2.tar.bz2
misskey-75a9ff832a5927a4ad716c1cf25142f82137dcf2.zip
タスクマネージャー(wip)
Diffstat (limited to 'src')
-rw-r--r--src/client/components/taskmanager.vue96
-rw-r--r--src/client/config.ts1
-rw-r--r--src/client/init.ts2
-rw-r--r--src/client/pages/settings/other.vue25
-rw-r--r--src/client/scripts/stream.ts26
5 files changed, 139 insertions, 11 deletions
diff --git a/src/client/components/taskmanager.vue b/src/client/components/taskmanager.vue
new file mode 100644
index 0000000000..14d4e2d1b3
--- /dev/null
+++ b/src/client/components/taskmanager.vue
@@ -0,0 +1,96 @@
+<template>
+<XWindow ref="window" :initial-width="650" :initial-height="420" :can-resize="true" @closed="$emit('closed')">
+ <template #header>
+ <Fa :icon="faTerminal" style="margin-right: 0.5em;"/>Task Manager
+ </template>
+ <div class="qljqmnzj">
+ <MkTab v-model:value="tab" :items="[{ label: 'Stream', value: 'stream', }, { label: 'API', value: 'api', }]"/>
+ <div v-if="tab === 'stream'" class="stream">
+ <div class="header">
+ <div>#ID</div>
+ <div>Ch</div>
+ <div>Handle</div>
+ <div>In</div>
+ <div>Out</div>
+ </div>
+ <div v-for="c in connections">
+ <div>#{{ c.id }}</div>
+ <div>{{ c.channel }}</div>
+ <div v-if="c.users !== null">(shared)<span v-if="c.name">{{ ' ' + c.name }}</span></div>
+ <div v-else>{{ c.name ? c.name : '<anonymous>' }}</div>
+ <div>{{ c.in }}</div>
+ <div>{{ c.out }}</div>
+ </div>
+ </div>
+ </div>
+</XWindow>
+</template>
+
+<script lang="ts">
+import { defineComponent, markRaw, onBeforeUnmount, ref } from 'vue';
+import { faTerminal } from '@fortawesome/free-solid-svg-icons';
+import XWindow from '@/components/ui/window.vue';
+import MkTab from '@/components/tab.vue';
+import MkButton from '@/components/ui/button.vue';
+import * as os from '@/os';
+
+export default defineComponent({
+ components: {
+ XWindow,
+ MkTab,
+ MkButton,
+ },
+
+ props: {
+ },
+
+ emits: ['closed'],
+
+ setup() {
+ const connections = ref([]);
+ const refreshStreamInfo = () => {
+ console.log(os.stream.sharedConnections, os.stream.nonSharedConnections);
+ connections.value = markRaw(os.stream.sharedConnections.map(c => ({
+ id: c.id, name: c.name, channel: c.channel, users: c.pool.users, in: c.inCount, out: c.outCount,
+ })).concat(os.stream.nonSharedConnections.map(c => ({
+ id: c.id, name: c.name, channel: c.channel, users: null, in: c.inCount, out: c.outCount,
+ }))));
+ connections.value.sort((a, b) => (a.id > b.id) ? 1 : -1);
+ };
+ const interval = setInterval(refreshStreamInfo, 1000);
+ onBeforeUnmount(() => {
+ clearInterval(interval);
+ });
+
+ return {
+ tab: 'stream',
+ connections,
+ faTerminal,
+ };
+ },
+});
+</script>
+
+<style lang="scss" scoped>
+.qljqmnzj {
+ > .stream {
+ display: table;
+ width: 100%;
+ padding: 8px;
+ box-sizing: border-box;
+
+ > div {
+ display: table-row;
+ font-family: Fira code, Fira Mono, Consolas, Menlo, Courier, monospace;
+
+ &.header {
+ opacity: 0.7;
+ }
+
+ > * {
+ display: table-cell;
+ }
+ }
+ }
+}
+</style>
diff --git a/src/client/config.ts b/src/client/config.ts
index e0d2fd1deb..9c5e0f7651 100644
--- a/src/client/config.ts
+++ b/src/client/config.ts
@@ -14,3 +14,4 @@ export const getLocale = async () => Object.fromEntries((await entries(clientDb.
export const version = _VERSION_;
export const instanceName = siteName === 'Misskey' ? host : siteName;
export const deckmode = localStorage.getItem('deckmode') === 'true';
+export const debug = localStorage.getItem('debug') === 'true';
diff --git a/src/client/init.ts b/src/client/init.ts
index 86991b69e3..070deec0c5 100644
--- a/src/client/init.ts
+++ b/src/client/init.ts
@@ -252,7 +252,7 @@ if (store.getters.isSignedIn) {
}
}
- const main = stream.useSharedConnection('main');
+ const main = stream.useSharedConnection('main', 'system');
// 自分の情報が更新されたとき
main.on('meUpdated', i => {
diff --git a/src/client/pages/settings/other.vue b/src/client/pages/settings/other.vue
index 38c2e8adb6..dbeb9ad719 100644
--- a/src/client/pages/settings/other.vue
+++ b/src/client/pages/settings/other.vue
@@ -10,22 +10,31 @@
</div>
</div>
<div class="_section">
- <MkA to="/settings/regedit">RegEdit</MkA>
+ <MkSwitch v-model:value="debug" @update:value="changeDebug">
+ DEBUG MODE
+ </MkSwitch>
+ <div v-if="debug">
+ <MkA to="/settings/regedit">RegEdit</MkA>
+ <MkButton @click="taskmanager">Task Manager</MkButton>
+ </div>
</div>
</div>
</template>
<script lang="ts">
-import { defineComponent } from 'vue';
+import { defineAsyncComponent, defineComponent } from 'vue';
import { faEllipsisH } from '@fortawesome/free-solid-svg-icons';
import MkSelect from '@/components/ui/select.vue';
import MkSwitch from '@/components/ui/switch.vue';
+import MkButton from '@/components/ui/button.vue';
import * as os from '@/os';
+import { debug } from '@/config';
export default defineComponent({
components: {
MkSelect,
MkSwitch,
+ MkButton,
},
emits: ['info'],
@@ -38,6 +47,7 @@ export default defineComponent({
icon: faEllipsisH
}]
},
+ debug
}
},
@@ -46,11 +56,22 @@ export default defineComponent({
},
methods: {
+ changeDebug(v) {
+ console.log(v);
+ localStorage.setItem('debug', v.toString());
+ location.reload();
+ },
+
onChangeInjectFeaturedNote(v) {
os.api('i/update', {
injectFeaturedNote: v
});
},
+
+ taskmanager() {
+ os.popup(defineAsyncComponent(() => import('@/components/taskmanager.vue')), {
+ }, {}, 'closed');
+ }
}
});
</script>
diff --git a/src/client/scripts/stream.ts b/src/client/scripts/stream.ts
index 789bf94320..942e2a8daa 100644
--- a/src/client/scripts/stream.ts
+++ b/src/client/scripts/stream.ts
@@ -1,7 +1,7 @@
import autobind from 'autobind-decorator';
import { EventEmitter } from 'eventemitter3';
import ReconnectingWebsocket from 'reconnecting-websocket';
-import { wsUrl } from '@/config';
+import { debug, wsUrl } from '@/config';
import { query as urlQuery } from '../../prelude/url';
/**
@@ -28,7 +28,7 @@ export default class Stream extends EventEmitter {
}
@autobind
- public useSharedConnection(channel: string): SharedConnection {
+ public useSharedConnection(channel: string, name?: string): SharedConnection {
let pool = this.sharedConnectionPools.find(p => p.channel === channel);
if (pool == null) {
@@ -36,7 +36,7 @@ export default class Stream extends EventEmitter {
this.sharedConnectionPools.push(pool);
}
- const connection = new SharedConnection(this, channel, pool);
+ const connection = new SharedConnection(this, channel, pool, name);
this.sharedConnections.push(connection);
return connection;
}
@@ -113,6 +113,7 @@ export default class Stream extends EventEmitter {
for (const c of connections.filter(c => c != null)) {
c.emit(body.type, Object.freeze(body.body));
+ if (debug) c.inCount++;
}
} else {
this.emit(type, Object.freeze(body));
@@ -142,6 +143,8 @@ export default class Stream extends EventEmitter {
}
}
+let idCounter = 0;
+
class Pool {
public channel: string;
public id: string;
@@ -154,7 +157,7 @@ class Pool {
this.channel = channel;
this.stream = stream;
- this.id = Math.random().toString().substr(2, 8);
+ this.id = (++idCounter).toString();
this.stream.on('_disconnected_', this.onStreamDisconnected);
}
@@ -216,11 +219,16 @@ abstract class Connection extends EventEmitter {
protected stream: Stream;
public abstract id: string;
- constructor(stream: Stream, channel: string) {
+ public name?: string; // for debug
+ public inCount: number = 0; // for debug
+ public outCount: number = 0; // for debug
+
+ constructor(stream: Stream, channel: string, name?: string) {
super();
this.stream = stream;
this.channel = channel;
+ this.name = name;
}
@autobind
@@ -233,6 +241,8 @@ abstract class Connection extends EventEmitter {
type: type,
body: body
});
+
+ if (debug) this.outCount++;
}
public abstract dispose(): void;
@@ -245,8 +255,8 @@ class SharedConnection extends Connection {
return this.pool.id;
}
- constructor(stream: Stream, channel: string, pool: Pool) {
- super(stream, channel);
+ constructor(stream: Stream, channel: string, pool: Pool, name?: string) {
+ super(stream, channel, name);
this.pool = pool;
this.pool.inc();
@@ -273,7 +283,7 @@ class NonSharedConnection extends Connection {
super(stream, channel);
this.params = params;
- this.id = Math.random().toString().substr(2, 8);
+ this.id = (++idCounter).toString();
this.connect();
}