init
This commit is contained in:
commit
451223816b
338 changed files with 9938 additions and 0 deletions
98
src/lib/core/handlers/messageHandler.ts
Normal file
98
src/lib/core/handlers/messageHandler.ts
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
import { get, writable } from 'svelte/store';
|
||||
import { addNotification, notiStore } from '../stores/noti';
|
||||
import {
|
||||
recipeData,
|
||||
recipeDataError,
|
||||
recipeLoading,
|
||||
recipeOverviewData,
|
||||
recipeStreamMeta
|
||||
} from '../stores/recipeStore';
|
||||
|
||||
export const messages = writable<string[]>([]);
|
||||
|
||||
type WSMessage = { type: string; payload: any };
|
||||
|
||||
const handlers: Record<string, (payload: any) => void> = {
|
||||
chat: (p) => messages.update((m) => [...m, p]),
|
||||
ping: (p) => console.log('ping from server'),
|
||||
recipeResponse: (p) => {
|
||||
let recipe_result = p.result;
|
||||
let recipe_request = p.request;
|
||||
|
||||
if (recipe_result) {
|
||||
addNotification('INFO:Start fetch recipe!');
|
||||
}
|
||||
},
|
||||
stream_data_start: (p) => {
|
||||
let stream_id = p.stream_id;
|
||||
let total_size = p.total_size;
|
||||
let chunk_size = p.chunk_size;
|
||||
|
||||
if (stream_id) {
|
||||
addNotification('INFO:Start streaming data');
|
||||
recipeLoading.set(true);
|
||||
recipeStreamMeta.set({
|
||||
id: stream_id,
|
||||
total_size: total_size,
|
||||
chunk_size: chunk_size,
|
||||
progress: 0
|
||||
});
|
||||
recipeData.set([]);
|
||||
recipeOverviewData.set([]);
|
||||
}
|
||||
},
|
||||
stream_data_error: (p) => {
|
||||
recipeLoading.set(false);
|
||||
recipeDataError.set(p);
|
||||
|
||||
setTimeout(() => {
|
||||
addNotification(`ERROR:${p.error}`);
|
||||
}, 2000);
|
||||
},
|
||||
stream_data_chunk: (p) => {
|
||||
let current_meta = get(recipeStreamMeta);
|
||||
if (current_meta) {
|
||||
let stream_id = current_meta.id;
|
||||
|
||||
let progress_response_id = p.stream_id;
|
||||
if (stream_id === progress_response_id) {
|
||||
let current_response_end = p.start_idx + current_meta.chunk_size;
|
||||
let percent = (current_response_end / current_meta.total_size) * 100;
|
||||
if (percent > 100) {
|
||||
percent = 100;
|
||||
}
|
||||
let data = p.data;
|
||||
let currentData = get(recipeData);
|
||||
for (let rp of data) {
|
||||
currentData.push(rp);
|
||||
}
|
||||
recipeData.set(currentData);
|
||||
recipeStreamMeta.set({
|
||||
...current_meta,
|
||||
progress: percent
|
||||
});
|
||||
|
||||
// build overview
|
||||
|
||||
if (percent == 100) {
|
||||
addNotification(`INFO:Current progress ${percent}%`);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
stream_data_end: (p) => {
|
||||
recipeLoading.set(false);
|
||||
},
|
||||
stream_patch_update: (p) => {}
|
||||
};
|
||||
|
||||
export function handleIncomingMessages(raw: string) {
|
||||
const msg: WSMessage = JSON.parse(raw);
|
||||
console.log(`${new Date().toLocaleTimeString()}:ws msg`, msg);
|
||||
if (msg == null) {
|
||||
// error response
|
||||
addNotification('ERR:No response from server');
|
||||
return;
|
||||
}
|
||||
handlers[msg.type]?.(msg.payload);
|
||||
}
|
||||
41
src/lib/core/handlers/permissionHandler.ts
Normal file
41
src/lib/core/handlers/permissionHandler.ts
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
import { get } from "svelte/store";
|
||||
import { permission as currentPermissions } from "$lib/core/stores/permissions";
|
||||
|
||||
|
||||
|
||||
const splitPermCache = new Map<string, string[]>();
|
||||
function splitPerm(p: string): string[]{
|
||||
if(!splitPermCache.has(p)){
|
||||
splitPermCache.set(p, p.split("."));
|
||||
}
|
||||
return splitPermCache.get(p)!;
|
||||
}
|
||||
|
||||
/// Check if current user has exacted permissions
|
||||
export function requirePermission(...permissions: string[]): boolean {
|
||||
// let perms = get(currentPermissions);
|
||||
// let countOk = 0;
|
||||
// for(let perm of perms){
|
||||
// if(permissions.includes(perm)){
|
||||
// countOk += 1;
|
||||
// }
|
||||
// }
|
||||
// return countOk > 0 && countOk == perms.length;
|
||||
const userPerms = get(currentPermissions);
|
||||
return permissions.every(req => {
|
||||
return userPerms.includes(req);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/// Check permission of user by
|
||||
export function needPermission(...permissions: string[]): boolean {
|
||||
const userPerms = get(currentPermissions).map(p => splitPerm(p));
|
||||
return permissions.every(req => {
|
||||
const reqParts = splitPerm(req);
|
||||
return userPerms.some(userParts => {
|
||||
if(userParts.length !== reqParts.length) return false;
|
||||
return reqParts.every((part, i) => part === "*" || part === userParts[i]);
|
||||
});
|
||||
});
|
||||
}
|
||||
26
src/lib/core/handlers/ws_messageSender.ts
Normal file
26
src/lib/core/handlers/ws_messageSender.ts
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
import { get, writable } from 'svelte/store';
|
||||
import type { OutMessage } from '../types/outMessage';
|
||||
import { socketStore } from '../stores/websocketStore';
|
||||
import { addNotification } from '../stores/noti';
|
||||
|
||||
export const queue = writable<string[]>([]);
|
||||
|
||||
export function sendMessage(msg: OutMessage): boolean {
|
||||
const socket = get(socketStore);
|
||||
const data = JSON.stringify(msg);
|
||||
|
||||
if (!socket || socket.readyState !== WebSocket.OPEN) {
|
||||
console.warn('WebSocket not connected, put to queue');
|
||||
|
||||
let currentQueue = get(queue);
|
||||
currentQueue.push(data);
|
||||
queue.set(currentQueue);
|
||||
|
||||
addNotification('WARN:Queuing overview view request');
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
socket.send(data);
|
||||
return true;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue