108 lines
3.2 KiB
JavaScript
108 lines
3.2 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _utils = require("./utils/index.cjs");
|
|
var _dataTables = require("@azure/data-tables");
|
|
var _identity = require("@azure/identity");
|
|
const DRIVER_NAME = "azure-storage-table";
|
|
module.exports = (0, _utils.defineDriver)(opts => {
|
|
const {
|
|
accountName = null,
|
|
tableName = "unstorage",
|
|
partitionKey = "unstorage",
|
|
accountKey = null,
|
|
sasKey = null,
|
|
connectionString = null,
|
|
pageSize = 1e3
|
|
} = opts;
|
|
let client;
|
|
const getClient = () => {
|
|
if (client) {
|
|
return client;
|
|
}
|
|
if (!accountName) {
|
|
throw (0, _utils.createRequiredError)(DRIVER_NAME, "accountName");
|
|
}
|
|
if (pageSize > 1e3) {
|
|
throw (0, _utils.createError)(DRIVER_NAME, "`pageSize` exceeds the maximum allowed value of `1000`");
|
|
}
|
|
if (accountKey) {
|
|
const credential = new _dataTables.AzureNamedKeyCredential(accountName, accountKey);
|
|
client = new _dataTables.TableClient(`https://${accountName}.table.core.windows.net`, tableName, credential);
|
|
} else if (sasKey) {
|
|
const credential = new _dataTables.AzureSASCredential(sasKey);
|
|
client = new _dataTables.TableClient(`https://${accountName}.table.core.windows.net`, tableName, credential);
|
|
} else if (connectionString) {
|
|
client = _dataTables.TableClient.fromConnectionString(connectionString, tableName);
|
|
} else {
|
|
const credential = new _identity.DefaultAzureCredential();
|
|
client = new _dataTables.TableClient(`https://${accountName}.table.core.windows.net`, tableName, credential);
|
|
}
|
|
return client;
|
|
};
|
|
return {
|
|
name: DRIVER_NAME,
|
|
options: opts,
|
|
getInstance: getClient,
|
|
async hasItem(key) {
|
|
try {
|
|
await getClient().getEntity(partitionKey, key);
|
|
return true;
|
|
} catch {
|
|
return false;
|
|
}
|
|
},
|
|
async getItem(key) {
|
|
try {
|
|
const entity = await getClient().getEntity(partitionKey, key);
|
|
return entity.unstorageValue;
|
|
} catch {
|
|
return null;
|
|
}
|
|
},
|
|
async setItem(key, value) {
|
|
const entity = {
|
|
partitionKey,
|
|
rowKey: key,
|
|
unstorageValue: value
|
|
};
|
|
await getClient().upsertEntity(entity, "Replace");
|
|
},
|
|
async removeItem(key) {
|
|
await getClient().deleteEntity(partitionKey, key);
|
|
},
|
|
async getKeys() {
|
|
const iterator = getClient().listEntities().byPage({
|
|
maxPageSize: pageSize
|
|
});
|
|
const keys = [];
|
|
for await (const page of iterator) {
|
|
const pageKeys = page.map(entity => entity.rowKey).filter(Boolean);
|
|
keys.push(...pageKeys);
|
|
}
|
|
return keys;
|
|
},
|
|
async getMeta(key) {
|
|
const entity = await getClient().getEntity(partitionKey, key);
|
|
return {
|
|
mtime: entity.timestamp ? new Date(entity.timestamp) : void 0,
|
|
etag: entity.etag
|
|
};
|
|
},
|
|
async clear() {
|
|
const iterator = getClient().listEntities().byPage({
|
|
maxPageSize: pageSize
|
|
});
|
|
for await (const page of iterator) {
|
|
await Promise.all(page.map(async entity => {
|
|
if (entity.partitionKey && entity.rowKey) {
|
|
await getClient().deleteEntity(entity.partitionKey, entity.rowKey);
|
|
}
|
|
}));
|
|
}
|
|
}
|
|
};
|
|
}); |