fix s3path incorrectly includes bucketid

This commit is contained in:
SrGooglo 2025-04-08 19:48:20 +00:00
parent a8f7dc3c13
commit 564cecd2f0
3 changed files with 117 additions and 110 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "@comty/server", "name": "@comty/server",
"version": "1.30.2@alpha", "version": "1.30.3@alpha",
"license": "ComtyLicense", "license": "ComtyLicense",
"private": true, "private": true,
"workspaces": [ "workspaces": [

View File

@ -1,11 +1,9 @@
{ {
"name": "marketplace", "name": "marketplace",
"version": "0.60.2", "dependencies": {
"dependencies": { "7zip-min": "^1.4.4",
"@octokit/rest": "^19.0.7", "backblaze-b2": "^1.7.0",
"7zip-min": "^1.4.4", "sucrase": "^3.32.0",
"backblaze-b2": "^1.7.0", "uglify-js": "^3.17.4"
"sucrase": "^3.32.0", }
"uglify-js": "^3.17.4"
}
} }

View File

@ -5,129 +5,138 @@ import path from "node:path"
import sevenzip from "7zip-min" import sevenzip from "7zip-min"
async function uploadFolderToB2(bucketId, folderPath, b2Directory) { async function uploadFolderToB2(bucketId, folderPath, b2Directory) {
try { try {
const uploadFiles = async (dir) => { const uploadFiles = async (dir) => {
const files = fs.readdirSync(dir) const files = fs.readdirSync(dir)
for (const file of files) { for (const file of files) {
const fullPath = path.join(dir, file) const fullPath = path.join(dir, file)
const stats = fs.statSync(fullPath) const stats = fs.statSync(fullPath)
if (stats.isDirectory()) { if (stats.isDirectory()) {
await uploadFiles(fullPath) await uploadFiles(fullPath)
} else { } else {
const fileData = fs.readFileSync(fullPath) const fileData = fs.readFileSync(fullPath)
const b2FileName = path.join(b2Directory, path.relative(folderPath, fullPath)).replace(/\\/g, '/') const b2FileName = path
.join(b2Directory, path.relative(folderPath, fullPath))
.replace(/\\/g, "/")
console.log(`Uploading ${b2FileName}...`) console.log(`Uploading ${b2FileName}...`)
const uploadUrl = await b2.getUploadUrl({ const uploadUrl = await b2.getUploadUrl({
bucketId: bucketId, bucketId: bucketId,
}) })
await b2.uploadFile({ await b2.uploadFile({
uploadUrl: uploadUrl.data.uploadUrl, uploadUrl: uploadUrl.data.uploadUrl,
uploadAuthToken: uploadUrl.data.authorizationToken, uploadAuthToken: uploadUrl.data.authorizationToken,
fileName: b2FileName, fileName: b2FileName,
data: fileData, data: fileData,
}) })
console.log(`Uploaded ${b2FileName}`) console.log(`Uploaded ${b2FileName}`)
} }
} }
} }
await uploadFiles(folderPath) await uploadFiles(folderPath)
console.log('All files uploaded successfully.') console.log("All files uploaded successfully.")
} catch (error) { } catch (error) {
console.error('Error uploading folder:', error) console.error("Error uploading folder:", error)
} }
} }
export default { export default {
middlewares: ["withAuthentication"], middlewares: ["withAuthentication"],
fn: async (req, res) => { fn: async (req, res) => {
let { pkg } = req.headers let { pkg } = req.headers
if (!pkg) { if (!pkg) {
throw new OperationError(400, "Missing package") throw new OperationError(400, "Missing package")
} }
if (!req.auth) { if (!req.auth) {
throw new OperationError(401, "Unauthorized") throw new OperationError(401, "Unauthorized")
} }
pkg = JSON.parse(pkg) pkg = JSON.parse(pkg)
const { user_id } = req.auth.session const { user_id } = req.auth.session
const registryId = `${user_id}/${pkg.name}@${pkg.version}` const registryId = `${user_id}/${pkg.name}@${pkg.version}`
const s3Path = `${process.env.B2_BUCKET_ID}/extensions/${pkg.name}/${pkg.version}` const s3Path = `extensions/${pkg.name}/${pkg.version}`
const assetsUrl = `https://${process.env.B2_CDN_ENDPOINT}/${process.env.B2_BUCKET}/${s3Path}`
const workPath = path.resolve(global.cache.constructor.cachePath, String(Date.now()), registryId) const workPath = path.resolve(
const pkgPath = path.resolve(workPath, "pkg") global.cache.constructor.cachePath,
const bundlePath = path.resolve(workPath, "bundle.7z") String(Date.now()),
registryId,
)
const pkgPath = path.resolve(workPath, "pkg")
const bundlePath = path.resolve(workPath, "bundle.7z")
// console.log({ // console.log({
// user_id, // user_id,
// pkg, // pkg,
// registryId, // registryId,
// s3Path, // s3Path,
// workPath, // workPath,
// bundlePath // bundlePath
// }) // })
let extensionRegistry = await Extension.findOne({ let extensionRegistry = await Extension.findOne({
user_id: user_id, user_id: user_id,
registryId: registryId, registryId: registryId,
version: pkg.version version: pkg.version,
}) })
if (extensionRegistry) { if (extensionRegistry) {
throw new OperationError(400, "Extension already exists") throw new OperationError(400, "Extension already exists")
} }
try { try {
if (!fs.existsSync(workPath)) { if (!fs.existsSync(workPath)) {
await fs.promises.mkdir(workPath, { recursive: true }) await fs.promises.mkdir(workPath, { recursive: true })
} }
// read multipart form // read multipart form
await req.multipart(async (field) => { await req.multipart(async (field) => {
await field.write(bundlePath) await field.write(bundlePath)
}) })
await new Promise((resolve, reject) => { await new Promise((resolve, reject) => {
sevenzip.unpack(bundlePath, pkgPath, (error) => { sevenzip.unpack(bundlePath, pkgPath, (error) => {
if (error) { if (error) {
fs.promises.rm(workPath, { recursive: true, force: true }) fs.promises.rm(workPath, {
reject(error) recursive: true,
} else { force: true,
resolve() })
} reject(error)
}) } else {
}) resolve()
}
})
})
await uploadFolderToB2(process.env.B2_BUCKET_ID, pkgPath, s3Path) await uploadFolderToB2(process.env.B2_BUCKET_ID, pkgPath, s3Path)
fs.promises.rm(workPath, { recursive: true, force: true }) fs.promises.rm(workPath, { recursive: true, force: true })
const assetsUrl = `https://${process.env.B2_CDN_ENDPOINT}/${process.env.B2_BUCKET}/${s3Path}`
extensionRegistry = await Extension.create({ extensionRegistry = await Extension.create({
user_id: user_id, user_id: user_id,
name: pkg.name, name: pkg.name,
version: pkg.version, version: pkg.version,
registryId: registryId, registryId: registryId,
assetsUrl: assetsUrl, assetsUrl: assetsUrl,
srcUrl: `${assetsUrl}/src`, srcUrl: `${assetsUrl}/src`,
packageUrl: `${assetsUrl}/package.json`, packageUrl: `${assetsUrl}/package.json`,
created_at: Date.now(), created_at: Date.now(),
}) })
return extensionRegistry return extensionRegistry
} catch (error) { } catch (error) {
fs.promises.rm(workPath, { recursive: true, force: true }) fs.promises.rm(workPath, { recursive: true, force: true })
throw error throw error
} }
} },
} }