S3TemporaryFileStorage is an implementation of the @lumieducation/h5p-server!ITemporaryFileStorage interface that uses a S3-compatible storage system to store files (images, video, audio etc.) that are uploaded in the editor. These files are later copied to the permanent content storage once the users save their changes.
Note: You must create the S3 bucket manually before it can be used by S3TemporaryFileStorage! It's also your responsibility to configure the bucket to automatically delete old temporary files after a sensible timespan (e.g. 1 day).
The implementation depends on this npm package:
You must add it manually to your application using npm install aws-sdk
!
You must import the storage implementation via a submodule:
import { S3TemporaryFileStorage, initS3 } from '@lumieducation/h5p-mongos3';
Initialize the storage implementation like this:
const temporaryStorage = new S3TemporaryFileStorage(
initS3({
credentials: {
accessKeyId: 's3accesskey', // optional if env. variable is set
secretAccessKey: 's3accesssecret' // optional if env. variable is set
},
endpoint: 'http://127.0.0.1:9000', // optional if env. variable is set
region: 'us-east-1' // optional if env. variable is set
forcePathStyle: true
}),
{ s3Bucket: 'h5ptemporarybucket' }
);
aws-sdk
npm
package.h5ptemporarybucket
to any name you want, but you
must specify one. You must create the bucket manually before you can use it.aws-sdk
, so
you can set any custom configuration values you want.maxKeyLength
to the value you need.
It defaults to 1024.The example Express application can be configured to use the S3 temporary storage by setting the environment variables from above and these additional variables:
An example call would be:
TEMPORARYSTORAGE=s3 AWS_ACCESS_KEY_ID=minioaccesskey AWS_SECRET_ACCESS_KEY=miniosecret AWS_S3_ENDPOINT="http://127.0.0.1:9000" TEMPORARY_AWS_S3_BUCKET=h5ptemporarybucket npm start
By default the storage implementation allows all users read access to all files and every use can create new temporary files! It is very possible that this is not something you want! You can add a function to the options object of the constructor of S3TemporaryFileStorage to customize access restrictions:
getPermissions: (
userId: string,
filename?: string
) => Promise<Permission[]>;
The function receives the userId of the user who is trying to access a filename. It must return a list of permissions the user has on the file. Your implementation of this function will probably be an adapter that hooks into your rights and permission system.