mirror of
https://github.com/gravitational/teleport.git
synced 2026-11-04 19:12:46 +08:00
* adding desktopPOC player * updates to proper playback test websocket endpoint * Changes EventQuery to take an EventCode in order to facilitate more comprehensible typing for AuditService.fetchEvents. Updates RecordingsService to use the general events search endpoint in order to easily add DESKTOP_SESSION_ENDED events to the response alongside regular [ssh] SESSION_END events. * Adds logic for distinguishing between session types and displaying appropriate icon * Deleting DesktopPlayerPOC which should not have been on this branch * Breaks the handling of the two types of end events passed into makeRecording into two separate functions. Also types RecordingDescription * touchups * yarn tsc fixes * updates storybook * updating snapshot * removing unused import * adds skeleton for distinguishing between ssh and desktop recordings * Testing connection of the playerClient * Puts TdpClientCanvas into the DesktopPlayer * adds toggle to PlayerClient * small fixes * adds an onerror to proxyServer so that websocket closures don't shut down the webpack-dev-server * updates to match backend * shifting preventDefaults out of TdpClientCanvas since that isn't always desired (for example with the desktop player) * Adds a ProgressBarDesktop component and makes it respond to the new PlayerClientEvent.TOGGLE_PLAY_PAUSE event emitted by the PlayerClient * Adds support for decoding client screen spec and using it to determine canvas size during playback. requires some code cleanup * Some significant refactoring, DesktopSession and DesktopPlayer now both up to par in terms of function. Requires further refactoring for storybook. * fixes storybook * fixes codec test * fixing build warnings * reverts audit log changes * removes unused type Region * decodes the jsons that are now sent over websocket * replace fqdm with fqdn * Stops re-adding TOGGLE_PLAY_PAUSE listener each rerender and adds cleanup for that listener * Make naming more precise * removing unnecessary logging and fixing a type * adding todo * makes recordingType the more appropriate query param * change let to const * tiny fixes * reverting * The progress bar now moves with the recording timing * Makes the rest of TdpClientCanvas props optional and wraps relevant logic in relevant if statements where necessary. Gets rid of ugly doNothing * fixes event listener cleanup * removes unnecessary prop * Adds standard error handling display and a storybook for it * moving detailed TODO to an issue * changing toHuman to remove brittle reliance on iso string * removes base64-arraybuffer, refactors base64url.ts into the more general base64.ts and uses it for base64 to array buffer translation * fixes Storybook * fixes validDurationMs * Copies in base64url-arraybuffer library and modifies it for our purposes * putting import statements in their proper place * Moves Base64urlString type to where its needed * removes DS_Store * addresses code review * simplifies and fixes durationMs logic * final touches
74 lines
2.6 KiB
TypeScript
74 lines
2.6 KiB
TypeScript
// Modified from https://github.com/niklasvh/base64-arraybuffer/
|
|
|
|
// Copyright (c) 2012 Niklas von Hertzen
|
|
|
|
// Permission is hereby granted, free of charge, to any person
|
|
// obtaining a copy of this software and associated documentation
|
|
// files (the "Software"), to deal in the Software without
|
|
// restriction, including without limitation the rights to use,
|
|
// copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
// copies of the Software, and to permit persons to whom the
|
|
// Software is furnished to do so, subject to the following
|
|
// conditions:
|
|
|
|
// The above copyright notice and this permission notice shall be
|
|
// included in all copies or substantial portions of the Software.
|
|
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
// OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
const chars =
|
|
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
|
|
// Use a lookup table to find the index.
|
|
const lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);
|
|
for (let i = 0; i < chars.length; i++) {
|
|
lookup[chars.charCodeAt(i)] = i;
|
|
}
|
|
|
|
// Most efficient of the implementations tried here: https://jsbench.me/krkz8mf04o/1
|
|
export const arrayBufferToBase64 = (arraybuffer: ArrayBuffer): string => {
|
|
return btoa(String.fromCharCode.apply(null, new Uint8Array(arraybuffer)));
|
|
};
|
|
|
|
// Most efficient of the implementations tried here: https://jsbench.me/vkkz8ly9os/1
|
|
export const base64ToArrayBuffer = (base64: string): ArrayBuffer => {
|
|
let bufferLength = base64.length * 0.75,
|
|
len = base64.length,
|
|
i,
|
|
p = 0,
|
|
encoded1,
|
|
encoded2,
|
|
encoded3,
|
|
encoded4;
|
|
|
|
if (base64[base64.length - 1] === '=') {
|
|
bufferLength--;
|
|
if (base64[base64.length - 2] === '=') {
|
|
bufferLength--;
|
|
}
|
|
}
|
|
|
|
const arraybuffer = new ArrayBuffer(bufferLength),
|
|
bytes = new Uint8Array(arraybuffer);
|
|
|
|
for (i = 0; i < len; i += 4) {
|
|
encoded1 = lookup[base64.charCodeAt(i)];
|
|
encoded2 = lookup[base64.charCodeAt(i + 1)];
|
|
encoded3 = lookup[base64.charCodeAt(i + 2)];
|
|
encoded4 = lookup[base64.charCodeAt(i + 3)];
|
|
|
|
bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);
|
|
bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
|
|
bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);
|
|
}
|
|
|
|
return arraybuffer;
|
|
};
|