Skip to content

Commit

Permalink
Update storage key name with cookie name (#674)
Browse files Browse the repository at this point in the history
Reduce cookie chunk size in auth-helpers
Change x-client-info format
Add tests for cookie chunking
  • Loading branch information
silentworks authored Nov 4, 2023
1 parent 32f00bb commit 5893215
Show file tree
Hide file tree
Showing 20 changed files with 135 additions and 28 deletions.
5 changes: 5 additions & 0 deletions .changeset/four-humans-relax.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@supabase/auth-helpers-shared': patch
---

Reduce cookie chunk size
7 changes: 7 additions & 0 deletions .changeset/hip-lies-chew.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@supabase/auth-helpers-nextjs': patch
'@supabase/auth-helpers-remix': patch
'@supabase/auth-helpers-sveltekit': patch
---

Update storage key name with cookie name
5 changes: 5 additions & 0 deletions .changeset/tall-bulldogs-help.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@supabase/ssr': patch
---

Update storage key name with cookie name
5 changes: 4 additions & 1 deletion packages/nextjs/src/clientComponentClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ export function createClientComponentClient<
);
}

const storageKey = cookieOptions?.name;
delete cookieOptions?.name;

const createNewClient = () =>
createSupabaseClient<Database, SchemaName, Schema>(supabaseUrl, supabaseKey, {
...options,
Expand All @@ -49,7 +52,7 @@ export function createClientComponentClient<
}
},
auth: {
storageKey: cookieOptions?.name,
storageKey,
storage: new BrowserCookieAuthStorageAdapter(cookieOptions)
}
});
Expand Down
5 changes: 4 additions & 1 deletion packages/nextjs/src/middlewareClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,9 @@ export function createMiddlewareClient<
);
}

const storageKey = cookieOptions?.name;
delete cookieOptions?.name;

return createSupabaseClient<Database, SchemaName, Schema>(supabaseUrl, supabaseKey, {
...options,
global: {
Expand All @@ -98,7 +101,7 @@ export function createMiddlewareClient<
}
},
auth: {
storageKey: cookieOptions?.name,
storageKey,
storage: new NextMiddlewareAuthStorageAdapter(context, cookieOptions)
}
});
Expand Down
5 changes: 4 additions & 1 deletion packages/nextjs/src/pagesServerClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,9 @@ export function createPagesServerClient<
);
}

const storageKey = cookieOptions?.name;
delete cookieOptions?.name;

return createSupabaseClient<Database, SchemaName, Schema>(supabaseUrl, supabaseKey, {
...options,
global: {
Expand All @@ -97,7 +100,7 @@ export function createPagesServerClient<
}
},
auth: {
storageKey: cookieOptions?.name,
storageKey,
storage: new NextServerAuthStorageAdapter(context, cookieOptions)
}
});
Expand Down
5 changes: 4 additions & 1 deletion packages/nextjs/src/routeHandlerClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ export function createRouteHandlerClient<
);
}

const storageKey = cookieOptions?.name;
delete cookieOptions?.name;

return createSupabaseClient<Database, SchemaName, Schema>(supabaseUrl, supabaseKey, {
...options,
global: {
Expand All @@ -77,7 +80,7 @@ export function createRouteHandlerClient<
}
},
auth: {
storageKey: cookieOptions?.name,
storageKey,
storage: new NextRouteHandlerAuthStorageAdapter(context, cookieOptions)
}
});
Expand Down
5 changes: 4 additions & 1 deletion packages/nextjs/src/serverComponentClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ export function createServerComponentClient<
);
}

const storageKey = cookieOptions?.name;
delete cookieOptions?.name;

return createSupabaseClient<Database, SchemaName, Schema>(supabaseUrl, supabaseKey, {
...options,
global: {
Expand All @@ -74,7 +77,7 @@ export function createServerComponentClient<
}
},
auth: {
storageKey: cookieOptions?.name,
storageKey,
storage: new NextServerComponentAuthStorageAdapter(context, cookieOptions)
}
});
Expand Down
10 changes: 8 additions & 2 deletions packages/remix/src/createSupabaseClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@ export function createBrowserClient<
);
}

