Openpieces logoopenpieces
All contributors
PN

Priya Nair

@pnair

Infrastructure Engineer

Storage and file systems specialist. Building S3-compatible pieces for the AI data pipeline.

Bangalore, INJoined August 28, 2024github/pnair

1

Piece published

1,124

Total installs

93

Avg AI Score

Pieces by Priya Nair

s3-store

Storage

Upload, download, and list objects in any S3-compatible bucket. Supports streaming, presigned URLs, and multipart uploads for large files.

AWS S3
931,124pnair15mo ago
1import{serve}from"https://deno.land/std@0.224.0/http/server.ts";
2import{
3S3Client,
4PutObjectCommand,
5GetObjectCommand,
6}from"https://deno.land/x/s3_lite_client@v0.9.0/mod.ts";
7 
8consts3=newS3Client({
9endPoint:Deno.env.get("S3_ENDPOINT")!,
10region:Deno.env.get("S3_REGION")!,
11accessKey:Deno.env.get("S3_ACCESS_KEY")!,
12secretKey:Deno.env.get("S3_SECRET_KEY")!,
13bucket:Deno.env.get("S3_BUCKET")!,
14useSSL:true,
15});
16 
17interfaceS3Payload{
18action:"upload"|"download"|"list";
19key?:string;
20body?:string;// base64-encoded for upload
21}
22 
23asyncfunctionhandleStorage(req:Request):Promise<Response>{
24constpayload:S3Payload=awaitreq.json();
25 
26switch(payload.action){
27case"upload":{
28constbytes=Uint8Array.from(atob(payload.body!),(c)=>
29c.charCodeAt(0)
30);
31awaits3.putObject(payload.key!,bytes);
32returnnewResponse(
33JSON.stringify({uploaded:payload.key}),
34{headers:{"content-type":"application/json"}}
35);
36}
37case"download":{
38constobj=awaits3.getObject(payload.key!);
39consttext=awaitobj.text();
40returnnewResponse(text,{
41headers:{"content-type":"application/octet-stream"},
42});
43}
44case"list":{
45constobjects=[];
46forawait(constobjofs3.listObjects()){
47objects.push(obj);
48}
49returnnewResponse(JSON.stringify(objects),{
50headers:{"content-type":"application/json"},
51});
52}
53default:
54returnnewResponse("Unknown action",{status:400});
55}
56}
57 
58serve(handleStorage,{port:8080});