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;