@forge/bridge

5.18.0-next.1-experimental-44b7a125.18.0-next.2
~

Modified (11 files)

Index: package/out/invoke/invoke.js
===================================================================
--- package/out/invoke/invoke.js
+++ package/out/invoke/invoke.js
@@ -11,21 +11,49 @@
     if (Object.values(payload).some((val) => typeof val === 'function')) {
         throw new errors_1.BridgeAPIError('Passing functions as part of the payload is not supported!');
     }
 };
-const _invoke = (functionKey, payload) => {
+/**
+ * While the rate limit metadata feature is being rolled out, the bridge may return either
+ * the resolver body directly or an object of shape `{ body, metadata }`, where the
+ * rate limit fields are reported under `metadata`.
+ */
+const isMetadataWrappedResponse = (response) => {
+    if (typeof response !== 'object' || response === null) {
+        return false;
+    }
+    const keys = Object.keys(response);
+    return keys.length === 2 && keys.includes('body') && keys.includes('metadata');
+};
+const _invoke = async (functionKey, payload, metadata) => {
+    var _a;
     if (typeof functionKey !== 'string') {
         throw new errors_1.BridgeAPIError('functionKey must be a string!');
     }
     validatePayload(payload);
-    return callBridge('invoke', { functionKey, payload });
+    const response = await callBridge('invoke', { functionKey, payload });
+    // If metadata is requested, return the response wrapped in metadata.
+    if (metadata) {
+        // If the bridge response is not wrapped in metadata, return the metadata field as undefined.
+        if (!isMetadataWrappedResponse(response)) {
+            return { body: response, metadata: undefined };
+        }
+        const requestedMetadataKeys = Object.keys(metadata !== null && metadata !== void 0 ? metadata : {}).filter((key) => (metadata === null || metadata === void 0 ? void 0 : metadata[key]) === true);
+        const responseMetadata = {};
+        for (const key of requestedMetadataKeys) {
+            responseMetadata[key] = (_a = response.metadata) === null || _a === void 0 ? void 0 : _a[key];
+        }
+        return { body: response.body, metadata: responseMetadata };
+    }
+    // If metadata is not requested, return the response directly.
+    return (isMetadataWrappedResponse(response) ? response.body : response);
 };
 const limitedInvoke = (0, utils_1.withRateLimiter)(_invoke, 500, 1000 * 25, 'Resolver calls are rate limited at 500req/25s');
 /**
  * Calls a backend resolver function by key.
  */
-function invoke(functionKey, payload) {
-    return limitedInvoke(functionKey, payload);
+function invoke(functionKey, payload, metadata) {
+    return limitedInvoke(functionKey, payload, metadata);
 }
 exports.invoke = invoke;
 /**
  * Specialises the invoke function to a given Definitions type.
Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@forge/bridge",
-  "version": "5.18.0-next.1-experimental-44b7a12",
+  "version": "5.18.0-next.2",
   "description": "Forge bridge API for custom UI apps",
   "author": "Atlassian",
   "license": "SEE LICENSE IN LICENSE.txt",
   "main": "out/index.js",
@@ -18,9 +18,9 @@
     "@forge/egress": "^2.3.2",
     "@forge/i18n": "0.0.7",
     "@forge/resolver": "1.8.0",
     "@types/history": "^4.7.11",
-    "@forge/manifest": "12.10.0-next.1-experimental-44b7a12",
+    "@forge/manifest": "12.10.0-next.1",
     "@types/iframe-resizer": "^3.5.8",
     "iframe-resizer": "^4.4.5"
   },
   "devDependencies": {
Index: package/out/invoke-endpoint/invoke-remote.d.ts.map
===================================================================
--- package/out/invoke-endpoint/invoke-remote.d.ts.map
+++ package/out/invoke-endpoint/invoke-remote.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"invoke-remote.d.ts","sourceRoot":"","sources":["../../src/invoke-endpoint/invoke-remote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,mBAAmB,EAAc,MAAM,mBAAmB,CAAC;AAEvF,oBAAY,iBAAiB,GAAG,mBAAmB,CAAC;AAEpD,eAAO,MAAM,YAAY,UAAW,iBAAiB,+CAIpD,CAAC"}
\ No newline at end of file
+{"version":3,"file":"invoke-remote.d.ts","sourceRoot":"","sources":["../../src/invoke-endpoint/invoke-remote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,mBAAmB,EAAc,MAAM,mBAAmB,CAAC;AAEvF,oBAAY,iBAAiB,GAAG,mBAAmB,CAAC;AAEpD,eAAO,MAAM,YAAY,UAAW,iBAAiB,sFAIpD,CAAC"}
\ No newline at end of file
Index: package/out/invoke-endpoint/invoke-service.d.ts.map
===================================================================
--- package/out/invoke-endpoint/invoke-service.d.ts.map
+++ package/out/invoke-endpoint/invoke-service.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"invoke-service.d.ts","sourceRoot":"","sources":["../../src/invoke-endpoint/invoke-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,mBAAmB,EAAc,MAAM,mBAAmB,CAAC;AAEvF,oBAAY,kBAAkB,GAAG,mBAAmB,CAAC;AAErD,eAAO,MAAM,aAAa,UAAW,kBAAkB,+CAItD,CAAC"}
\ No newline at end of file
+{"version":3,"file":"invoke-service.d.ts","sourceRoot":"","sources":["../../src/invoke-endpoint/invoke-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,mBAAmB,EAAc,MAAM,mBAAmB,CAAC;AAEvF,oBAAY,kBAAkB,GAAG,mBAAmB,CAAC;AAErD,eAAO,MAAM,aAAa,UAAW,kBAAkB,sFAItD,CAAC"}
\ No newline at end of file
Index: package/out/invoke/invoke.d.ts.map
===================================================================
--- package/out/invoke/invoke.d.ts.map
+++ package/out/invoke/invoke.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../src/invoke/invoke.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAInF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AA+BzD;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,OAAO,SAAS,aAAa,EAAE,CAAC,GAAG,cAAc,EACtE,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,CAAC,CAAC,CAAC;AAEd;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,GAAG,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AASrG,aAAK,MAAM,CAAC,IAAI,SAAS,WAAW,IAAI,CAAC,GAAG,SAAS,MAAM,IAAI,GAAG,MAAM,EACtE,IAAI,EAAE,GAAG,EACT,GAAG,GAAG,EAAE,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,KAC5B,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AAEnC;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,SAAS,WAAW,KAAK,MAAM,CAAC,IAAI,CAAC,CAEnE"}
\ No newline at end of file
+{"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../src/invoke/invoke.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAInF,OAAO,EACL,cAAc,EACd,aAAa,EAEb,cAAc,EAEf,MAAM,UAAU,CAAC;AAyElB;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,OAAO,SAAS,aAAa,EAAE,CAAC,GAAG,cAAc,EACtE,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9B;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,GAAG,cAAc,EACvC,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,aAAa,EACvB,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAa9B,aAAK,MAAM,CAAC,IAAI,SAAS,WAAW,IAAI,CAAC,GAAG,SAAS,MAAM,IAAI,GAAG,MAAM,EACtE,IAAI,EAAE,GAAG,EACT,GAAG,GAAG,EAAE,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,KAC5B,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AAEnC;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,SAAS,WAAW,KAAK,MAAM,CAAC,IAAI,CAAC,CAEnE"}
\ No newline at end of file
Index: package/out/types.d.ts.map
===================================================================
--- package/out/types.d.ts.map
+++ package/out/types.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE7D,oBAAY,aAAa,GAAG;KACzB,GAAG,IAAI,MAAM,GAAG,MAAM,GAAG,GAAG;CAC9B,CAAC;AAEF,oBAAY,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;AAE5D,oBAAY,mBAAmB,GAAG;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAKF,aAAK,wBAAwB,GAAG;IAC9B,mBAAmB,EAAE;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,mBAAmB,CAAC;KAC/B,CAAC;CACH,CAAC;AAEF,oBAAY,cAAc,GAAG;KAC1B,CAAC,IAAI,MAAM,wBAAwB,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;CAC/E,CAAC;AAEF,oBAAY,sBAAsB,GAAG;KAClC,CAAC,IAAI,MAAM,wBAAwB,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;CAChF,CAAC;AAEF,oBAAY,0BAA0B,CAAC,CAAC,GAAG,kBAAkB,IAAI;IAC/D,IAAI,EAAE,CAAC,CAAC;IACR,QAAQ,CAAC,EAAE,sBAAsB,CAAC;CACnC,CAAC;AAEF,oBAAY,cAAc,CAAC,CAAC,GAAG,kBAAkB,IAAI,CAAC,GAAG,0BAA0B,CAAC,CAAC,CAAC,CAAC;AAEvF,aAAK,aAAa,GAAG;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACnC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,YAAY,CAAC,CAAC;AAEhD,oBAAY,oBAAoB,GAAG,aAAa,CAAC;AACjD,oBAAY,mBAAmB,GAAG,aAAa,CAAC;AAEhD,oBAAY,oBAAoB;IAC9B,WAAW,gBAAgB;IAC3B,OAAO,YAAY;IACnB,UAAU,eAAe;CAC1B;AAED,aAAK,iBAAiB,GAAG;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,oBAAY,eAAe,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,aAAa,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,wBAAwB,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AACD,UAAU,aAAa;IACrB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB;AAED,aAAK,oBAAoB;IACvB,WAAW,gBAAgB;CAC5B;AACD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC;CACtC;AAED,oBAAY,YAAY,GAAG;IACzB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAGD,oBAAY,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAE3D,oBAAY,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC"}
\ No newline at end of file
Index: package/CHANGELOG.md
===================================================================
--- package/CHANGELOG.md
+++ package/CHANGELOG.md
@@ -1,21 +1,12 @@
 # @forge/bridge
 
-## 5.18.0-next.1-experimental-44b7a12
+## 5.18.0-next.2
 
 ### Minor Changes
 
-- b0b69a2: **Experimental — not yet ready for use.** Add a new `frontendCustomMetrics` namespace providing `frontendCustomMetrics.counter(name)` with `incr()` and `incrBy(value)` for emitting frontend custom metrics. `incrBy(value)` rejects if `value <= 0`. The metric name must exactly match a metric registered in the Forge Dev Console.
+- cea3c0e: Updates the invoke method to accept an argument `metadata` which returns selected metadata alongside the invocation response body. When enabled, the invoke method will return a response of shape { body, metadata }. The `metadata` argument is currently set-up to opt into returning rate limiting information. This can be enabled by passing in { rateLimitProperties: true } as the metadata argument.
 
-### Patch Changes
-
-- 561f8f4: Remove "storage" module from "@forge/api"
-- Updated dependencies [814b8fe]
-- Updated dependencies [8ac7dd3]
-- Updated dependencies [55c1371]
-- Updated dependencies [1a461c3]
-  - @forge/[email protected]
-
 ## 5.18.0-next.1
 
 ### Patch Changes
Index: package/out/invoke-endpoint/invoke-remote.d.ts
===================================================================
--- package/out/invoke-endpoint/invoke-remote.d.ts
+++ package/out/invoke-endpoint/invoke-remote.d.ts
@@ -1,4 +1,4 @@
 import { InvokeEndpointInput } from './invoke-endpoint';
 export declare type InvokeRemoteInput = InvokeEndpointInput;
-export declare const invokeRemote: (input: InvokeRemoteInput) => Promise<import("../types").InvokeResponse>;
+export declare const invokeRemote: (input: InvokeRemoteInput) => Promise<import("../types").InvokeResponse<import("../types").InvokeResponseBody>>;
 //# sourceMappingURL=invoke-remote.d.ts.map
\ No newline at end of file
Index: package/out/invoke-endpoint/invoke-service.d.ts
===================================================================
--- package/out/invoke-endpoint/invoke-service.d.ts
+++ package/out/invoke-endpoint/invoke-service.d.ts
@@ -1,4 +1,4 @@
 import { InvokeEndpointInput } from './invoke-endpoint';
 export declare type InvokeServiceInput = InvokeEndpointInput;
-export declare const invokeService: (input: InvokeServiceInput) => Promise<import("../types").InvokeResponse>;
+export declare const invokeService: (input: InvokeServiceInput) => Promise<import("../types").InvokeResponse<import("../types").InvokeResponseBody>>;
 //# sourceMappingURL=invoke-service.d.ts.map
\ No newline at end of file
Index: package/out/invoke/invoke.d.ts
===================================================================
--- package/out/invoke/invoke.d.ts
+++ package/out/invoke/invoke.d.ts
@@ -1,6 +1,6 @@
 import type { Definitions, DefArguments, DefResult } from '@forge/resolver/shared';
-import { InvokePayload, InvokeResponse } from '../types';
+import { InvokeMetadata, InvokePayload, InvokeResponse } from '../types';
 /**
  * Calls a resolver function with explicit payload and return types.
  *
  * The first generic is the payload shape and the second generic is the return type.
@@ -10,16 +10,16 @@
  * type Payload = { name: string };
  * type Response = { message: string };
  * const response = await invoke<Payload, Response>('greet', { name: 'Taylor' });
  */
-export declare function invoke<Payload extends InvokePayload, T = InvokeResponse>(functionKey: string, payload: Payload): Promise<T>;
+export declare function invoke<Payload extends InvokePayload, T = InvokeResponse>(functionKey: string, payload: Payload, metadata?: InvokeMetadata): Promise<InvokeResponse<T>>;
 /**
  * Calls a resolver function using the legacy generic form where the type argument is the return type.
  *
  * @example
  * const response = await invoke<{ message: string }>('greet', { name: 'Taylor' });
  */
-export declare function invoke<T = InvokeResponse>(functionKey: string, payload?: InvokePayload): Promise<T>;
+export declare function invoke<T = InvokeResponse>(functionKey: string, payload?: InvokePayload, metadata?: InvokeMetadata): Promise<InvokeResponse<T>>;
 declare type Invoke<Defs extends Definitions> = <Def extends keyof Defs & string>(call: Def, ...arg: DefArguments<Defs, Def>) => Promise<DefResult<Defs, Def>>;
 /**
  * Specialises the invoke function to a given Definitions type.
  *
Index: package/out/types.d.ts
===================================================================
--- package/out/types.d.ts
+++ package/out/types.d.ts
@@ -3,9 +3,31 @@
 import { type Scopes, type External } from '@forge/manifest';
 export declare type InvokePayload = {
     [key in number | string]: any;
 };
-export declare type InvokeResponse = Record<string, any> | void;
+export declare type InvokeResponseBody = Record<string, any> | void;
+export declare type RateLimitProperties = {
+    rateLimitRemaining?: number;
+    rateLimitReset?: number;
+    rateLimitLimit?: number;
+};
+declare type InvokeMetadataDefinition = {
+    rateLimitProperties: {
+        request: boolean;
+        response: RateLimitProperties;
+    };
+};
+export declare type InvokeMetadata = {
+    [K in keyof InvokeMetadataDefinition]?: InvokeMetadataDefinition[K]['request'];
+};
+export declare type InvokeResponseMetadata = {
+    [K in keyof InvokeMetadataDefinition]?: InvokeMetadataDefinition[K]['response'];
+};
+export declare type InvokeResponseWithMetadata<T = InvokeResponseBody> = {
+    body: T;
+    metadata?: InvokeResponseMetadata;
+};
+export declare type InvokeResponse<T = InvokeResponseBody> = T | InvokeResponseWithMetadata<T>;
 declare type FetchResponse = {
     body?: string;
     headers: {
         [key: string]: string;