const storageKey = cookieOptions?.name;
delete cookieOptions?.name;

return createSupabaseClient<Database, SchemaName, Schema>(supabaseUrl, supabaseKey, {
...options,
global: {
Expand All @@ -122,7 +125,7 @@ export function createBrowserClient<
}
},
auth: {
storageKey: cookieOptions?.name,
storageKey,
storage: new BrowserCookieAuthStorageAdapter(cookieOptions)
}
});
Expand Down Expand Up @@ -194,6 +197,9 @@ export function createServerClient<
);
}

const storageKey = cookieOptions?.name;
delete cookieOptions?.name;

return createSupabaseClient<Database, SchemaName, Schema>(supabaseUrl, supabaseKey, {
...options,
global: {
Expand All @@ -204,7 +210,7 @@ export function createServerClient<
}
},
auth: {
storageKey: cookieOptions?.name,
storageKey,
storage: new RemixServerAuthStorageAdapter(request, response, cookieOptions)
}
});
Expand Down
4 changes: 2 additions & 2 deletions packages/shared/src/chunker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ function createChunkRegExp(chunkSize: number) {
return new RegExp('.{1,' + chunkSize + '}', 'g');
}

const MAX_CHUNK_SIZE = 3600;
const MAX_CHUNK_SIZE = 3180;
const MAX_CHUNK_REGEXP = createChunkRegExp(MAX_CHUNK_SIZE);

