Skip to content

FilenCloudDienste/filen-s3

Repository files navigation


Filen S3

A package to start a S3 server for a Filen account.

Contributors Forks Stargazers Issues License

Attention

The package is still a work in progress. DO NOT USE IT IN PRODUCTION YET. Class names, function names, types, definitions, constants etc. are subject to change until we release a fully tested and stable version.

Installation

  1. Install using NPM
npm install @filen/s3@latest
  1. Initialize the server and query it using aws-sdk
import S3Server from "@filen/s3"
import { S3 } from "aws-sdk"

const hostname = "127.0.0.1"
const port = 1700
const https = false
const sdkConfig = {} // FilenSDK config object
const endpoint = `${https ? "https" : "http"}://${hostname === "127.0.0.1" ? "local.s3.filen.io" : hostname}:${port}`

const server = new S3Server({
	hostname,
	port,
	https,
	user: {
		accessKeyId: "admin",
		secretKeyId: "admin",
		sdkConfig
	}
})

const s3 = new S3({
	accessKeyId: "admin",
	secretAccessKey: "admin",
	endpoint,
	s3ForcePathStyle: true, // Needed
	region: "filen" // Needed
})

// Start the server
await server.start()

console.log(`S3 server started on ${endpoint}`)

// List objects
await s3
	.listObjectsV2({
		Bucket: "filen",
		Prefix: ""
	})
	.promise()

S3 Compatibility

Only methods listed here are currently implemented. Due to the underlying storage most methods are impossible to implement, though we try to implement all "fundamental" needed methods.

Method 100% Compatible Info
ListObjects 🟥
  • Only supports Prefix parameter.
  • Delimeter is always set to "/".
  • Depth is always 0.
  • EncodingType is always URL.
  • There are no Markers. The server always responds with all keys matching the Prefix.
  • *
ListObjectsV2 🟥
  • Only supports Prefix parameter.
  • Delimeter is always set to "/".
  • Depth is always 0.
  • EncodingType is always URL.
  • There are no ContinuationTokens. The server always responds with all keys matching the Prefix.
  • *
ListBuckets  
HeadBucket 🟥
  • Only returns "x-amz-bucket-region" header.
HeadObject *
GetObject *
DeleteObject
  • Also supports deleting directories.
DeleteObjects
  • Also supports deleting directories.
PutObject 🟥
  • Only returns ETag header. *
CopyObject 🟥
  • Only returns ETag and LastModified as the CopyObjectResult. *

* An objects ETag is always its UUID. Since Filen is fully end-to-end encrypted there is no way to know the real MD5 file hash.

License

Distributed under the AGPL-3.0 License. See LICENSE for more information.