From 6fb995a90e1ff5968a4cfd1a84b578acb1b253f8 Mon Sep 17 00:00:00 2001 From: Kevin Pearson Date: Mon, 22 Jul 2024 09:52:38 -0700 Subject: [PATCH 1/8] Adding application context sections, adding documentation on selecting the provider should a request parameter. --- .../app-passthrough-apis.md | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index 826f7bed3..863614cf8 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -34,12 +34,13 @@ The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL - [4.4. Pass-through notifications](#44-pass-through-notifications) - [5. Provider Candidates](#5-provider-candidates) - [6. Best Candidate](#6-best-candidate) -- [7. Result Transformations](#7-result-transformations) -- [8. Provider Parameter Injection](#8-provider-parameter-injection) -- [9. API Gateway](#9-api-gateway) -- [10. Example: User Interest](#10-example-user-interest) - - [10.1. User Interest Pull](#101-user-interest-pull) - - [10.2. User Interest Push](#102-user-interest-push) +- [7. Application Context](#7-application-context) + - [7.1 Application Context Sharing](#71-application-context-sharing) + - [7.2 Application Context Setting](#72-application-context-setting) +- [8. API Gateway](#9-api-gateway) +- [9. Example: User Interest](#10-example-user-interest) + - [9.1. User Interest Pull](#101-user-interest-pull) + - [9.2. User Interest Push](#102-user-interest-push) ## 3. Open RPC Extensions @@ -227,26 +228,36 @@ consideration. If there is only one candidate left then it **MUST** be the best candidate. +If appId is set in the request [(See Application Context Setting)](#72-application-context-setting), then that app must be used for selecting the provider. + If there is more than one candidate left, then the candidate app that most recently had RCU input focus **MUST** be the best candidate. If none of the candidates have had focus yet, then the candidate app that was most recently launched **MUST** be the best candidate. -## 7. Result Transformations -A platform method may be configured to insert the providing app id into composite values. This is not allowed in non-composite results to avoid collisions with the provder method sending an appId and Firebolt overriding it. + +## 7. Application Context + +Application Context provides a mechanism for applications to know the identity of the applications they are communicating with. Application Context can be given in both directions. An application that uses a capability can know which app is providing that capability. An application that provides a capability can know which app is using that capability. + +### 7.1 Application Context Sharing + +Application Context is shared by having either a "composite result" or a "composite request". If a "composite result" was used to wrap the provider method value and the platform method's schema has an `appId` `string` property at the top level then the property's value **MUST** be set to the the appId of the providing app for that result. -## 8. Provider Parameter Injection -If the provider method has a parameter named `appId` and the platform method *does not*, then the appId of the app calling the platform method **MUST** be sent to the provider in the `appId` parameter. +If a platform method is an `event` and the event result is a "composite result" with an `appId` `string` property at the top level, then the property **MUST** be set to the appId that initiated the provider (push) call. + +If the provider method is a "composite request" with `appId` `string` property at the top level but the platform method does not have `appId`, then the id of app that initiated the platform method call should be used to set the `appId` in the provider method request. -If the platform method is an `event` and the provider method has context parameters then each context parameter from the provider that has a matching context parameter in the event **MUST** have it's value passed to that parameter. +### 7.2 Application Context Setting -If the platform method is an `event` with a "composite result" and the provider method has context parameters then each context parameter from the provider that has a matching property on the `result` object **MUST** have it's value copied into that property. +When a platform method is invoked, the gateway will find the provider using the `Provider Candidate` rules as described above. However, some Firebolt APIs allow selecting the provider that should be used. If a platform method request schema is a "composite request" with `appId` `string` property at the top level but the provider method request schema is not a composite request, then the given appId shall be used to select the provider. +If "appId" is a required parameter in the platform method request schema, then it must be supplied. If it is not, then the request should fail with invalid parameters. If it is an optional parameter and it is not supplied, then the gateway should use rules in "Provider Candidate" section for selecting the candidate. -## 9. API Gateway +## 8. API Gateway The Firebolt API Gateway **MUST** detect app-passthrough APIs and map the `use`/`manage` APIs to the corresponding `provide` APIs by parsing the Firebolt OpenRPC Specification and following the logic outline in this document. -## 10. Example: User Interest +## 9. Example: User Interest The following schemas are referenced by these examples: @@ -287,7 +298,7 @@ The following schemas are referenced by these examples: } ``` -### 10.1. User Interest Pull +### 9.1. User Interest Pull Platform method: @@ -370,7 +381,7 @@ Provider method: } ``` -### 10.2. User Interest Push +### 9.2. User Interest Push Provider method: From 2ffe98b5bc6cbe4b2aa6213607da0a66641f9209 Mon Sep 17 00:00:00 2001 From: Kevin Pearson Date: Mon, 12 Aug 2024 09:24:41 -0700 Subject: [PATCH 2/8] Call a top-level property a parameter --- .../openrpc-extensions/app-passthrough-apis.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index 863614cf8..da6cf7aa4 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -108,7 +108,7 @@ The platform method result schema **MUST** either: > Match the `x-response` schema on the provider method so that the result can be passed through. > > or -> +> > Have a property that matches the `x-response-name` string and `x-response` schema on the > provider method so that the result can be composed and passed through. @@ -251,7 +251,7 @@ If the provider method is a "composite request" with `appId` `string` property a ### 7.2 Application Context Setting -When a platform method is invoked, the gateway will find the provider using the `Provider Candidate` rules as described above. However, some Firebolt APIs allow selecting the provider that should be used. If a platform method request schema is a "composite request" with `appId` `string` property at the top level but the provider method request schema is not a composite request, then the given appId shall be used to select the provider. +When a platform method is invoked, the gateway will find the provider using the `Provider Candidate` rules as described above. However, some Firebolt APIs allow selecting the provider that should be used. If a platform method request schema is a "composite request" with `appId` `string` parameter but the provider method request schema is not a composite request, then the given appId shall be used to select the provider. If "appId" is a required parameter in the platform method request schema, then it must be supplied. If it is not, then the request should fail with invalid parameters. If it is an optional parameter and it is not supplied, then the gateway should use rules in "Provider Candidate" section for selecting the candidate. ## 8. API Gateway @@ -465,7 +465,7 @@ Platform Method: "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" } } - + } } } From da16df6495d5c06d518e4f9f2771c7e714ee6b07 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Wed, 14 Aug 2024 11:46:23 -0400 Subject: [PATCH 3/8] fix: based on review w/ Kevin --- .../app-passthrough-apis.md | 82 ++++++++++++++----- 1 file changed, 62 insertions(+), 20 deletions(-) diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index da6cf7aa4..b84081d47 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -28,6 +28,7 @@ The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL - [2. Table of Contents](#2-table-of-contents) - [3. Open RPC Extensions](#3-open-rpc-extensions) - [3.1. Provided By Extension](#31-provided-by-extension) + - [Provider Hint Extension](#provider-hint-extension) - [4. Routing App pass-through APIs](#4-routing-app-pass-through-apis) - [4.1. No available providers](#41-no-available-providers) - [4.2. Direct pass-through](#42-direct-pass-through) @@ -35,12 +36,12 @@ The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL - [5. Provider Candidates](#5-provider-candidates) - [6. Best Candidate](#6-best-candidate) - [7. Application Context](#7-application-context) - - [7.1 Application Context Sharing](#71-application-context-sharing) - - [7.2 Application Context Setting](#72-application-context-setting) -- [8. API Gateway](#9-api-gateway) -- [9. Example: User Interest](#10-example-user-interest) - - [9.1. User Interest Pull](#101-user-interest-pull) - - [9.2. User Interest Push](#102-user-interest-push) + - [7.1 Application Context Surfacing](#71-application-context-surfacing) + - [7.2 Application Context Selection](#72-application-context-selection) +- [8. API Gateway](#8-api-gateway) +- [9. Example: User Interest](#9-example-user-interest) + - [9.1. User Interest Pull](#91-user-interest-pull) + - [9.2. User Interest Push](#92-user-interest-push) ## 3. Open RPC Extensions @@ -78,6 +79,37 @@ The provider method **MUST** provide the same capability that the platform metho If a platform method has no provider method then it is not a valid Firebolt OpenRPC method schema, and a validation error **MUST** be generated. +### Provider Hint Extension +Firebolt OpenRPC **MUST** support a `string` `x-provider-hint-parameter` extension property on the `capabilities` tag that denotes a method has a parameter for influencing provider selection, e.g.: + +```json +{ + "methods": [ + { + "name": "Keyboard.standard", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Keyboard.onRequestStandard", + "x-provider-hint-parameter": "appId" + "x-uses": [ + "xrn:firebolt:capability:input:keyboard" + ] + } + ], + "parameters": [ + { + "name": "appId", + "type": "string" + } + ] + } + ] +} +``` + +The parameter denoted by `x-provider-hint-parameter` **MUST** exist and be a string. + ## 4. Routing App pass-through APIs App pass-through APIs may be routed in one of several ways. @@ -116,7 +148,7 @@ The platform **MUST** call the provider method from the [best candidate](#8-best If the platform method result schema matches the `x-response` schema on the provider method then the value **MUST** be used as-is. -Otherwise if the platform method result schema has a property that matches the `x-response` schema on the provider method then the value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [result transformations](#9-result-transformations) to the composed result. +Otherwise if the platform method result schema has a property that matches the `x-response` schema on the provider method then the value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [result transformations](#9-result-transformations) to the "composite result". ### 4.4. Pass-through notifications Firebolt events have a synchronous subscriber registration method, e.g. `Lifecycle.onInactive(true)`, in addition to asynchronous notifications when the event actually happens. For events powered by an app pass-through, only the asynchronous notifications are passed in by the providing app. The initial event registration is handled by the platform, and the success response is not handled by the providing app. @@ -210,7 +242,7 @@ When a provider app calls a provider method mapped to an event the platform **MU If the platform method result schema matches the *last* parameter schema on the provider method then the value **MUST** be used as-is. -Otherwise if the platform method result schema has a property that matches the *last* parameter schema on the provider method then the value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [result transformations](#9-result-transformations) to the composed result. +Otherwise if the platform method result schema has a property that matches the *last* parameter schema on the provider method then the value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [result transformations](#9-result-transformations) to the "composite result". If the value was composed into the platform method result under a matching property, then any context parameter values from the provider method that correspond to a property name and schema in the platform method result **MUST** also be composed into the platform method result under those properties. @@ -222,34 +254,44 @@ all loaded apps that have permission to provide the capability **MUST** be considered as candidates to fulfill the method. ## 6. Best Candidate -Any provider candidates that have not registered to provide the method in -question **MUST NOT** be considered the best candidate and removed from -consideration. +A provider candidate app **MUST** include the capability in the `provide` section of the app manifest. -If there is only one candidate left then it **MUST** be the best candidate. +If a provider candidate is currently running, it **MUST** have already registered to provide the capability in +question. -If appId is set in the request [(See Application Context Setting)](#72-application-context-setting), then that app must be used for selecting the provider. +If there is exactly one provider candidate then it **MUST** be the best candidate. -If there is more than one candidate left, then the candidate app that most recently had RCU input focus **MUST** be the best candidate. - -If none of the candidates have had focus yet, then the candidate app that was most recently launched **MUST** be the best candidate. +If there is more than one provider candidate then the following requirements **MUST** be used to select the best candidate, in order: +> If the platform method has an `x-provider-hint-parameter` extension on the `capabilities` tag then the app with an appId that matches the value of that parameter **MUST** be the best candidate. +> +> **OR** +> +> The candidate app that most recently had RCU input focus **MUST** be the best candidate. +> +> **OR** +> +> The candidate app that was most recently launched **MUST** be the best candidate. ## 7. Application Context Application Context provides a mechanism for applications to know the identity of the applications they are communicating with. Application Context can be given in both directions. An application that uses a capability can know which app is providing that capability. An application that provides a capability can know which app is using that capability. -### 7.1 Application Context Sharing +### 7.1 Application Context Surfacing -Application Context is shared by having either a "composite result" or a "composite request". +A method may be configured to surface application context by inserting the "other" appId into the request or response and is triggered by the presense of an `appId` in either the platform method or the provider method, but not both. If a "composite result" was used to wrap the provider method value and the platform method's schema has an `appId` `string` property at the top level then the property's value **MUST** be set to the the appId of the providing app for that result. If a platform method is an `event` and the event result is a "composite result" with an `appId` `string` property at the top level, then the property **MUST** be set to the appId that initiated the provider (push) call. -If the provider method is a "composite request" with `appId` `string` property at the top level but the platform method does not have `appId`, then the id of app that initiated the platform method call should be used to set the `appId` in the provider method request. +If a platform method is an `event` and the event has an `appId` `string` context parameter and the provider method *does not* have an `appId` parameter, then the `appId` context parameter **MUST** be set to the appId that initiated the provider (push) call. + +If the provider method has an `appId` `string` parameter and the platform method does not have an `appId` parameter, then the id of app that initiated the platform method call **MUST** be used to set the `appId` in the provider method request. + +### 7.2 Application Context Selection -### 7.2 Application Context Setting +A method may be configured to enabled application context selection by exposing an appId parameter to allow the calling app to influence which app will provide it. When a platform method is invoked, the gateway will find the provider using the `Provider Candidate` rules as described above. However, some Firebolt APIs allow selecting the provider that should be used. If a platform method request schema is a "composite request" with `appId` `string` parameter but the provider method request schema is not a composite request, then the given appId shall be used to select the provider. If "appId" is a required parameter in the platform method request schema, then it must be supplied. If it is not, then the request should fail with invalid parameters. If it is an optional parameter and it is not supplied, then the gateway should use rules in "Provider Candidate" section for selecting the candidate. From 80b6e049df08ff8324b83c45c7e6f097f3ef3875 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Mon, 19 Aug 2024 13:31:55 -0400 Subject: [PATCH 4/8] Update app-passthrough-apis.md --- .../app-passthrough-apis.md | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index b84081d47..ead7ce8f3 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -28,16 +28,16 @@ The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL - [2. Table of Contents](#2-table-of-contents) - [3. Open RPC Extensions](#3-open-rpc-extensions) - [3.1. Provided By Extension](#31-provided-by-extension) - - [Provider Hint Extension](#provider-hint-extension) + - [3.2. Provider Selection Extension](#32-provider-selection-extension) - [4. Routing App pass-through APIs](#4-routing-app-pass-through-apis) - [4.1. No available providers](#41-no-available-providers) - [4.2. Direct pass-through](#42-direct-pass-through) - - [4.4. Pass-through notifications](#44-pass-through-notifications) + - [4.3. Pass-through notifications](#43-pass-through-notifications) - [5. Provider Candidates](#5-provider-candidates) - [6. Best Candidate](#6-best-candidate) - [7. Application Context](#7-application-context) - - [7.1 Application Context Surfacing](#71-application-context-surfacing) - - [7.2 Application Context Selection](#72-application-context-selection) + - [7.1. 7.1 Application Context Surfacing](#71-71-application-context-surfacing) + - [7.2. 7.2 Application Context Selection](#72-72-application-context-selection) - [8. API Gateway](#8-api-gateway) - [9. Example: User Interest](#9-example-user-interest) - [9.1. User Interest Pull](#91-user-interest-pull) @@ -79,8 +79,8 @@ The provider method **MUST** provide the same capability that the platform metho If a platform method has no provider method then it is not a valid Firebolt OpenRPC method schema, and a validation error **MUST** be generated. -### Provider Hint Extension -Firebolt OpenRPC **MUST** support a `string` `x-provider-hint-parameter` extension property on the `capabilities` tag that denotes a method has a parameter for influencing provider selection, e.g.: +### 3.2. Provider Selection Extension +Firebolt OpenRPC **MUST** support a `string` `x-provider-selection` extension property on the `capabilities` tag that denotes how to pick the best provider candidate, e.g.: ```json { @@ -91,7 +91,7 @@ Firebolt OpenRPC **MUST** support a `string` `x-provider-hint-parameter` extensi { "name": "capabilities", "x-provided-by": "Keyboard.onRequestStandard", - "x-provider-hint-parameter": "appId" + "x-provider-selection": "appId" "x-uses": [ "xrn:firebolt:capability:input:keyboard" ] @@ -108,7 +108,11 @@ Firebolt OpenRPC **MUST** support a `string` `x-provider-hint-parameter` extensi } ``` -The parameter denoted by `x-provider-hint-parameter` **MUST** exist and be a string. +The parameter denoted by `x-provider-selection` **MUST** exist and be a string. + +The value of `x-provider-selection`, if defined, **MUST** be either `"appId"` or `"focus"`. + +Given the `x-provider-selection` extension has the value `"appId"`, then the method **MUST** have an `appId` `string` parameter. ## 4. Routing App pass-through APIs App pass-through APIs may be routed in one of several ways. @@ -116,7 +120,7 @@ App pass-through APIs may be routed in one of several ways. When an app calls a platform method, i.e. one with an `x-provided-by` extension, the platform **MUST** use one of the routing methods defined in this section based on various properties of the method. ### 4.1. No available providers -When an app calls a platform method with an `x-provided-by` extension, the platform **MUST** return an unavailable error if there is no [candidate app](#7-provider-candidates) to execute the provider method. +When an app calls a platform method with an `x-provided-by` extension, the platform **MUST** return an unavailable error if there is no [candidate app](#5-provider-candidates) to execute the provider method. ```json { @@ -144,13 +148,13 @@ The platform method result schema **MUST** either: > Have a property that matches the `x-response-name` string and `x-response` schema on the > provider method so that the result can be composed and passed through. -The platform **MUST** call the provider method from the [best candidate](#8-best-candidate) app and acquire the result. +The platform **MUST** call the provider method from the [best candidate](#6-best-candidate) app and acquire the result. If the platform method result schema matches the `x-response` schema on the provider method then the value **MUST** be used as-is. -Otherwise if the platform method result schema has a property that matches the `x-response` schema on the provider method then the value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [result transformations](#9-result-transformations) to the "composite result". +Otherwise if the platform method result schema has a property that matches the `x-response` schema on the provider method then the value **MUST** be composed into an object under the corresponding property name. -### 4.4. Pass-through notifications +### 4.3. Pass-through notifications Firebolt events have a synchronous subscriber registration method, e.g. `Lifecycle.onInactive(true)`, in addition to asynchronous notifications when the event actually happens. For events powered by an app pass-through, only the asynchronous notifications are passed in by the providing app. The initial event registration is handled by the platform, and the success response is not handled by the providing app. This section only applies to platform methods that have an `event` tag. @@ -238,11 +242,11 @@ Matching provider method: } ``` -When a provider app calls a provider method mapped to an event the platform **MUST** ignore the notification if the app is not a [candidate app](#7-provider-candidates) for this capability. +When a provider app calls a provider method mapped to an event the platform **MUST** ignore the notification if the app is not a [candidate app](#5-provider-candidates) for this capability. If the platform method result schema matches the *last* parameter schema on the provider method then the value **MUST** be used as-is. -Otherwise if the platform method result schema has a property that matches the *last* parameter schema on the provider method then the value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [result transformations](#9-result-transformations) to the "composite result". +Otherwise if the platform method result schema has a property that matches the *last* parameter schema on the provider method then the value **MUST** be composed into an object under the corresponding property name. If the value was composed into the platform method result under a matching property, then any context parameter values from the provider method that correspond to a property name and schema in the platform method result **MUST** also be composed into the platform method result under those properties. @@ -261,23 +265,19 @@ question. If there is exactly one provider candidate then it **MUST** be the best candidate. -If there is more than one provider candidate then the following requirements **MUST** be used to select the best candidate, in order: +If there is more than one provider candidate then the following requirements **MUST** be used to select the best candidate, in order. -> If the platform method has an `x-provider-hint-parameter` extension on the `capabilities` tag then the app with an appId that matches the value of that parameter **MUST** be the best candidate. -> -> **OR** -> -> The candidate app that most recently had RCU input focus **MUST** be the best candidate. -> -> **OR** +> Given there is an `x-provider-selection` extension on the platform method capabilities tag, when that extension is set to the value `"appId"` then the provider candidate with an appId that matches the value of the platform method `appId` parameter **MUST** be the best candidate. +> +> Given there is an `x-provider-selection` extension on the platform method capabilities tag, when that extension is set to the value `"focus"` then the provider candidate that currently has RCU focus **MUST** be the best candidate. > -> The candidate app that was most recently launched **MUST** be the best candidate. +> Given there is no `x-provider-selection` extension, or it has a value not defined in this specification, when there is a provider candidate that was launched more recently then the other candidates then that provider candidate **MUST** be the best candidate. ## 7. Application Context Application Context provides a mechanism for applications to know the identity of the applications they are communicating with. Application Context can be given in both directions. An application that uses a capability can know which app is providing that capability. An application that provides a capability can know which app is using that capability. -### 7.1 Application Context Surfacing +### 7.1. 7.1 Application Context Surfacing A method may be configured to surface application context by inserting the "other" appId into the request or response and is triggered by the presense of an `appId` in either the platform method or the provider method, but not both. @@ -289,7 +289,7 @@ If a platform method is an `event` and the event has an `appId` `string` context If the provider method has an `appId` `string` parameter and the platform method does not have an `appId` parameter, then the id of app that initiated the platform method call **MUST** be used to set the `appId` in the provider method request. -### 7.2 Application Context Selection +### 7.2. 7.2 Application Context Selection A method may be configured to enabled application context selection by exposing an appId parameter to allow the calling app to influence which app will provide it. From 53330db93ab1e3026409ffc3cc0d758cb2f8b288 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Mon, 19 Aug 2024 14:30:34 -0400 Subject: [PATCH 5/8] fix: Per KP's review --- .../openrpc-extensions/app-passthrough-apis.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md index ead7ce8f3..51d7e460d 100644 --- a/requirements/specifications/openrpc-extensions/app-passthrough-apis.md +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -36,8 +36,8 @@ The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL - [5. Provider Candidates](#5-provider-candidates) - [6. Best Candidate](#6-best-candidate) - [7. Application Context](#7-application-context) - - [7.1. 7.1 Application Context Surfacing](#71-71-application-context-surfacing) - - [7.2. 7.2 Application Context Selection](#72-72-application-context-selection) + - [7.1. Application Context Surfacing](#71-application-context-surfacing) + - [7.2. Application Context Selection](#72-application-context-selection) - [8. API Gateway](#8-api-gateway) - [9. Example: User Interest](#9-example-user-interest) - [9.1. User Interest Pull](#91-user-interest-pull) @@ -108,8 +108,6 @@ Firebolt OpenRPC **MUST** support a `string` `x-provider-selection` extension pr } ``` -The parameter denoted by `x-provider-selection` **MUST** exist and be a string. - The value of `x-provider-selection`, if defined, **MUST** be either `"appId"` or `"focus"`. Given the `x-provider-selection` extension has the value `"appId"`, then the method **MUST** have an `appId` `string` parameter. @@ -277,7 +275,7 @@ If there is more than one provider candidate then the following requirements **M Application Context provides a mechanism for applications to know the identity of the applications they are communicating with. Application Context can be given in both directions. An application that uses a capability can know which app is providing that capability. An application that provides a capability can know which app is using that capability. -### 7.1. 7.1 Application Context Surfacing +### 7.1. Application Context Surfacing A method may be configured to surface application context by inserting the "other" appId into the request or response and is triggered by the presense of an `appId` in either the platform method or the provider method, but not both. @@ -289,7 +287,7 @@ If a platform method is an `event` and the event has an `appId` `string` context If the provider method has an `appId` `string` parameter and the platform method does not have an `appId` parameter, then the id of app that initiated the platform method call **MUST** be used to set the `appId` in the provider method request. -### 7.2. 7.2 Application Context Selection +### 7.2. Application Context Selection A method may be configured to enabled application context selection by exposing an appId parameter to allow the calling app to influence which app will provide it. From 26a6e8166f9c298bee2a69c85259f0b7c0d36ae1 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Wed, 21 Aug 2024 12:40:37 -0400 Subject: [PATCH 6/8] fix: Adding provider selection tag to user interest --- src/openrpc/content.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/openrpc/content.json b/src/openrpc/content.json index 0ffbeadbf..ce26b7c5a 100644 --- a/src/openrpc/content.json +++ b/src/openrpc/content.json @@ -12,6 +12,7 @@ { "name": "capabilities", "x-provided-by": "Discovery.onRequestUserInterest", + "x-provider-selection": "focus", "x-uses": [ "xrn:firebolt:capability:discovery:interest" ] @@ -95,6 +96,7 @@ { "name": "capabilities", "x-provided-by": "Discovery.userInterest", + "x-provider-selection": "focus", "x-uses": [ "xrn:firebolt:capability:discovery:interest" ] From be1c2ccbdf5a1366e0fbb565ecbcacb22cb33473 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Thu, 22 Aug 2024 13:39:43 -0400 Subject: [PATCH 7/8] fix: Latest firebolt-openrpc version 3.1.1-next.2 --- package-lock.json | 299 ++++++---------------------------------------- package.json | 2 +- 2 files changed, 38 insertions(+), 263 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8af224f25..f40ae9afb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "3.1.0", + "@firebolt-js/openrpc": "../firebolt-openrpc", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", @@ -37,6 +37,37 @@ "typescript": "^4.6.4" } }, + "../firebolt-openrpc": { + "version": "3.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "array.prototype.groupby": "^1.1.0", + "crocks": "^0.12.4", + "deepmerge": "^4.2.2", + "fs-extra": "^10.1.0", + "highland": "^2.13.5", + "mkdirp": "^0.5.6", + "node-fetch": "^3.2.10", + "nopt": "^5.0.0", + "util": "^0.12.4" + }, + "bin": { + "firebolt-openrpc": "src/cli.mjs" + }, + "devDependencies": { + "@commitlint/cli": "^17.1.2", + "@commitlint/config-conventional": "^17.1.0", + "@semantic-release/changelog": "^6.0.1", + "@semantic-release/git": "^10.0.1", + "@semantic-release/npm": "^9.0.1", + "husky": "^8.0.1", + "jest": "^27.3.1", + "semantic-release": "^19.0.5" + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -1075,95 +1106,8 @@ "link": true }, "node_modules/@firebolt-js/openrpc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@firebolt-js/openrpc/-/openrpc-3.1.0.tgz", - "integrity": "sha512-OUbEInML9oF8d3P5brYN8iHUdfYxO5xBvnKm52ckyy6nJ7jYL2RJDobpeZa7flfeauuFXzkSK/ZMDtiOFxqQRg==", - "dev": true, - "dependencies": { - "ajv": "^8.12.0", - "ajv-formats": "^2.1.1", - "array.prototype.groupby": "^1.1.0", - "crocks": "^0.12.4", - "deepmerge": "^4.2.2", - "fs-extra": "^10.1.0", - "highland": "^2.13.5", - "mkdirp": "^0.5.6", - "node-fetch": "^3.2.10", - "nopt": "^5.0.0", - "util": "^0.12.4" - }, - "bin": { - "firebolt-openrpc": "src/cli.mjs" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/@firebolt-js/openrpc/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/@firebolt-js/openrpc/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/@firebolt-js/openrpc/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } + "resolved": "../firebolt-openrpc", + "link": true }, "node_modules/@firebolt-js/schemas": { "version": "2.0.0", @@ -2736,20 +2680,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.groupby": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array.prototype.groupby/-/array.prototype.groupby-1.1.0.tgz", - "integrity": "sha512-p+QtvmnNEBqajQWLG3kPls8cLPBfJgvayzc/qplsX8Vchtevtq+TR2gyav5xs5h+mdUjfgOvYoCdTsVxu3b5sA==", - "deprecated": "This proposal has been altered; please use https://npmjs.com/object.groupby instead!", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.1" - } - }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", @@ -3375,12 +3305,6 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "node_modules/crocks": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/crocks/-/crocks-0.12.4.tgz", - "integrity": "sha512-paln6xJUrR9e/OWMFsyTi4dLyr+q99C5f7PQbGgSDHtwsfW0sCNZvnpHzvniI2dAE0uoBgeIP1Ukmme8Z0HxxA==", - "dev": true - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3437,15 +3361,6 @@ "node": ">=8" } }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -4797,12 +4712,6 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, - "node_modules/fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "dev": true - }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -4821,29 +4730,6 @@ "bser": "2.1.1" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, "node_modules/figures": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", @@ -4958,18 +4844,6 @@ "node": ">= 6" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -5427,15 +5301,6 @@ "node": ">= 0.4" } }, - "node_modules/highland": { - "version": "2.13.5", - "resolved": "https://registry.npmjs.org/highland/-/highland-2.13.5.tgz", - "integrity": "sha512-dn2flPapIIAa4BtkB2ahjshg8iSJtrJtdhEb9/oiOrS5HMQTR/GuhFpqJ+11YBdtnl3AwWKvbZd1Uxr8uAmA7A==", - "dev": true, - "dependencies": { - "util-deprecate": "^1.0.2" - } - }, "node_modules/hook-std": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", @@ -5694,22 +5559,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -5824,21 +5673,6 @@ "node": ">=6" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -7469,25 +7303,6 @@ "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", "dev": true }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, "node_modules/node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -7497,24 +7312,6 @@ "lodash": "^4.17.21" } }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dev": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -16587,19 +16384,6 @@ "requires-port": "^1.0.0" } }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16679,15 +16463,6 @@ "makeerror": "1.0.12" } }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -16962,7 +16737,7 @@ }, "src/sdks/core": { "name": "@firebolt-js/sdk", - "version": "1.3.0", + "version": "1.3.1-next.1", "license": "Apache-2.0", "devDependencies": { "jest": "^28.1.0", @@ -16973,7 +16748,7 @@ }, "src/sdks/discovery": { "name": "@firebolt-js/discovery-sdk", - "version": "1.3.0", + "version": "1.3.1-next.1", "license": "Apache-2.0", "devDependencies": { "jest": "^28.1.0", @@ -16984,7 +16759,7 @@ }, "src/sdks/manage": { "name": "@firebolt-js/manage-sdk", - "version": "1.3.0", + "version": "1.3.1-next.1", "license": "Apache-2.0", "devDependencies": { "jest": "^28.1.0", diff --git a/package.json b/package.json index dc82211d3..240b0feb8 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "3.1.0", + "@firebolt-js/openrpc": "3.1.1-next.2", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", From bb16a86d4d0122b7a62511077ce2a55e49143f39 Mon Sep 17 00:00:00 2001 From: Jeremy LaCivita Date: Fri, 23 Aug 2024 10:47:14 -0400 Subject: [PATCH 8/8] fix: Latest firebolt-openrpc --- package-lock.json | 293 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 259 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index f40ae9afb..142543654 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "../firebolt-openrpc", + "@firebolt-js/openrpc": "3.1.1-next.2", "@firebolt-js/schemas": "2.0.0", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", @@ -37,37 +37,6 @@ "typescript": "^4.6.4" } }, - "../firebolt-openrpc": { - "version": "3.1.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "ajv": "^8.12.0", - "ajv-formats": "^2.1.1", - "array.prototype.groupby": "^1.1.0", - "crocks": "^0.12.4", - "deepmerge": "^4.2.2", - "fs-extra": "^10.1.0", - "highland": "^2.13.5", - "mkdirp": "^0.5.6", - "node-fetch": "^3.2.10", - "nopt": "^5.0.0", - "util": "^0.12.4" - }, - "bin": { - "firebolt-openrpc": "src/cli.mjs" - }, - "devDependencies": { - "@commitlint/cli": "^17.1.2", - "@commitlint/config-conventional": "^17.1.0", - "@semantic-release/changelog": "^6.0.1", - "@semantic-release/git": "^10.0.1", - "@semantic-release/npm": "^9.0.1", - "husky": "^8.0.1", - "jest": "^27.3.1", - "semantic-release": "^19.0.5" - } - }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -1106,8 +1075,95 @@ "link": true }, "node_modules/@firebolt-js/openrpc": { - "resolved": "../firebolt-openrpc", - "link": true + "version": "3.1.1-next.2", + "resolved": "https://registry.npmjs.org/@firebolt-js/openrpc/-/openrpc-3.1.1-next.2.tgz", + "integrity": "sha512-D5b8ovtmRQNSlJ52LRJHtp0rmvlao6axzpmqYjW8wsljNeTj9QcAJ1xiUiYBt2uFitvGM6zQA04e3rbJhErJ+w==", + "dev": true, + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "array.prototype.groupby": "^1.1.0", + "crocks": "^0.12.4", + "deepmerge": "^4.2.2", + "fs-extra": "^10.1.0", + "highland": "^2.13.5", + "mkdirp": "^0.5.6", + "node-fetch": "^3.2.10", + "nopt": "^5.0.0", + "util": "^0.12.4" + }, + "bin": { + "firebolt-openrpc": "src/cli.mjs" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/@firebolt-js/openrpc/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@firebolt-js/openrpc/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@firebolt-js/openrpc/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } }, "node_modules/@firebolt-js/schemas": { "version": "2.0.0", @@ -2680,6 +2736,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.groupby": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array.prototype.groupby/-/array.prototype.groupby-1.1.0.tgz", + "integrity": "sha512-p+QtvmnNEBqajQWLG3kPls8cLPBfJgvayzc/qplsX8Vchtevtq+TR2gyav5xs5h+mdUjfgOvYoCdTsVxu3b5sA==", + "deprecated": "This proposal has been altered; please use https://npmjs.com/object.groupby instead!", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.1" + } + }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", @@ -3305,6 +3375,12 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/crocks": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/crocks/-/crocks-0.12.4.tgz", + "integrity": "sha512-paln6xJUrR9e/OWMFsyTi4dLyr+q99C5f7PQbGgSDHtwsfW0sCNZvnpHzvniI2dAE0uoBgeIP1Ukmme8Z0HxxA==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3361,6 +3437,15 @@ "node": ">=8" } }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -4712,6 +4797,12 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -4730,6 +4821,29 @@ "bser": "2.1.1" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/figures": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", @@ -4844,6 +4958,18 @@ "node": ">= 6" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -5301,6 +5427,15 @@ "node": ">= 0.4" } }, + "node_modules/highland": { + "version": "2.13.5", + "resolved": "https://registry.npmjs.org/highland/-/highland-2.13.5.tgz", + "integrity": "sha512-dn2flPapIIAa4BtkB2ahjshg8iSJtrJtdhEb9/oiOrS5HMQTR/GuhFpqJ+11YBdtnl3AwWKvbZd1Uxr8uAmA7A==", + "dev": true, + "dependencies": { + "util-deprecate": "^1.0.2" + } + }, "node_modules/hook-std": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", @@ -5559,6 +5694,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -5673,6 +5824,21 @@ "node": ">=6" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -7303,6 +7469,25 @@ "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", "dev": true }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -7312,6 +7497,24 @@ "lodash": "^4.17.21" } }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -16384,6 +16587,19 @@ "requires-port": "^1.0.0" } }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16463,6 +16679,15 @@ "makeerror": "1.0.12" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",