npm package diff
Package: @forge/storage
Versions: 1.5.15-experimental-10722bc - 1.6.0-next.0
File: package/out/global-storage.js
Index: package/out/global-storage.js
===================================================================
--- package/out/global-storage.js
+++ package/out/global-storage.js
@@ -26,12 +26,14 @@
}
class GlobalStorage {
getAppContextAri;
apiClient;
+ getMetrics;
endpoint = '/forge/entities/graphql';
- constructor(getAppContextAri, apiClient) {
+ constructor(getAppContextAri, apiClient, getMetrics) {
this.getAppContextAri = getAppContextAri;
this.apiClient = apiClient;
+ this.getMetrics = getMetrics;
}
doGetAppContextAri() {
return typeof this.getAppContextAri === 'function' ? this.getAppContextAri() : this.getAppContextAri;
}
@@ -44,9 +46,9 @@
async list(options) {
const requestBody = process.env.IS_CLEANUP_FUNCTION === 'true'
? gql_queries_1.UntypedQueries.listQueryForCleanup(this.doGetAppContextAri(), options)
: gql_queries_1.UntypedQueries.listQuery(this.doGetAppContextAri(), options);
- const response = await this.query(requestBody);
+ const response = await this.wrapInMetric('untyped', 'query', false, async () => await this.query(requestBody));
const edges = process.env.IS_CLEANUP_FUNCTION === 'true'
? response.appStoredEntitiesForCleanup.edges
: response.appStoredEntities.edges;
const nextCursor = edges.length > 0 ? edges[edges.length - 1].cursor : undefined;
@@ -55,21 +57,11 @@
results,
nextCursor
};
}
- async transaction(options, isCustomEntity) {
- if (isCustomEntity) {
- const requestBody = gql_queries_1.CustomEntityQueries.transaction(this.doGetAppContextAri(), options);
- await this.mutation(requestBody, 'appStorageCustomEntity', 'transactAppStoredCustomEntity');
- }
- else {
- const requestBody = gql_queries_1.UntypedQueries.transaction(this.doGetAppContextAri(), options);
- await this.mutation(requestBody, 'appStorage', 'transactAppStoredEntity');
- }
- }
async listCustomEntities(options) {
const requestBody = gql_queries_1.CustomEntityQueries.listQuery(this.doGetAppContextAri(), options);
- const response = await this.query(requestBody);
+ const response = await this.wrapInMetric('typed', 'query', false, async () => await this.query(requestBody));
const edges = response.appStoredCustomEntities.edges;
const results = edges.map(({ node }) => node);
return {
results,
@@ -77,51 +69,41 @@
};
}
async set(key, value) {
const requestBody = gql_queries_1.UntypedQueries.set(this.doGetAppContextAri(), key, value, false);
- await this.mutation(requestBody, 'appStorage', 'setAppStoredEntity');
+ await this.wrapInMetric('untyped', 'set', false, async () => await this.mutation(requestBody, 'appStorage', 'setAppStoredEntity'));
}
async setSecret(key, value) {
const requestBody = gql_queries_1.UntypedQueries.set(this.doGetAppContextAri(), key, value, true);
- await this.mutation(requestBody, 'appStorage', 'setAppStoredEntity');
+ await this.wrapInMetric('untyped', 'set', true, async () => await this.mutation(requestBody, 'appStorage', 'setAppStoredEntity'));
}
- async bulkSet(items) {
- const requestBody = gql_queries_1.UntypedQueries.bulkSet(this.doGetAppContextAri(), items, false);
- const response = await this.mutation(requestBody, 'appStorage', 'setAppStoredEntities', true);
- const failedKeys = response.failedKeys;
- const savedKeys = response.savedKeys;
- return {
- savedKeys,
- failedKeys
- };
- }
async delete(key) {
const requestBody = gql_queries_1.UntypedQueries.delete(this.doGetAppContextAri(), key, false);
- await this.mutation(requestBody, 'appStorage', 'deleteAppStoredEntity');
+ await this.wrapInMetric('untyped', 'delete', false, async () => this.mutation(requestBody, 'appStorage', 'deleteAppStoredEntity'));
}
async deleteSecret(key) {
const requestBody = gql_queries_1.UntypedQueries.delete(this.doGetAppContextAri(), key, true);
- await this.mutation(requestBody, 'appStorage', 'deleteAppStoredEntity');
+ await this.wrapInMetric('untyped', 'delete', true, async () => this.mutation(requestBody, 'appStorage', 'deleteAppStoredEntity'));
}
async getEntity(entityName, entityKey) {
return this.getEntityInternal(entityName, entityKey);
}
async setEntity(entityName, entityKey, value) {
const requestBody = gql_queries_1.CustomEntityQueries.set(this.doGetAppContextAri(), entityName, entityKey, value);
- await this.mutation(requestBody, 'appStorageCustomEntity', 'setAppStoredCustomEntity');
+ await this.wrapInMetric('typed', 'set', false, async () => this.mutation(requestBody, 'appStorageCustomEntity', 'setAppStoredCustomEntity'));
}
async deleteEntity(entityName, entityKey) {
const requestBody = gql_queries_1.CustomEntityQueries.delete(this.doGetAppContextAri(), entityName, entityKey);
- await this.mutation(requestBody, 'appStorageCustomEntity', 'deleteAppStoredCustomEntity');
+ await this.wrapInMetric('typed', 'delete', false, async () => await this.mutation(requestBody, 'appStorageCustomEntity', 'deleteAppStoredCustomEntity'));
}
async getInternal(key, encrypted) {
const requestBody = gql_queries_1.UntypedQueries.get(this.doGetAppContextAri(), key, encrypted);
- const { appStoredEntity: { value } } = await this.query(requestBody);
+ const { appStoredEntity: { value } } = await this.wrapInMetric('untyped', 'get', encrypted, async () => await this.query(requestBody));
return value ?? undefined;
}
async getEntityInternal(entityName, entityKey) {
const requestBody = gql_queries_1.CustomEntityQueries.get(this.doGetAppContextAri(), entityName, entityKey);
- const { appStoredCustomEntity: { value } } = await this.query(requestBody);
+ const { appStoredCustomEntity: { value } } = await this.wrapInMetric('typed', 'get', false, async () => await this.query(requestBody));
return value ?? undefined;
}
buildRequest(requestBody) {
return {
@@ -135,18 +117,46 @@
async query(body) {
const response = await this.apiClient(this.endpoint, this.buildRequest(body));
return await getResponseBody(response);
}
- async mutation(body, namespace, mutationMethod, returnResponseBody) {
+ async mutation(body, namespace, mutationMethod) {
const response = await this.apiClient(this.endpoint, this.buildRequest(body));
- const { [namespace]: { [mutationMethod]: mutationResponse } } = await getResponseBody(response);
- assertNoErrors(mutationResponse.errors);
- if (!mutationResponse.success) {
+ const { [namespace]: { [mutationMethod]: { success, errors } } } = await getResponseBody(response);
+ assertNoErrors(errors);
+ if (!success) {
throw errors_1.APIError.forStatus(500);
}
- if (returnResponseBody) {
- return mutationResponse;
- }
return response;
}
+ async wrapInMetric(store, operation, encrypted, fn) {
+ const metrics = this.getMetrics();
+ const timer = metrics
+ .timing('forge.runtime.storage.operation.latency', { store, operation, encrypted: String(encrypted) })
+ .measure();
+ try {
+ const result = await fn();
+ timer.stop({ success: 'true' });
+ metrics
+ .counter('forge.runtime.storage.operation', {
+ store,
+ operation,
+ encrypted: String(encrypted),
+ success: 'true'
+ })
+ .incr();
+ return result;
+ }
+ catch (error) {
+ timer.stop({ success: 'false' });
+ metrics
+ .counter('forge.runtime.storage.operation', {
+ store,
+ operation,
+ encrypted: String(encrypted),
+ success: 'false'
+ })
+ .incr();
+ throw error;
+ }
+ }
}
exports.GlobalStorage = GlobalStorage;