All files / interfaces Origin.ts

6.25% Statements 1/16
0% Branches 0/6
0% Functions 0/4
6.25% Lines 1/16

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91          1x                                                                                                                                                                          
import { AddressInfo } from "../types"
import { AddressReceipt } from "./AddressReceipt"
import { Host, BindOptions, Scheme } from "./Host"
import { ServiceInterfaceBuilder } from "./ServiceInterfaceBuilder"
 
export class Origin<T extends Host> {
  constructor(
    readonly host: T,
    readonly internalPort: number,
    readonly scheme: string | null,
    readonly sslScheme: string | null,
  ) {}
 
  build({ username, path, search, schemeOverride }: BuildOptions): AddressInfo {
    const qpEntries = Object.entries(search)
      .map(
        ([key, val]) => `${encodeURIComponent(key)}=${encodeURIComponent(val)}`,
      )
      .join("&")
 
    const qp = qpEntries.length ? `?${qpEntries}` : ""
 
    return {
      hostId: this.host.options.id,
      internalPort: this.internalPort,
      scheme: schemeOverride ? schemeOverride.noSsl : this.scheme,
      sslScheme: schemeOverride ? schemeOverride.ssl : this.sslScheme,
      suffix: `${path}${qp}`,
      username,
    }
  }
 
  /**
   * A function to register a group of origins (<PROTOCOL> :// <HOSTNAME> : <PORT>) with StartOS
   *
   * The returned addressReceipt serves as proof that the addresses were registered
   *
   * @param addressInfo
   * @returns
   */
  async export(
    serviceInterfaces: ServiceInterfaceBuilder[],
  ): Promise<AddressInfo[] & AddressReceipt> {
    const addressesInfo = []
    for (let serviceInterface of serviceInterfaces) {
      const {
        name,
        description,
        hasPrimary,
        disabled,
        id,
        type,
        username,
        path,
        search,
        schemeOverride,
        masked,
      } = serviceInterface.options
 
      const addressInfo = this.build({
        username,
        path,
        search,
        schemeOverride,
      })
 
      await serviceInterface.options.effects.exportServiceInterface({
        id,
        name,
        description,
        hasPrimary,
        disabled,
        addressInfo,
        type,
        masked,
      })
 
      addressesInfo.push(addressInfo)
    }
 
    return addressesInfo as AddressInfo[] & AddressReceipt
  }
}
 
type BuildOptions = {
  schemeOverride: { ssl: Scheme; noSsl: Scheme } | null
  username: string | null
  path: string
  search: Record<string, string>
}