Skip to content

Optum/rocket-webhook

This branch is up to date with boostercloud/rocket-webhook:main.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Apr 14, 2025
ad3b525 · Apr 14, 2025
Apr 14, 2025
Dec 27, 2021
Jan 24, 2024
Dec 27, 2021
Jan 24, 2024
Dec 27, 2021
Sep 6, 2022
Sep 6, 2022
Sep 6, 2022
Oct 29, 2024
Apr 14, 2025
Apr 14, 2025
Apr 14, 2025
Jul 19, 2022
Jan 24, 2024

Repository files navigation

Booster rocket webhook Azure

Description

This Rocket adds HTTP endpoints to your Booster application. When an endpoint is called, a function will be executed in your Booster application with request as a parameter.

Supported Providers

This Rocket supports the following Providers:

  • Azure
  • Local

Application configuration

Add your rocket to your application in the configuration file.

Generic

import { AllowedHttpMethod } from '@boostercloud/rocket-webhook-types'

function buildBoosterWebhook(config: BoosterConfig): BoosterWebhook {
  return new BoosterWebhook(config, [
    {
      route: 'test',
      handlerClass: TestHandler,
      allowedMethods: [AllowedHttpMethod.POST],
    },
    {
      route: 'clients/other',
      handlerClass: FacebookHandler,
      allowedMethods: [AllowedHttpMethod.GET, AllowedHttpMethod.POST],
    },
  ])
}

And call this method on your rocket configuration.

For Azure

  config.rockets = [buildBoosterWebhook(config).rocketForAzure()]

For Local

  config.rockets = [buildBoosterWebhook(config).rocketForLocal()]

Parameters

  • route: The endpoint that will be created. It is possible to define nested routes.
  • handlerClass: A class with a handle method to handle the request
  • multiPartConfig: multipart/form-data configuration
    • defParamCharset: the default character set to use for values of part header parameters (e.g. filename)
    • preservePath: If paths in filenames from file parts in a 'multipart/form-data' request shall be preserved.
    • limits:
      • fileSize: the max file size (in bytes)
      • files: the max number of file fields.
      • parts: the max number of parts (fields + files).

The handle method should be like this one:

export class TestHandler {

  constructor() {
  }

  public static async handle(webhookEventInterface: WebhookEvent, register: Register): Promise<WebhookHandlerReturnType> {
    if (validationFails()) {
      throw new InvalidParameterError("Error message");
    }
    return Promise.resolve({
      body: { name: "my_name" },
      responseType: WebhookResponseType.json,
    });
  }
}

Return type

Handle methods return a promise of WebhookHandlerReturnType or void. This object contains the headers and body to be returned as response. You need to specify the responseType. Example:

  public static async handle(
    webhookEventInterface: WebhookEvent,
    register: Register
  ): Promise<WebhookHandlerReturnType> {
    return Promise.resolve({
      body: 'ok',
      headers: {
        Test: 'test header',
      },
      responseType: WebhookResponseType.text,
    })
  }

To return a file, set the responseType to WebhookResponseType.file. Specify the name and mime type in the file field.

Example:

    const result: WebhookHandlerReturnType = {
  body: file,
  file: {
    name: '1.txt',
    mimeType: WebhookResponseType.text,
  },
  responseType: WebhookResponseType.file,
}

Authorization

To define with roles can access each point use the authorize configuration parameter as the authorize parameter in Booster.

Example:

{
  route: 'all',
        handlerClass: AllHandlerDispatcher,
        authorize: 'all',
},
{
  route: 'test/roles',
        handlerClass: AdminHandlerDispatcher,
        authorize: [Admin],
},
{
  route: 'custom',
        handlerClass: CustomHandlerDispatcher,
        authorize: (currentUser?: UserEnvelope, request?: WebhookRequest): Promise<void> => {
          if (currentUser?.username !== 'test@test.com') {
            return Promise.reject('Unexpected user')
          }
          return Promise.resolve()
        },
},

Usage

curl --request POST 'http://localhost:3000/webhook/command?param1=testvalue'

The webhookEventInterface object will be similar to this one:

{
  origin: 'test',
  method: 'POST',
  url: '/test?param1=testvalue',
  originalUrl: '/webhook/test?param1=testvalue',
  headers: {
    accept: '*/*',
    'cache-control': 'no-cache',
    host: 'localhost:3000',
    'accept-encoding': 'gzip, deflate, br',
    connection: 'keep-alive',
    'content-length': '0'
  },
  query: { param1: 'testvalue' },
  params: {},
  rawBody: undefined,
  body: {}
}

Multipart/form-data requests

Endpoints accepts multipart/form-data requests. The WebhookEvent will contain a new multiPart object with the files and fields in the request. Example:

{
  origin: 'test',
  method: 'POST',
  url: '/test?param1=testvalue',
  originalUrl: '/webhook/test?param1=testvalue',
  headers: {
    accept: '*/*',
    'cache-control': 'no-cache',
    host: 'localhost:3000',
    'accept-encoding': 'gzip, deflate, br',
    connection: 'keep-alive',
    'content-length': '0'
  },
  query: {
    param1: 'testvalue'
  },
  params: {},
  rawBody: undefined,
  body: {},
  multipart: {
    "files": [
      {
        name: "file1",
        bufferFile: Buffer(11),
        filename: "file1.txt",
        encoding: "7bit",
        mimeType: "text/plain"
      }
    ],
    "fields": [
      {
        name: "parameterName",
        value: "value",
        nameTruncated: false,
        valueTruncated: false,
        encoding: "7bit",
        ...
      }
    ]
  }
}

Compile

npm install

npm run compile

About

No description, website, or topics provided.

Resources

License

Code of conduct

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 94.0%
  • JavaScript 6.0%