/**
Expand Down Expand Up @@ -35,7 +35,7 @@ export function createChunks(key: string, value: string, chunkSize?: number): Ch
}

// Get fully constructed chunks
export function combineChunk(
export function combineChunks(
key: string,
retrieveChunk: (name: string) => string | null | undefined = () => {
return null;
Expand Down
4 changes: 2 additions & 2 deletions packages/shared/src/cookieAuthStorageAdapter.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { GoTrueClientOptions, Session } from '@supabase/supabase-js';
import { DEFAULT_COOKIE_OPTIONS, parseSupabaseCookie, stringifySupabaseSession } from './utils';
import { CookieOptions, DefaultCookieOptions } from './types';
import { combineChunk, createChunks } from './chunker';
import { combineChunks, createChunks } from './chunker';

export interface StorageAdapter extends Exclude<GoTrueClientOptions['storage'], undefined> {}

Expand Down Expand Up @@ -32,7 +32,7 @@ export abstract class CookieAuthStorageAdapter implements StorageAdapter {
return JSON.stringify(parseSupabaseCookie(value));
}

const chunks = combineChunk(key, (chunkName) => {
const chunks = combineChunks(key, (chunkName) => {
return this.getCookie(chunkName);
});

Expand Down
30 changes: 25 additions & 5 deletions packages/shared/tests/chunker.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { describe, expect, it } from 'vitest';
import { combineChunk, createChunks } from '../src/chunker';
import { CHUNK_STRING } from './helper';
import { combineChunks, createChunks } from '../src/chunker';
import { CHUNK_STRING, DOUBLE_CHUNK_STRING, len } from './helper';

describe('chunker', () => {
it('should not chunk and return one item', () => {
Expand All @@ -10,7 +10,7 @@ describe('chunker', () => {

it('should chunk and return two chunks', () => {
const chunked = createChunks('my-chunks', CHUNK_STRING, 2000);
const combined = combineChunk('my-chunks', (name) => {
const combined = combineChunks('my-chunks', (name) => {
let chunk = chunked.find((chunk) => {
return chunk.name === name;
});
Expand All @@ -22,7 +22,7 @@ describe('chunker', () => {

it('should chunk and return twelve chunks', () => {
const chunked = createChunks('my-chunks', CHUNK_STRING, 320);
const combined = combineChunk('my-chunks', (name) => {
const combined = combineChunks('my-chunks', (name) => {
let chunk = chunked.find((chunk) => {
return chunk.name === name;
});
Expand All @@ -34,7 +34,7 @@ describe('chunker', () => {

it('should chunk and return one hundred and one chunks', () => {
const chunked = createChunks('my-chunks', CHUNK_STRING, 36);
const combined = combineChunk('my-chunks', (name) => {
const combined = combineChunks('my-chunks', (name) => {
let chunk = chunked.find((chunk) => {
return chunk.name === name;
});
Expand All @@ -43,4 +43,24 @@ describe('chunker', () => {
expect(chunked.length).toBe(101);
expect(combined).toBe(CHUNK_STRING);
});

it('should chunk and return correct size chunks', async () => {
const key = 'sb-xdbaubpgcisziicojymj-auth-token';
const chunked = createChunks(key, DOUBLE_CHUNK_STRING);
const combined = await combineChunks(key, (name) => {
let chunk = chunked.find((chunk) => {
return chunk.name === name;
});
return chunk?.value;
});

chunked.forEach((chunk, i) => {
expect(chunk.name).toBe(`${key}.${i}`);
expect([3217, 3217, 899]).toContain(len(`${chunk.name}=${chunk.value}`));
});

expect(chunked.length).toBe(3);
expect(len(`${key}=${DOUBLE_CHUNK_STRING}`)).toBe(7257);
expect(combined).toBe(DOUBLE_CHUNK_STRING);
});
});
7 changes: 7 additions & 0 deletions packages/shared/tests/helper.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,9 @@
export const len = (str) => {
let size = Buffer.from(str).length;
return size;
};

export const CHUNK_STRING =
'zDq8KDAdv4PwF3UOp3mnEyx1xY71CaY4ZJdPTG8HpLHy3bCYs1x3vwPXdUqY75d0LYHL8KhxgrKqBEK531igiQNk1KqUKmMsabNlwcaF5E2gXA79vpwlxvi1wecwmKGVig4mJ0dzEEXKNsLgyQCsjKOpI7Nw2gnGAKKFdHle1SJeuFj9PyAHx9stMvQFpRQhoLRt3iI0uFA.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.lww9VHv5CCETYEFj9Q1emgiZI2nXZuvHbyJmIbYgMF9w533oG8ZEsdiKo81LAflQeUHYbbxOXTtroR2bdax0VYgjZ2qg5YeOnekqbgyDXwvmsOMktvg4x7JBJiHjzKK2kSPX0cCAhcU17ydRx19xq1gOUBup1j4kqEBbvKFKt67cfqZhT4kiERgbOt6mIyurSzUPgAhBNiqUJPM3872jVtweoum6mAfSgnG4H1qs2oNZjrbGi6Xv1H5WPALAdNzDwca0evrbbufUCKDX0XO27UTAFh9k4UFf0Dk1pPgKhomuWsfsJAJDvo2ZimmkXrlUo8OfihbpGCLMbEDRpxyIcIGTUQ30WeCyaHo2ds2hs2sh';

export const DOUBLE_CHUNK_STRING = `${CHUNK_STRING}${CHUNK_STRING}`;
6 changes: 5 additions & 1 deletion packages/ssr/src/createBrowserClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,23 +44,27 @@ export function createBrowserClient<
let cookies: CookieMethods = {};
let isSingleton = true;
let cookieOptions: CookieOptionsWithName | undefined;
let storageKey: string | undefined = undefined;
let userDefinedClientOptions;

if (options) {
({ cookies, isSingleton = true, cookieOptions, ...userDefinedClientOptions } = options);
storageKey = cookieOptions?.name;
delete cookieOptions?.name;
}

const cookieClientOptions = {
global: {
headers: {
'X-Client-Info': `${PACKAGE_NAME}@${PACKAGE_VERSION}`
'X-Client-Info': `${PACKAGE_NAME}/${PACKAGE_VERSION}`
}
},
auth: {
flowType: 'pkce',
autoRefreshToken: isBrowser(),
detectSessionInUrl: isBrowser(),
persistSession: true,
storageKey,
storage: {
getItem: async (key: string) => {
const chunkedCookie = await combineChunks(key, async (chunkName) => {
Expand Down
6 changes: 5 additions & 1 deletion packages/ssr/src/createServerClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,17 +38,21 @@ export function createServerClient<

const { cookies, cookieOptions, ...userDefinedClientOptions } = options;

const storageKey = cookieOptions?.name;
delete cookieOptions?.name;

const cookieClientOptions = {
global: {
headers: {
'X-Client-Info': `${PACKAGE_NAME}@${PACKAGE_VERSION}`
'X-Client-Info': `${PACKAGE_NAME}/${PACKAGE_VERSION}`
}
},
auth: {
flowType: 'pkce',
autoRefreshToken: isBrowser(),
detectSessionInUrl: isBrowser(),
persistSession: true,
storageKey,
storage: {
getItem: async (key: string) => {
const chunkedCookie = await combineChunks(key, async (chunkName: string) => {
Expand Down
35 changes: 28 additions & 7 deletions packages/ssr/tests/chunker.spec.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,29 @@
import { describe, expect, it } from 'vitest';
import { combineChunks, createChunks } from '../src/utils/chunker';
import { CHUNK_STRING } from './helper';
import { CHUNK_STRING, DOUBLE_CHUNK_STRING, len } from './helper';

describe('chunker', () => {
it('should not chunk and return one item', () => {
const chunked = createChunks('my-chunks', 'hello-world');
expect(chunked.length).toBe(1);
});

it('should chunk and return two chunks', () => {
it('should chunk and return two chunks', async () => {
const chunked = createChunks('my-chunks', CHUNK_STRING, 2000);
const combined = combineChunks('my-chunks', (name) => {
const combined = await combineChunks('my-chunks', (name) => {
let chunk = chunked.find((chunk) => {
return chunk.name === name;
});
return chunk?.value;
});
expect(len(`my-chunks=${CHUNK_STRING}`)).toBe(3621);
expect(chunked.length).toBe(2);
expect(combined).toBe(CHUNK_STRING);
});

it('should chunk and return twelve chunks', () => {
it('should chunk and return twelve chunks', async () => {
const chunked = createChunks('my-chunks', CHUNK_STRING, 320);
const combined = combineChunks('my-chunks', (name) => {
const combined = await combineChunks('my-chunks', (name) => {
let chunk = chunked.find((chunk) => {
return chunk.name === name;
});
Expand All @@ -32,9 +33,9 @@ describe('chunker', () => {
expect(combined).toBe(CHUNK_STRING);
});

it('should chunk and return one hundred and one chunks', () => {
it('should chunk and return one hundred and one chunks', async () => {
const chunked = createChunks('my-chunks', CHUNK_STRING, 36);
const combined = combineChunks('my-chunks', (name) => {
const combined = await combineChunks('my-chunks', (name) => {
let chunk = chunked.find((chunk) => {
return chunk.name === name;
});
Expand All @@ -43,4 +44,24 @@ describe('chunker', () => {
expect(chunked.length).toBe(101);
expect(combined).toBe(CHUNK_STRING);
});

it('should chunk and return correct size chunks', async () => {
const key = 'sb-xdbaubpgcisziicojymj-auth-token';
const chunked = createChunks(key, DOUBLE_CHUNK_STRING);
const combined = await combineChunks(key, (name) => {
let chunk = chunked.find((chunk) => {
return chunk.name === name;
});
return chunk?.value;
});

chunked.forEach((chunk, i) => {
expect(chunk.name).toBe(`${key}.${i}`);
expect([3217, 3217, 899]).toContain(len(`${chunk.name}=${chunk.value}`));
});

expect(chunked.length).toBe(3);
expect(len(`${key}=${DOUBLE_CHUNK_STRING}`)).toBe(7257);
expect(combined).toBe(DOUBLE_CHUNK_STRING);
});
});
7 changes: 7 additions & 0 deletions packages/ssr/tests/helper.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,9 @@
export const len = (str) => {
let size = Buffer.from(str).length;
return size;
};

export const CHUNK_STRING =
'zDq8KDAdv4PwF3UOp3mnEyx1xY71CaY4ZJdPTG8HpLHy3bCYs1x3vwPXdUqY75d0LYHL8KhxgrKqBEK531igiQNk1KqUKmMsabNlwcaF5E2gXA79vpwlxvi1wecwmKGVig4mJ0dzEEXKNsLgyQCsjKOpI7Nw2gnGAKKFdHle1SJeuFj9PyAHx9stMvQFpRQhoLRt3iI0uFA.axN9TdbRmcyIVYroYWoIVHJCvQceRtCjF8dDpmEqD4PRhvuGPue3fLQITp90RXJ3Fchvz7uhJcyjPWchXFNSKQsxVd02bt1RizkNijBglwZQAWHB8qIBQ2XQ7iRXjWOjbOyOQk6I2tr99FWDOKVD5XElchlu0GgQNsxQoC6Q3twecZKWenvYNAhjoPQZCxzOdg4kFBGrCZzOJp6cIZD8Mu4XCnlZTXzDCqyLPusfUvgzABe87pj8h9seo2yllyq8CtQaGysRE849qcoLRQVeBFSEm6FHvJw3QJla9K25wiBTfxVWr7JzIE7za5IrNQUyHqGnlC577AX1TPrqPWyIMGNs5nxrEHJdUNrHV3PD0iXob7WWsjFFc9HS3m2BSPCn4gnNgfHVkewlf1sYm8C0notbKvBV4MPloXdxEtC1QM79ElTr1VrhHWRT2RewabZYcQuTh4kl2BbZCZ3yjlrJ0Sj2Ndl4pyk95nOU3JaboyPJtAjMDc6625OJFRHL9USACMojBSVOzYhSUk6gV2TYkBjzY4L5KytYDc0ONey8LnXUVLwzZLVVFuiuiXO1WQf7DY0TBttEr1tsApBMYveSR39o73yPeTnVikjRpJtEfqhgwU22afFfiaTqnaRU51WDjW0o7ncHONI9PxhAxKjOwcZzjqnrHu9lN6n2dbRLGArqKyFdRaVETsNRxREJv4E57blQqAgCClSIJvvBWcIvMphjDPixgZFzd2hJbCfo9XfHiw0KK5OgVBGuoV6Z2xYa9PFi9FYtshvswHSUXia05bmBF395M30dyzbBpeVAgnJDroB2EflfrydMTmlk3cgfam3b9cRydTalqzLlRQsYIsUnj244KTKG0gkeeewkqUCEi8coALaVHEJSe4WWVjrUoq2wY2XM8cvXv33OFrxwmkKdGFuXWGdXOyF4pcsUD2DMI75FkGpUaEdkTNjWgn1Y003lSsSRXj6LhAflPzDyn5aIXfkgjLlk4x4pWa7xFpbHlv7QGW5S9G9OPYVjx5gRO1vQW1zzOvzZEHwLe1dZjZ7wZJbhJJwShWV7lQuECXcqdNlYMtuNDvhuKflvZh2vfsLryXlkgPH5VB7ES0MAl1VIqKZFChlUiRbrQHsgRZaFkWAnB1npipKt0kmFuu4H0587aHrsvQBkPCfOYUK0jFbOibpEksiaPdGCw3CL9UCOO2ObzrAJCLbvs5qRbjZ9fhDDS6MVabflCqchwOC2PAeD0B4MRVC2K7zCy7NTSTnnTH9Pu8OXVq1wYqAMbW0cbM8G7hq1CigFdwsMDjDjObveRbeGn9ei38FWrLCTyI2kbIi0oI7jdpg176Y1brt7eOdJ0aIUzQyN8ALP46LPDG2ZC5vPh5Qk0HXIBFg8FRdLCHTWKU6FtOiQKwDTzzNQyjtfMJNko6JQYrlph9eC8nSGmzx2VN5MGOoJrkBpVRNX5eWD0phPls0guTRm3ce81s4FlKG70FqDZVNCbaRtTfc818QgI7xgWmMtDpcnyl0tlTbbdiUBGEHSIJ9TdEtckq2ZtE3bQm2g1OIBcp3SyFMuT26gxPtLUl0X88zv2V99cHmcQ5CHu1ZwAa8EabVyrS69KwGmxkjdhXQGAKGDQRN71dOHiOKGRNUrBjqhtW3uSvVuvlQBg9H5lYAWvnk4q4nCNJpTkV5DG1EfkP91FznHoY5LYVlfsdnWO5KQLHAx14SHT74wMlwYjEkenbUGJL05ZatifLENgxVBLP8k5nZxy77aZ33EgCI9U0cb4KVALcFPWylWCsQahOmUFHiCzH5oEhHIROmme1blTnlw9jdAlXczVIB7TZB4FrWMhdEHj8AnavFnVjvqlneoM9bsDOdmMzzyAmROpHGDXmjr41bmXXAwEXCN2AObGcMNOLuY1RoIISsWVS8UZAvaAOwfT7M69Db5z9bdOEmBhHk05yldK448NyNyPOHh3nFeol02cMZUpNgyz7zAVZACxcHxNOfFj1n3pJ6oXO0NkSclZhTwPmqN7iv3D6LfFvLDFPonBcTFSLStHy8YaGwxSV8YgD2wRqpqJBxvWOIXnxLD7w9E6X5fZE8id3KbRX52yDmsRdBuslAZgfmA3S0HCzDKoKwE6ZErwdbSHDuNXcHArIccYkGCV2cZk1anyz3WMWfNAjtcYr5IPueqPvnl272dUarETDZC1KUXl2f1u8iX0PN2k115V5KdmAYX0dAKZoY1K9JyJn9HDyPiKgg0m5ZvbHlHTuPV8SHDAQfGsbQQEUEjx9qVjPwKwYO3niDj8yRK1FO1R7Cq27sDE3gYNarKoGOCy2HGptxnmI537yUeMMfsAtPUWiz98NKHWTpBEFNZGEXyYI86n60IWmgW5r4QGFbWUnypiJVVLuLwTEP1MF4PQZapkWPDLhN77gIxTXS8xrhKWoe3LZljrybqu27aWIR1SbboOjkR1LJkOoQU0JdZoLGWCjy0n2d0B0k6Ji6sZrSdr7CmyotnopPuTJ4sGfdGfHKRg92bDOZ6qkfM3eQWQulQSH1xNgriwJfoceeBmZCv2SuqbxwAtTL8mk2aeW2mMHPdMZHEEdPBNCl8QXCnRaHh0JiKgotIZ1xd6qKdjkBIScnrZv41B0AB2BbcNIB8OlmIK4UE4cpysMXFByXqv08Z7JzrBcTroHuITUPUWZrq1duCHKKesd6gdfJCeTHvgC3RJg8tY44DG1VrrSWJMj7wZ6vBmLTB5OtXUgxvbzb6GfBwjpTcm3cSrse23Tt8T26FeqgTO5oQWpZsjxRsYjPUVbqNwpKCrJPSWPfOgOAbA1JliLgcdxvaUHtOY3RtOWff6BQuYD5MCtiD4PIymoAwFL3TNLLkNN51VIq0nI3VIRKqHf9fM2y74UzZnNPpWU4Vbaq21i2i40tDzMxyeT67i276AXKPwJvPzSkyLWYayAinV6nYtdyiQY273m5hKlDyYJhwuuZLyDy21Hr1uKObu9CoZNOxNuU3ON54Aoh56AbYxv4EL9C15ZJKTdqbaf2GVPFqHn7CIqv4Od8xfwCUr0N6cP.lww9VHv5CCETYEFj9Q1emgiZI2nXZuvHbyJmIbYgMF9w533oG8ZEsdiKo81LAflQeUHYbbxOXTtroR2bdax0VYgjZ2qg5YeOnekqbgyDXwvmsOMktvg4x7JBJiHjzKK2kSPX0cCAhcU17ydRx19xq1gOUBup1j4kqEBbvKFKt67cfqZhT4kiERgbOt6mIyurSzUPgAhBNiqUJPM3872jVtweoum6mAfSgnG4H1qs2oNZjrbGi6Xv1H5WPALAdNzDwca0evrbbufUCKDX0XO27UTAFh9k4UFf0Dk1pPgKhomuWsfsJAJDvo2ZimmkXrlUo8OfihbpGCLMbEDRpxyIcIGTUQ30WeCyaHo2ds2hs2sh';

export const DOUBLE_CHUNK_STRING = `${CHUNK_STRING}${CHUNK_STRING}`;
Loading

0 comments on commit 5893215

Please sign in to comment.