Merge branch 'refs/heads/main' into production

This commit is contained in:
James Murdza 2024-09-16 08:57:54 -07:00
commit 7aaa920815
7 changed files with 50 additions and 27 deletions

View File

@ -176,17 +176,20 @@ io.on("connection", async (socket) => {
); );
}; };
// Copy all files from the project to the container
const sandboxFiles = await getSandboxFiles(data.sandboxId); const sandboxFiles = await getSandboxFiles(data.sandboxId);
const containerFiles = containers[data.sandboxId].files;
const promises = sandboxFiles.fileData.map(async (file) => { const promises = sandboxFiles.fileData.map(async (file) => {
const filePath = path.join(dirName, file.id);
try { try {
await containers[data.sandboxId].files.makeDir( const filePath = path.join(dirName, file.id);
path.dirname(filePath) const parentDirectory = path.dirname(filePath);
); if (!containerFiles.exists(parentDirectory)) {
} catch (e: any) { await containerFiles.makeDir(parentDirectory);
console.log("Failed to create directory: " + e); }
await containerFiles.write(filePath, file.data);
} catch (e: any) {
console.log("Failed to create file: " + e);
} }
await containers[data.sandboxId].files.write(filePath, file.data);
}); });
await Promise.all(promises); await Promise.all(promises);

View File

@ -8,6 +8,7 @@
"name": "storage", "name": "storage",
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"p-limit": "^6.1.0",
"zod": "^3.23.4" "zod": "^3.23.4"
}, },
"devDependencies": { "devDependencies": {
@ -894,6 +895,21 @@
"url": "https://opencollective.com/vitest" "url": "https://opencollective.com/vitest"
} }
}, },
"node_modules/@vitest/runner/node_modules/p-limit": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz",
"integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==",
"dev": true,
"dependencies": {
"yocto-queue": "^1.0.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@vitest/snapshot": { "node_modules/@vitest/snapshot": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.3.0.tgz", "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.3.0.tgz",
@ -1766,12 +1782,11 @@
} }
}, },
"node_modules/p-limit": { "node_modules/p-limit": {
"version": "5.0.0", "version": "6.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.1.0.tgz",
"integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", "integrity": "sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==",
"dev": true,
"dependencies": { "dependencies": {
"yocto-queue": "^1.0.0" "yocto-queue": "^1.1.1"
}, },
"engines": { "engines": {
"node": ">=18" "node": ">=18"
@ -2970,10 +2985,9 @@
"dev": true "dev": true
}, },
"node_modules/yocto-queue": { "node_modules/yocto-queue": {
"version": "1.0.0", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz",
"integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==",
"dev": true,
"engines": { "engines": {
"node": ">=12.20" "node": ">=12.20"
}, },

View File

@ -17,6 +17,7 @@
"wrangler": "^3.0.0" "wrangler": "^3.0.0"
}, },
"dependencies": { "dependencies": {
"p-limit": "^6.1.0",
"zod": "^3.23.4" "zod": "^3.23.4"
} }
} }

View File

@ -1,7 +1,9 @@
import { z } from "zod" import { z } from "zod"
import pLimit from 'p-limit';
export interface Env { export interface Env {
R2: R2Bucket R2: R2Bucket
Templates: R2Bucket
KEY: string KEY: string
} }
@ -144,17 +146,18 @@ export default {
console.log(`Copying template: ${type}`); console.log(`Copying template: ${type}`);
const templateDirectory = `templates/${type}`;
// List all objects under the directory // List all objects under the directory
const { objects } = await env.R2.list({ prefix: templateDirectory }); const { objects } = await env.Templates.list({ prefix: type });
// Copy each object to the new directory // Copy each object to the new directory with a 5 concurrency limit
for (const { key } of objects) { const limit = pLimit(5);
const destinationKey = key.replace(templateDirectory, `projects/${sandboxId}`); await Promise.all(objects.map(({ key }) =>
const fileBody = await env.R2.get(key).then(res => res?.body ?? ""); limit(async () => {
const destinationKey = key.replace(type, `projects/${sandboxId}`);
const fileBody = await env.Templates.get(key).then(res => res?.body ?? "");
await env.R2.put(destinationKey, fileBody); await env.R2.put(destinationKey, fileBody);
} })
));
return success return success
} else { } else {

View File

@ -6,6 +6,7 @@ import { notFound, redirect } from "next/navigation"
import Loading from "@/components/editor/loading" import Loading from "@/components/editor/loading"
import dynamic from "next/dynamic" import dynamic from "next/dynamic"
import fs from "fs" import fs from "fs"
import { TerminalProvider } from "@/context/TerminalContext"
export const revalidate = 0 export const revalidate = 0
@ -87,8 +88,10 @@ export default async function CodePage({ params }: { params: { id: string } }) {
} }
return ( return (
<>
<div className="overflow-hidden overscroll-none w-screen flex flex-col h-screen bg-background"> <div className="overflow-hidden overscroll-none w-screen flex flex-col h-screen bg-background">
<Room id={sandboxId}> <Room id={sandboxId}>
<TerminalProvider>
<Navbar userData={userData} sandboxData={sandboxData} shared={shared} /> <Navbar userData={userData} sandboxData={sandboxData} shared={shared} />
<div className="w-screen flex grow"> <div className="w-screen flex grow">
<CodeEditor <CodeEditor
@ -96,7 +99,9 @@ export default async function CodePage({ params }: { params: { id: string } }) {
sandboxData={sandboxData} sandboxData={sandboxData}
/> />
</div> </div>
</TerminalProvider>
</Room> </Room>
</div> </div>
</>
) )
} }

View File

@ -6,7 +6,6 @@ import { ThemeProvider } from "@/components/layout/themeProvider"
import { ClerkProvider } from "@clerk/nextjs" import { ClerkProvider } from "@clerk/nextjs"
import { Toaster } from "@/components/ui/sonner" import { Toaster } from "@/components/ui/sonner"
import { Analytics } from "@vercel/analytics/react" import { Analytics } from "@vercel/analytics/react"
import { TerminalProvider } from '@/context/TerminalContext';
import { PreviewProvider } from "@/context/PreviewContext"; import { PreviewProvider } from "@/context/PreviewContext";
import { SocketProvider } from '@/context/SocketContext' import { SocketProvider } from '@/context/SocketContext'
@ -32,9 +31,7 @@ export default function RootLayout({
> >
<SocketProvider> <SocketProvider>
<PreviewProvider> <PreviewProvider>
<TerminalProvider>
{children} {children}
</TerminalProvider>
</PreviewProvider> </PreviewProvider>
</SocketProvider> </SocketProvider>
<Analytics /> <Analytics />

View File

@ -51,7 +51,7 @@ export default function Dashboard({
useEffect(() => { // update the dashboard to show a new project useEffect(() => { // update the dashboard to show a new project
router.refresh() router.refresh()
}, [sandboxes]) }, [])
return ( return (
<> <>