Page MenuHomePhorge

D9842.1768830963.diff
No OneTemporary

Size
10 KB
Referenced Files
None
Subscribers
None

D9842.1768830963.diff

diff --git a/keyserver/src/scripts/test-threadstore-reductions.js b/keyserver/src/scripts/test-threadstore-reductions.js
deleted file mode 100644
--- a/keyserver/src/scripts/test-threadstore-reductions.js
+++ /dev/null
@@ -1,333 +0,0 @@
-// @flow
-
-import invariant from 'invariant';
-
-import ashoat from 'lib/facts/ashoat.js';
-import type { RawMessageInfo } from 'lib/types/message-types.js';
-import type {
- ThreadPermission,
- ThreadPermissionsInfo,
- ThreadRolePermissionsBlob,
-} from 'lib/types/thread-permission-types.js';
-import { threadTypes } from 'lib/types/thread-types-enum.js';
-import type { RawThreadInfos } from 'lib/types/thread-types.js';
-import { hash } from 'lib/utils/objects.js';
-
-import { main } from './utils.js';
-import { fetchMessageInfos } from '../fetchers/message-fetchers.js';
-import { fetchThreadInfos } from '../fetchers/thread-fetchers.js';
-import { createScriptViewer } from '../session/scripts.js';
-import type { Viewer } from '../session/viewer.js';
-import { compressMessage } from '../utils/compress.js';
-
-const ashoatViewer = createScriptViewer(ashoat.id);
-const atulViewer = createScriptViewer('518252');
-
-const oneWeekAgo = Date.now() - 7 * 24 * 60 * 60 * 1000;
-const messageSelectionCriteria = { joinedThreads: true, newerThan: oneWeekAgo };
-
-async function testThreadStoreReductions() {
- await testUserThreadStoreReductions(ashoatViewer, 'Ashoat');
- await testUserThreadStoreReductions(atulViewer, 'Atul');
-}
-
-async function testUserThreadStoreReductions(viewer: Viewer, name: string) {
- const [{ threadInfos }, { rawMessageInfos }] = await Promise.all([
- fetchThreadInfos(viewer),
- fetchMessageInfos(viewer, messageSelectionCriteria, 1),
- ]);
- const beforeReductions = JSON.stringify(threadInfos);
- const beforeBytes = new Blob([beforeReductions]).size;
- const beforeCompressed = await compressMessage(beforeReductions);
- invariant(beforeCompressed.compressed, 'should be compressed');
- const beforeCompressedBytes = new Blob([beforeCompressed.result.data]).size;
- console.log(
- `before reductions, ${name}'s ThreadStore is ${beforeBytes} bytes large ` +
- `(${beforeCompressedBytes} bytes compressed)`,
- );
-
- const withoutOldSidebars = filterOutOldSidebars(threadInfos, rawMessageInfos);
- await testSolution(
- withoutOldSidebars,
- name,
- '[A] filtering out old sidebars',
- );
-
- const improvedEncoding = improveEncoding(threadInfos);
- await testSolution(improvedEncoding, name, '[B] improving encoding');
-
- const afterIsAdminRole = introduceIsAdminRole(threadInfos);
- await testSolution(afterIsAdminRole, name, '[C] introducing isAdminRole');
-
- const afterRoleStore = introduceThreadRolePermissionsStore(threadInfos);
- await testSolution(
- afterRoleStore,
- name,
- '[D] introducing ThreadRolePermissionsStore',
- );
-
- const testAB = improveEncoding(withoutOldSidebars);
- await testSolution(testAB, name, '[A] and [B]');
-
- const testAC = introduceIsAdminRole(withoutOldSidebars);
- await testSolution(testAC, name, '[A] and [C]');
-
- const testAD = introduceThreadRolePermissionsStore(withoutOldSidebars);
- await testSolution(testAD, name, '[A] and [D]');
-
- const testBC = introduceIsAdminRole(improvedEncoding);
- await testSolution(testBC, name, '[B] and [C]');
-
- const testBD = introduceThreadRolePermissionsStore(improvedEncoding);
- await testSolution(testBD, name, '[B] and [D]');
-
- const testCD = introduceThreadRolePermissionsStore(afterIsAdminRole);
- await testSolution(testCD, name, '[C] and [D]');
-
- const testABC = introduceIsAdminRole(testAB);
- await testSolution(testABC, name, '[A], [B], and [C]');
-
- const testABD = introduceThreadRolePermissionsStore(testAB);
- await testSolution(testABD, name, '[A], [B], and [D]');
-
- const testACD = introduceThreadRolePermissionsStore(testAC);
- await testSolution(testACD, name, '[A], [C], and [D]');
-
- const testBCD = introduceThreadRolePermissionsStore(testBC);
- await testSolution(testBCD, name, '[B], [C], and [D]');
-
- const testABCD = introduceThreadRolePermissionsStore(testABC);
- await testSolution(testABCD, name, '[A], [B], [C], and [D]');
-}
-
-async function testSolution(blob: mixed, person: string, descriptor: string) {
- const stringified = JSON.stringify(blob);
- invariant(stringified, 'stringified result should be truthy');
- const numBytes = new Blob([stringified]).size;
- const compressed = await compressMessage(stringified);
- invariant(compressed.compressed, 'should be compressed');
- const compressedBytes = new Blob([compressed.result.data]).size;
- console.log(
- `after ${descriptor}, ${person}'s ThreadStore is ${numBytes} bytes ` +
- `large (${compressedBytes} bytes compressed)`,
- );
-}
-
-function filterOutOldSidebars(
- threadInfos: RawThreadInfos,
- messageInfos: $ReadOnlyArray<RawMessageInfo>,
-): RawThreadInfos {
- const newestTimePerThread = new Map();
- for (const messageInfo of messageInfos) {
- const { threadID, time } = messageInfo;
- const currentNewest = newestTimePerThread.get(threadID);
- if (!currentNewest || currentNewest < time) {
- newestTimePerThread.set(threadID, time);
- }
- }
-
- const filtered = {};
- for (const threadID in threadInfos) {
- const threadInfo = threadInfos[threadID];
- const latestUpdate = newestTimePerThread.get(threadID);
- if (
- threadInfo.type !== threadTypes.SIDEBAR ||
- (latestUpdate && latestUpdate >= oneWeekAgo)
- ) {
- filtered[threadID] = threadInfo;
- }
- }
- return filtered;
-}
-
-function improveEncoding(threadInfos: RawThreadInfos) {
- const simplifiedThreadStore = {};
- for (const threadID in threadInfos) {
- const threadInfo = threadInfos[threadID];
- const newRoles = {};
- for (const roleID in threadInfo.roles) {
- const role = threadInfo.roles[roleID];
- newRoles[roleID] = {
- ...role,
- permissions: improveThreadRolePermissionsBlobEncoding(role.permissions),
- };
- }
- const smallerThreadInfo = {
- ...threadInfo,
- roles: newRoles,
- members: threadInfo.members.map(member => {
- const { permissions } = member;
- if (!permissions) {
- return member;
- }
- return {
- ...member,
- permissions: improveThreadPermissionsBlobEncoding(member.permissions),
- };
- }),
- currentUser: {
- ...threadInfo.currentUser,
- permissions: improveThreadPermissionsBlobEncoding(
- threadInfo.currentUser.permissions,
- ),
- },
- };
- simplifiedThreadStore[threadID] = smallerThreadInfo;
- }
- return simplifiedThreadStore;
-}
-
-const smallerPermissionConstants = {
- ['know_of']: 'a',
- ['membership']: 'b',
- ['visible']: 'c',
- ['voiced']: 'd',
- ['edit_entries']: 'e',
- ['edit_thread']: 'f',
- ['edit_thread_description']: 'g',
- ['edit_thread_color']: 'h',
- ['delete_thread']: 'i',
- ['create_subthreads']: 'j',
- ['create_sidebars']: 'k',
- ['join_thread']: 'l',
- ['edit_permissions']: 'm',
- ['add_members']: 'n',
- ['remove_members']: 'o',
- ['change_role']: 'p',
- ['leave_thread']: 'q',
- ['react_to_message']: 'r',
- ['edit_message']: 's',
- ['edit_thread_avatar']: 't',
- ['manage_pins']: 'u',
- ['manage_invite_links']: 'v',
-};
-function improveThreadPermissionsBlobEncoding(blob: ThreadPermissionsInfo) {
- const newBlob = {};
- for (const permission in blob) {
- const permissionTyped: ThreadPermission = (permission: any);
- const oldValue = blob[permissionTyped].value;
- if (!oldValue) {
- continue;
- }
- const newKey = smallerPermissionConstants[permission];
- invariant(newKey, `no newKey for ${permission}!`);
- newBlob[newKey] = 1;
- }
- return newBlob;
-}
-
-const smallerThreadPermissionPropagationPrefixes = {
- ['descendant_']: '1',
- ['child_']: '2',
-};
-const smallerThreadPermissionFilterPrefixes = {
- ['open_']: '3',
- ['toplevel_']: '4',
- ['opentoplevel_']: '5',
-};
-function improveThreadRolePermissionsBlobEncoding(
- blob: ThreadRolePermissionsBlob,
-) {
- const newBlob = {};
- for (const permission in blob) {
- const oldValue = blob[permission];
- if (!oldValue) {
- continue;
- }
-
- let newKey = '';
- let oldKey = permission;
-
- for (const prefix in smallerThreadPermissionPropagationPrefixes) {
- if (!oldKey.startsWith(prefix)) {
- continue;
- }
- oldKey = oldKey.substr(prefix.length);
- newKey += smallerThreadPermissionPropagationPrefixes[prefix];
- }
-
- for (const prefix in smallerThreadPermissionFilterPrefixes) {
- if (!oldKey.startsWith(prefix)) {
- continue;
- }
- oldKey = oldKey.substr(prefix.length);
- newKey += smallerThreadPermissionFilterPrefixes[prefix];
- }
-
- const newPermConstant = smallerPermissionConstants[oldKey];
- invariant(newPermConstant, `no newPermConstant for ${oldKey}!`);
- newKey += newPermConstant;
-
- newBlob[newKey] = 1;
- }
- return newBlob;
-}
-
-function introduceIsAdminRole(threadInfos: RawThreadInfos) {
- const newThreadStore = {};
- for (const threadID in threadInfos) {
- const threadInfo = threadInfos[threadID];
- const newRoles = {};
- for (const roleID in threadInfo.roles) {
- const role = threadInfo.roles[roleID];
- let newRole = role;
- if (!newRole.isDefault) {
- const { isDefault, ...rest } = newRole;
- newRole = rest;
- }
- if (role.name === 'Admins') {
- newRole = {
- ...newRole,
- isAdmin: true,
- };
- }
- newRoles[roleID] = newRole;
- }
- const newThreadInfo = {
- ...threadInfo,
- roles: newRoles,
- members: threadInfo.members.map(member => {
- const { permissions, ...rest } = member;
- return rest;
- }),
- };
- newThreadStore[threadID] = newThreadInfo;
- }
- return newThreadStore;
-}
-
-function introduceThreadRolePermissionsStore(threadInfos: RawThreadInfos) {
- const newThreadStore = {};
- const threadRolePermissionsStore = {};
- for (const threadID in threadInfos) {
- const threadInfo = threadInfos[threadID];
- const newRoles = {};
- for (const roleID in threadInfo.roles) {
- const role = threadInfo.roles[roleID];
- const rolePermissionsHash = hash(role.permissions);
- threadRolePermissionsStore[rolePermissionsHash] = role.permissions;
- newRoles[roleID] = {
- ...role,
- permissions: rolePermissionsHash,
- };
- }
- const { permissions: currentUserPermissions, ...restCurrentUser } =
- threadInfo.currentUser;
- const newThreadInfo = {
- ...threadInfo,
- currentUser: restCurrentUser,
- roles: newRoles,
- members: threadInfo.members.map(member => {
- const { permissions, ...rest } = member;
- return rest;
- }),
- };
- newThreadStore[threadID] = newThreadInfo;
- }
- return {
- threadInfos: newThreadStore,
- rolePermissions: threadRolePermissionsStore,
- };
-}
-
-main([testThreadStoreReductions]);

File Metadata

Mime Type
text/plain
Expires
Mon, Jan 19, 1:56 PM (1 h, 54 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5956735
Default Alt Text
D9842.1768830963.diff (10 KB)

Event Timeline