budibase/packages/datastores/datastores/azure-blob.js

86 lines
2.3 KiB
JavaScript

import {SharedKeyCredential, BlockBlobURL,
BlobURL, ContainerURL, ServiceURL,
StorageURL, Aborter} from "@azure/storage-blob";
export const createFile = ({containerUrl}) => async (key, content) => {
const blobURL = BlobURL.fromContainerURL(containerURL, key);
const blockBlobURL = BlockBlobURL.fromBlobURL(blobURL);
await blockBlobURL.upload(
Aborter.none,
content,
content.length
);
};
export const updateFile = opts => async (path, content) =>
createFile(opts)(path,content);
export const loadFile = ({containerUrl}) => async key => {
const blobURL = BlobURL.fromContainerURL(
containerUrl, key);
const downloadBlockBlobResponse =
await blobURL.download(Aborter.none, 0);
return downloadBlockBlobResponse
.readableStreamBody
.read(content.length)
.toString();
};
export const exists = ({containerURL}) => async (key) => {
const blobURL = BlobURL.fromContainerURL(containerURL, key);
const getPropsResponse = await blobURL.getProperties();
return getPropsResponse._response.StatusCode === 200;
}
export const deleteFile = ({containerURL}) => async key => {
const blobURL = BlobURL.fromContainerURL(
containerURL, key);
await blobURL.delete(Aborter.none);
}
export const createContainer = ({containerUrl}) => async () =>
await containerUrl.create(Aborter.none);
export const deleteContainer = ({containerUrl}) => async () =>
await containerUrl.delete(Aborter.none);
const initialise = opts => {
const sharedKeyCredential = new SharedKeyCredential(
opts.account,
opts.accountKey
);
const pipeline = StorageURL.newPipeline(sharedKeyCredential);
const serviceURL = new ServiceURL(
`https://${account}.blob.core.windows.net`,
pipeline
);
const containerURL = ContainerURL.fromServiceURL(
serviceURL,
opts.containerName
);
return ({
containerURL
});
};
export default opts => {
const access = initialise(opts);
return ({
createFile : createFile(access),
updateFile : updateFile(access),
loadFile : loadFile(access),
exists : exists(access),
datastoreType : "azure-blob-storage",
datastoreDescription: "",
data
});
};