oddsdk/ts-odd

Implement unified API for linking

Opened this issue ยท 0 comments

This unifies the account linking and capabilities (app-to-app linking) APIs.
More context: https://talk.fission.codes/t/unified-linking-api-app-linking/4268

Producer API

const config: ProvisionConfig = {
  allowedCapabilities: [
    webnative.capabilities.accountLinking,
    webnative.capabilities.fileSystem
  ]
}

// ๐Ÿ’ˆ STEP 1 - PROVIDE CAPABILITIES
// This could potentially be done automatically based on program config.
// Or called automatically when `on` is called with a producer event.
program.linking.provide(config)

// โ˜Ž๏ธ STEP 2 - APPROVE THE REQUESTED CAPABILITIES
program.linking.on("query", query => {
  // What is being requested?
  query.capabilities
  // [{ "cap" : ... }]

  // Query looks good, user approves the set of capabilities requested.
  program.linking.accept(query)

  // You're asking for too much, I'm out.
  program.linking.dismiss(query)
})

// ๐Ÿ” STEP 3 - ADDITIONAL SECURITY
program.linking.on("challenge", challenge => {
  // You could also not require any user input and `proceed` immediately
  if (userInput === challenge) program.linking.approve(challenge)
  else program.linking.dismiss(challenge)
})

// โœ… COMPLETED
program.linking.on("link", ...)

// โœ‹
program.linking.stopProviding()

Consumer API

// ๐Ÿฝ๏ธ STEP 1 - REQUEST CAPABILITIES
const requestId = program.linking.request([
  webnative.capabilities.accountLinking
])

// ๐Ÿ” STEP 2 - ADDITIONAL SECURITY
program.linking.on("challenge", challenge => {
  showPinInUI(challenge)
})

// โœ… COMPLETED
program.linking.on("link", ucans => {
  if (ucans) program.linking.collect(ucans)
  else // Producer dismissed
})

// โœ‹
program.linking.cancelRequest(requestId)