From a3b39856aa6149d9bc5c12e0b4810a4d56b3c535 Mon Sep 17 00:00:00 2001 From: Paul Butler Date: Tue, 26 Sep 2023 10:51:22 -0400 Subject: [PATCH] Export ClientToken from @y-sweet/react and @y-sweet/client --- js-pkg/client/src/main.ts | 44 +++++++++++++++++++++++++++++++++++++-- js-pkg/react/package.json | 1 - js-pkg/react/src/main.tsx | 12 ++++++++--- js-pkg/sdk/src/main.ts | 40 ----------------------------------- package-lock.json | 1 - 5 files changed, 51 insertions(+), 47 deletions(-) diff --git a/js-pkg/client/src/main.ts b/js-pkg/client/src/main.ts index ba23099b..75a1a537 100644 --- a/js-pkg/client/src/main.ts +++ b/js-pkg/client/src/main.ts @@ -1,8 +1,8 @@ import { WebsocketProvider, type WebsocketProviderParams } from './websocket' import * as Y from 'yjs' -import { ClientToken } from '@y-sweet/sdk' +import { type ClientToken } from '@y-sweet/sdk' -export { WebsocketProvider, WebsocketProviderParams } +export { WebsocketProvider, WebsocketProviderParams, ClientToken } /** * Given a {@link ClientToken}, create a {@link WebsocketProvider} for it. @@ -26,3 +26,43 @@ export function createYjsProvider( return provider } + +function stringToBase64(input: string) { + if (typeof window !== 'undefined' && window.btoa) { + // Browser + return window.btoa(input) + } else if (typeof Buffer !== 'undefined') { + // Node.js + return Buffer.from(input).toString('base64') + } else { + throw new Error('Unable to encode to Base64') + } +} + +function base64ToString(input: string) { + if (typeof window !== 'undefined' && window.atob) { + // Browser + return window.atob(input) + } else if (typeof Buffer !== 'undefined') { + // Node.js + return Buffer.from(input, 'base64').toString() + } else { + throw new Error('Unable to decode from Base64') + } +} + +export function encodeClientToken(token: ClientToken): string { + const jsonString = JSON.stringify(token) + let base64 = stringToBase64(jsonString) + base64 = base64.replace('+', '-').replace('/', '_').replace(/=+$/, '') + return base64 +} + +export function decodeClientToken(token: string): ClientToken { + let base64 = token.replace('-', '+').replace('_', '/') + while (base64.length % 4) { + base64 += '=' + } + const jsonString = base64ToString(base64) + return JSON.parse(jsonString) +} diff --git a/js-pkg/react/package.json b/js-pkg/react/package.json index 6e20a07e..16c6bec1 100644 --- a/js-pkg/react/package.json +++ b/js-pkg/react/package.json @@ -47,7 +47,6 @@ }, "dependencies": { "@y-sweet/client": "0.0.8", - "@y-sweet/sdk": "0.0.8", "y-protocols": "^1.0.5" } } diff --git a/js-pkg/react/src/main.tsx b/js-pkg/react/src/main.tsx index 31836c87..5c57afc0 100644 --- a/js-pkg/react/src/main.tsx +++ b/js-pkg/react/src/main.tsx @@ -1,12 +1,18 @@ 'use client' -import { WebsocketProvider, WebsocketProviderParams, createYjsProvider } from '@y-sweet/client' -import { ClientToken, encodeClientToken } from '@y-sweet/sdk' +import { + WebsocketProvider, + WebsocketProviderParams, + createYjsProvider, + ClientToken, + encodeClientToken, +} from '@y-sweet/client' import type { ReactNode } from 'react' import { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react' import type { Awareness } from 'y-protocols/awareness' import * as Y from 'yjs' -export { createYjsProvider, WebsocketProvider, type WebsocketProviderParams } + +export { createYjsProvider, WebsocketProvider, type WebsocketProviderParams, type ClientToken } type YjsContextType = { doc: Y.Doc diff --git a/js-pkg/sdk/src/main.ts b/js-pkg/sdk/src/main.ts index b14fe51c..9ce5212d 100644 --- a/js-pkg/sdk/src/main.ts +++ b/js-pkg/sdk/src/main.ts @@ -317,43 +317,3 @@ export async function createDoc(connectionString?: string): Promise