@sphereon/ssi-sdk.uni-resolver-registrar-api 0.36.1-feature.vdx24.einvoice.endpoints.122 → 0.36.1-feature.vdx24.einvoice.inbox.127

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -311,6 +311,31 @@ function didWebDomainEndpoint(router, context, opts) {
311
311
  ...serviceEntries
312
312
  ];
313
313
  }
314
+ const cleanService = /* @__PURE__ */ __name((svc) => {
315
+ return Object.fromEntries(Object.entries(svc).filter(([_, v]) => v !== null && v !== void 0));
316
+ }, "cleanService");
317
+ if (resolutionResult?.didDocument?.service && typeof context.agent.getServiceMetadata === "function") {
318
+ const enrichedServices = await Promise.all(resolutionResult.didDocument.service.map(async (service) => {
319
+ try {
320
+ const metadata = await context.agent.getServiceMetadata({
321
+ serviceId: service.id,
322
+ did
323
+ });
324
+ if (metadata?.einvoice) {
325
+ return cleanService({
326
+ ...service,
327
+ einvoice: metadata.einvoice
328
+ });
329
+ }
330
+ } catch (e) {
331
+ debug(`No metadata found for service ${service.id}`);
332
+ }
333
+ return cleanService(service);
334
+ }));
335
+ resolutionResult.didDocument.service = enrichedServices;
336
+ } else if (resolutionResult?.didDocument?.service) {
337
+ resolutionResult.didDocument.service = resolutionResult.didDocument.service.map(cleanService);
338
+ }
314
339
  response.statusCode = 200;
315
340
  return response.send(resolutionResult.didDocument);
316
341
  } catch (e) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/api-functions.ts","../src/uni-resolver-api-server.ts","../src/did-web-server.ts"],"sourcesContent":["/**\n * @public\n */\nexport * from './types'\nexport * from './api-functions'\nexport * from './uni-resolver-api-server'\nexport * from './did-web-server'\n","import { DIDResolutionResult } from '@sphereon/did-uni-client'\nimport { getAgentDIDMethods, toDidDocument, toDidResolutionResult } from '@sphereon/ssi-sdk-ext.did-utils'\nimport { JwkKeyUse } from '@sphereon/ssi-sdk-ext.key-utils'\nimport { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { LinkedVPServiceEntry } from '@sphereon/ssi-sdk.linked-vp'\nimport { parseDid } from '@sphereon/ssi-types'\nimport { IIdentifier } from '@veramo/core'\nimport { Service } from 'did-resolver'\nimport { Request, Response, Router } from 'express'\nimport { v4 } from 'uuid'\nimport {\n CreateState,\n DidRegistrationCreateRequest,\n DidRegistrationDeactivateRequest,\n DidStateValue,\n ICreateDidEndpointOpts,\n IGlobalDidWebEndpointOpts,\n IRequiredContext,\n IResolveEndpointOpts,\n} from './types'\nimport Debug from 'debug'\n\nconst debug = Debug('sphereon:ssi-sdk:uni-resolver-registrar')\n\nexport function createDidEndpoint(router: Router, context: IRequiredContext, opts?: ICreateDidEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`create DID endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/identifiers'\n\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const createRequest: DidRegistrationCreateRequest = request.body\n if (!createRequest) {\n return sendErrorResponse(response, 400, 'No DID create request present')\n }\n const did = createRequest.did\n const didMethod = (request.query.method as string) ?? (did ? parseDid(did).method : opts?.defaultMethod)\n const allDidMethods = await getAgentDIDMethods(context)\n if (!didMethod) {\n return sendErrorResponse(response, 400, 'No DID method supplied or deductible')\n } else if (did && parseDid(did).method != didMethod) {\n return sendErrorResponse(response, 400, 'DID method did not match method param')\n } else if (!allDidMethods.includes(didMethod)) {\n return sendErrorResponse(response, 400, 'DID method not supported')\n }\n const provider = `did:${didMethod}`\n const jobId = createRequest.jobId ?? v4()\n let alias: string | undefined = undefined\n if (didMethod === 'web') {\n if (!did) {\n return sendErrorResponse(response, 400, 'Please provide a value for \"did\" in the request body when creating a DID web')\n }\n alias = parseDid(did).id\n if (!alias) {\n return sendErrorResponse(response, 400, 'Could not determine alias from did:web DID value: ' + did)\n }\n }\n\n let identifier: IIdentifier | undefined\n let state: DidStateValue | undefined\n if (opts?.noErrorOnExistingDid && did) {\n try {\n identifier = await context.agent.didManagerGet({ did })\n state = 'exists'\n } catch (e) {\n // Okay, since we will create a new one\n }\n }\n if (identifier === undefined) {\n if (createRequest.options.storeSecrets === false) {\n return sendErrorResponse(response, 400, 'Only storeSecrets mode is supported currently')\n /*const memoryKMS = new SphereonKeyManager({\n store: new MemoryKeyStore(),\n kms: {'mem': new KeyManagementSystem(new MemoryPrivateKeyStore())}\n })\n identifier = await memoryKMS..didManagerCreate({provider, alias, kms: opts?.kms})*/\n } else if (createRequest.options.storeSecrets || opts?.storeSecrets) {\n identifier = await context.agent.didManagerCreate({ provider, alias, kms: opts?.kms })\n state = 'finished'\n } else {\n return sendErrorResponse(response, 400, 'Only storeSecrets mode is supported currently')\n }\n }\n if (!identifier || !state) {\n return sendErrorResponse(response, 400, 'An identifier and did state should be present at this point')\n }\n\n const didDocument = toDidDocument(identifier, { did, use: [JwkKeyUse.Signature, JwkKeyUse.Encryption] })\n const createState: CreateState = {\n jobId,\n didState: {\n did: identifier.did,\n state,\n didDocument,\n },\n }\n response.statusCode = 200\n return response.send(createState)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function getDidMethodsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get DID methods endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/methods'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const methods = await getAgentDIDMethods(context) // these are already without the 'did:' prefix\n response.statusCode = 200\n return response.send(methods)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nasync function agentDidToResolutionResult(context: IRequiredContext, did: string) {\n try {\n const identifier = await context.agent.didManagerGet({ did })\n debug(JSON.stringify(identifier, null, 2))\n return toDidResolutionResult(identifier, {\n did,\n supportedMethods: await getAgentDIDMethods(context),\n })\n } catch (error) {\n console.log(JSON.stringify(error.message))\n return {\n didDocument: null,\n didResolutionMetadata: {\n error: 'notFound',\n },\n didDocumentMetadata: {},\n }\n }\n}\n\nexport function resolveDidEndpoint(router: Router, context: IRequiredContext, opts?: IResolveEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Resolve DID endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/identifiers/:identifier'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const did = request.params.identifier\n if (!did) {\n return sendErrorResponse(response, 400, 'no identifier provided')\n }\n const mode = request.query.mode?.toString().toLowerCase() ?? opts?.mode?.toLowerCase() ?? 'hybrid'\n let resolutionResult: DIDResolutionResult | undefined\n if (mode === 'local' || mode === 'hybrid') {\n resolutionResult = await agentDidToResolutionResult(context, did)\n }\n if (mode !== 'local' && !resolutionResult?.didDocument) {\n resolutionResult = await context.agent.resolveDid({ didUrl: did })\n }\n\n response.statusCode = 200\n return response.send(resolutionResult)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\n/**\n * @param router\n * @param context\n * @param opts\n */\nexport function deleteDidEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Deactivate DID endpoint is disabled`)\n return\n }\n router.delete(opts?.path ?? '/identifiers/:identifier', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const did = request.params.identifier\n if (!did) {\n return sendErrorResponse(response, 400, 'no DID provided')\n }\n\n const result = await context.agent.didManagerDelete({ did })\n if (!result) {\n return sendErrorResponse(response, 404, `id ${did} not found`)\n }\n response.statusCode = 200\n return response.send()\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function deactivateDidEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log('Deactivate DID endpoint is disabled')\n return\n }\n\n router.post(opts?.path ?? '/deactivate', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const deactivateRequest: DidRegistrationDeactivateRequest = request.body\n if (!deactivateRequest) {\n return sendErrorResponse(response, 400, 'Invalid request body', { state: 'failed' })\n }\n\n const { did, jobId = v4() } = deactivateRequest\n if (!did) {\n return sendErrorResponse(response, 400, 'No DID provided', { state: 'failed' })\n }\n\n const result = await context.agent.didManagerDelete({ did })\n if (!result) {\n return sendErrorResponse(response, 404, `DID ${did} not found`, { state: 'failed' })\n }\n\n response.status(200).json({\n state: 'finished',\n did,\n jobId,\n })\n return response.send()\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, { state: 'failed', errorDetails: e })\n }\n })\n}\n\n/**\n * Endpoint that eases DID web resolution, by mapping did-web paths to stored agent DIDs.\n *\n * Typically, you will have a reverse proxy or load balancer in front of this endpoint.\n *\n * Some examples of how did:web behaves:\n * did:web:example.com resolves to https://example.com/.well-known/did.json\n * did:web:example.com:sub:paths resolves to https://example.com/sub/paths/did.json\n *\n * This endpoint translate both forms by looking at the paths that end in /did.json.\n *\n * @param router\n * @param context\n * @param opts\n */\nexport function didWebDomainEndpoint(router: Router, context: IRequiredContext, opts?: IGlobalDidWebEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`DID Web domain resolution endpoint is disabled`)\n return\n }\n router.get(opts?.path ?? ':path(*)/did.json', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const path = request.params.path\n if (!path || path.length === 0) {\n return sendErrorResponse(response, 404, 'Not found')\n }\n let did: string\n did = `did:web:${opts?.hostname?.replace('https://', '')?.replace('http://', '') ?? request.hostname}`\n if (path !== '/.well-known') {\n if (opts?.disableSubPaths) {\n return sendErrorResponse(response, 404, 'Not found')\n }\n const suffix = path.replace(/\\//g, ':').replace(/%2F/g, ':')\n if (!suffix.startsWith(':')) {\n did += ':'\n }\n did += suffix\n } else if (opts?.disableWellKnown) {\n return sendErrorResponse(response, 404, 'Not found')\n }\n\n const resolutionResult = await agentDidToResolutionResult(context, did)\n if (!resolutionResult || !resolutionResult.didDocument || resolutionResult?.didResolutionMetadata?.error === 'notFound') {\n return sendErrorResponse(response, 404, 'Not found')\n }\n\n const serviceEntries: Array<LinkedVPServiceEntry> = await context.agent.lvpGetServiceEntries({ subjectDid: did })\n if (resolutionResult?.didDocument && serviceEntries) {\n // Preserve existing services that are not LinkedVerifiablePresentation type\n const existingServices = resolutionResult.didDocument.service || []\n const nonLVPServices = existingServices.filter((service) => service.type !== 'LinkedVerifiablePresentation')\n\n // Combine non-LVP services with the new LVP service entries\n resolutionResult.didDocument.service = [...nonLVPServices, ...serviceEntries] as Array<Service>\n }\n\n response.statusCode = 200\n return response.send(resolutionResult.didDocument)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n","import { agentContext } from '@sphereon/ssi-sdk.core'\nimport { copyGlobalAuthToEndpoints, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { TAgent } from '@veramo/core'\n\nimport express, { Express, Router } from 'express'\nimport { createDidEndpoint, deleteDidEndpoint, deactivateDidEndpoint, getDidMethodsEndpoint, resolveDidEndpoint } from './api-functions'\nimport { IDidAPIOpts, IRequiredPlugins } from './types'\n\nexport class UniResolverApiServer {\n get router(): express.Router {\n return this._router\n }\n\n private readonly _express: Express\n private readonly _agent: TAgent<IRequiredPlugins>\n private readonly _opts?: IDidAPIOpts\n private readonly _router: Router\n\n constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: IDidAPIOpts }) {\n const { agent, opts } = args\n this._agent = agent\n copyGlobalAuthToEndpoints({ opts, keys: ['getDidMethods', 'createDid', 'resolveDid', 'deactivateDid'] })\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n const context = agentContext(agent)\n const features = opts?.enableFeatures ?? ['did-resolve', 'did-persist']\n console.log(`DID Uni Resolver and Registrar API enabled, with features: ${JSON.stringify(features)}}`)\n\n // DID endpoints\n if (features.includes('did-resolve')) {\n resolveDidEndpoint(this.router, context, opts?.endpointOpts?.resolveDid)\n getDidMethodsEndpoint(this.router, context, opts?.endpointOpts?.getDidMethods)\n }\n if (features.includes('did-persist')) {\n createDidEndpoint(this.router, context, opts?.endpointOpts?.createDid)\n deleteDidEndpoint(this.router, context, opts?.endpointOpts?.deactivateDid) // not in spec.\n deactivateDidEndpoint(this.router, context, opts?.endpointOpts?.deactivateDid)\n }\n this._express.use(opts?.endpointOpts?.basePath ?? '', this.router)\n }\n\n get agent(): TAgent<IRequiredPlugins> {\n return this._agent\n }\n\n get opts(): IDidAPIOpts | undefined {\n return this._opts\n }\n\n get express(): Express {\n return this._express\n }\n}\n","import { agentContext } from '@sphereon/ssi-sdk.core'\nimport { ExpressSupport } from '@sphereon/ssi-express-support'\nimport { TAgent } from '@veramo/core'\n\nimport express, { Express, Router } from 'express'\nimport { didWebDomainEndpoint } from './api-functions'\nimport { IDidWebServiceOpts, IRequiredPlugins } from './types'\n\nexport class DidWebServer {\n get router(): express.Router | undefined {\n return this._router\n }\n\n private readonly _express: Express | undefined\n private readonly _agent: TAgent<IRequiredPlugins> | undefined\n private readonly _opts?: IDidWebServiceOpts\n private readonly _router: Router | undefined\n\n constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: IDidWebServiceOpts }) {\n const { agent, opts } = args\n const features = opts?.enableFeatures ?? []\n if (!features.includes('did-web-global-resolution')) {\n console.log('did:web hosting service NOT enabled')\n return\n }\n\n this._agent = agent\n if (opts?.globalAuth) {\n copyGlobalAuthToEndpoint(opts, 'endpointOpts')\n }\n\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n\n const context = agentContext(agent)\n\n console.log(`did:web hosting service enabled`)\n\n didWebDomainEndpoint(this.router!, context, opts?.endpointOpts)\n this._express.use(this.router!)\n }\n\n get agent(): TAgent<IRequiredPlugins> | undefined {\n return this._agent\n }\n\n get opts(): IDidWebServiceOpts | undefined {\n return this._opts\n }\n\n get express(): Express | undefined {\n return this._express\n }\n}\n\nfunction copyGlobalAuthToEndpoint(opts: IDidWebServiceOpts, key: string) {\n if (opts?.globalAuth) {\n // @ts-ignore\n opts[key] = {\n ...opts?.globalAuth,\n // @ts-ignore\n ...opts[key],\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;ACCA,yBAAyE;AACzE,IAAAA,sBAA0B;AAC1B,iCAAkE;AAElE,uBAAyB;AAIzB,kBAAmB;AAWnB,mBAAkB;AAElB,IAAMC,YAAQC,aAAAA,SAAM,yCAAA;AAEb,SAASC,kBAAkBC,QAAgBC,SAA2BC,MAA6B;AACxG,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,iCAAiC;AAC7C;EACF;AACA,QAAMC,OAAOJ,MAAMI,QAAQ;AAE3BN,SAAOO,KAAKD,UAAME,sCAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AACpE,QAAI;AACF,YAAMC,gBAA8CF,QAAQG;AAC5D,UAAI,CAACD,eAAe;AAClB,mBAAOE,8CAAkBH,UAAU,KAAK,+BAAA;MAC1C;AACA,YAAMI,MAAMH,cAAcG;AAC1B,YAAMC,YAAaN,QAAQO,MAAMC,WAAsBH,UAAMI,2BAASJ,GAAAA,EAAKG,SAAShB,MAAMkB;AAC1F,YAAMC,gBAAgB,UAAMC,uCAAmBrB,OAAAA;AAC/C,UAAI,CAACe,WAAW;AACd,mBAAOF,8CAAkBH,UAAU,KAAK,sCAAA;MAC1C,WAAWI,WAAOI,2BAASJ,GAAAA,EAAKG,UAAUF,WAAW;AACnD,mBAAOF,8CAAkBH,UAAU,KAAK,uCAAA;MAC1C,WAAW,CAACU,cAAcE,SAASP,SAAAA,GAAY;AAC7C,mBAAOF,8CAAkBH,UAAU,KAAK,0BAAA;MAC1C;AACA,YAAMa,WAAW,OAAOR,SAAAA;AACxB,YAAMS,QAAQb,cAAca,aAASC,gBAAAA;AACrC,UAAIC,QAA4BC;AAChC,UAAIZ,cAAc,OAAO;AACvB,YAAI,CAACD,KAAK;AACR,qBAAOD,8CAAkBH,UAAU,KAAK,8EAAA;QAC1C;AACAgB,oBAAQR,2BAASJ,GAAAA,EAAKc;AACtB,YAAI,CAACF,OAAO;AACV,qBAAOb,8CAAkBH,UAAU,KAAK,uDAAuDI,GAAAA;QACjG;MACF;AAEA,UAAIe;AACJ,UAAIC;AACJ,UAAI7B,MAAM8B,wBAAwBjB,KAAK;AACrC,YAAI;AACFe,uBAAa,MAAM7B,QAAQgC,MAAMC,cAAc;YAAEnB;UAAI,CAAA;AACrDgB,kBAAQ;QACV,SAASI,GAAG;QAEZ;MACF;AACA,UAAIL,eAAeF,QAAW;AAC5B,YAAIhB,cAAcwB,QAAQC,iBAAiB,OAAO;AAChD,qBAAOvB,8CAAkBH,UAAU,KAAK,+CAAA;QAM1C,WAAWC,cAAcwB,QAAQC,gBAAgBnC,MAAMmC,cAAc;AACnEP,uBAAa,MAAM7B,QAAQgC,MAAMK,iBAAiB;YAAEd;YAAUG;YAAOY,KAAKrC,MAAMqC;UAAI,CAAA;AACpFR,kBAAQ;QACV,OAAO;AACL,qBAAOjB,8CAAkBH,UAAU,KAAK,+CAAA;QAC1C;MACF;AACA,UAAI,CAACmB,cAAc,CAACC,OAAO;AACzB,mBAAOjB,8CAAkBH,UAAU,KAAK,6DAAA;MAC1C;AAEA,YAAM6B,kBAAcC,kCAAcX,YAAY;QAAEf;QAAK2B,KAAK;UAACC,8BAAUC;UAAWD,8BAAUE;;MAAY,CAAA;AACtG,YAAMC,cAA2B;QAC/BrB;QACAsB,UAAU;UACRhC,KAAKe,WAAWf;UAChBgB;UACAS;QACF;MACF;AACA7B,eAASqC,aAAa;AACtB,aAAOrC,SAASsC,KAAKH,WAAAA;IACvB,SAASX,GAAG;AACV,iBAAOrB,8CAAkBH,UAAU,KAAKwB,EAAEe,SAAmBf,CAAAA;IAC/D;EACF,CAAA;AACF;AAhFgBpC;AAkFT,SAASoD,sBAAsBnD,QAAgBC,SAA2BC,MAA0B;AACzG,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,sCAAsC;AAClD;EACF;AACA,QAAMC,OAAOJ,MAAMI,QAAQ;AAC3BN,SAAOoD,IAAI9C,UAAME,sCAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AACnE,QAAI;AACF,YAAM0C,UAAU,UAAM/B,uCAAmBrB,OAAAA;AACzCU,eAASqC,aAAa;AACtB,aAAOrC,SAASsC,KAAKI,OAAAA;IACvB,SAASlB,GAAG;AACV,iBAAOrB,8CAAkBH,UAAU,KAAKwB,EAAEe,SAAmBf,CAAAA;IAC/D;EACF,CAAA;AACF;AAfgBgB;AAiBhB,eAAeG,2BAA2BrD,SAA2Bc,KAAW;AAC9E,MAAI;AACF,UAAMe,aAAa,MAAM7B,QAAQgC,MAAMC,cAAc;MAAEnB;IAAI,CAAA;AAC3DlB,UAAM0D,KAAKC,UAAU1B,YAAY,MAAM,CAAA,CAAA;AACvC,eAAO2B,0CAAsB3B,YAAY;MACvCf;MACA2C,kBAAkB,UAAMpC,uCAAmBrB,OAAAA;IAC7C,CAAA;EACF,SAAS0D,OAAO;AACdvD,YAAQC,IAAIkD,KAAKC,UAAUG,MAAMT,OAAO,CAAA;AACxC,WAAO;MACLV,aAAa;MACboB,uBAAuB;QACrBD,OAAO;MACT;MACAE,qBAAqB,CAAC;IACxB;EACF;AACF;AAlBeP;AAoBR,SAASQ,mBAAmB9D,QAAgBC,SAA2BC,MAA2B;AACvG,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,kCAAkC;AAC9C;EACF;AACA,QAAMC,OAAOJ,MAAMI,QAAQ;AAC3BN,SAAOoD,IAAI9C,UAAME,sCAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AACnE,QAAI;AACF,YAAMI,MAAML,QAAQqD,OAAOjC;AAC3B,UAAI,CAACf,KAAK;AACR,mBAAOD,8CAAkBH,UAAU,KAAK,wBAAA;MAC1C;AACA,YAAMqD,OAAOtD,QAAQO,MAAM+C,MAAMC,SAAAA,EAAWC,YAAAA,KAAiBhE,MAAM8D,MAAME,YAAAA,KAAiB;AAC1F,UAAIC;AACJ,UAAIH,SAAS,WAAWA,SAAS,UAAU;AACzCG,2BAAmB,MAAMb,2BAA2BrD,SAASc,GAAAA;MAC/D;AACA,UAAIiD,SAAS,WAAW,CAACG,kBAAkB3B,aAAa;AACtD2B,2BAAmB,MAAMlE,QAAQgC,MAAMmC,WAAW;UAAEC,QAAQtD;QAAI,CAAA;MAClE;AAEAJ,eAASqC,aAAa;AACtB,aAAOrC,SAASsC,KAAKkB,gBAAAA;IACvB,SAAShC,GAAG;AACV,iBAAOrB,8CAAkBH,UAAU,KAAKwB,EAAEe,SAAmBf,CAAAA;IAC/D;EACF,CAAA;AACF;AA3BgB2B;AAkCT,SAASQ,kBAAkBtE,QAAgBC,SAA2BC,MAA0B;AACrG,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,qCAAqC;AACjD;EACF;AACAL,SAAOuE,OAAOrE,MAAMI,QAAQ,gCAA4BE,sCAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AAC1G,QAAI;AACF,YAAMI,MAAML,QAAQqD,OAAOjC;AAC3B,UAAI,CAACf,KAAK;AACR,mBAAOD,8CAAkBH,UAAU,KAAK,iBAAA;MAC1C;AAEA,YAAM6D,SAAS,MAAMvE,QAAQgC,MAAMwC,iBAAiB;QAAE1D;MAAI,CAAA;AAC1D,UAAI,CAACyD,QAAQ;AACX,mBAAO1D,8CAAkBH,UAAU,KAAK,MAAMI,GAAAA,YAAe;MAC/D;AACAJ,eAASqC,aAAa;AACtB,aAAOrC,SAASsC,KAAI;IACtB,SAASd,GAAG;AACV,iBAAOrB,8CAAkBH,UAAU,KAAKwB,EAAEe,SAAmBf,CAAAA;IAC/D;EACF,CAAA;AACF;AAtBgBmC;AAwBT,SAASI,sBAAsB1E,QAAgBC,SAA2BC,MAA0B;AACzG,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,qCAAA;AACZ;EACF;AAEAL,SAAOO,KAAKL,MAAMI,QAAQ,mBAAeE,sCAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AAC3F,QAAI;AACF,YAAMgE,oBAAsDjE,QAAQG;AACpE,UAAI,CAAC8D,mBAAmB;AACtB,mBAAO7D,8CAAkBH,UAAU,KAAK,wBAAwB;UAAEoB,OAAO;QAAS,CAAA;MACpF;AAEA,YAAM,EAAEhB,KAAKU,YAAQC,gBAAAA,EAAI,IAAKiD;AAC9B,UAAI,CAAC5D,KAAK;AACR,mBAAOD,8CAAkBH,UAAU,KAAK,mBAAmB;UAAEoB,OAAO;QAAS,CAAA;MAC/E;AAEA,YAAMyC,SAAS,MAAMvE,QAAQgC,MAAMwC,iBAAiB;QAAE1D;MAAI,CAAA;AAC1D,UAAI,CAACyD,QAAQ;AACX,mBAAO1D,8CAAkBH,UAAU,KAAK,OAAOI,GAAAA,cAAiB;UAAEgB,OAAO;QAAS,CAAA;MACpF;AAEApB,eAASiE,OAAO,GAAA,EAAKC,KAAK;QACxB9C,OAAO;QACPhB;QACAU;MACF,CAAA;AACA,aAAOd,SAASsC,KAAI;IACtB,SAASd,GAAG;AACV,iBAAOrB,8CAAkBH,UAAU,KAAKwB,EAAEe,SAAmB;QAAEnB,OAAO;QAAU+C,cAAc3C;MAAE,CAAA;IAClG;EACF,CAAA;AACF;AAjCgBuC;AAkDT,SAASK,qBAAqB/E,QAAgBC,SAA2BC,MAAgC;AAC9G,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,gDAAgD;AAC5D;EACF;AACAL,SAAOoD,IAAIlD,MAAMI,QAAQ,yBAAqBE,sCAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AAChG,QAAI;AACF,YAAML,OAAOI,QAAQqD,OAAOzD;AAC5B,UAAI,CAACA,QAAQA,KAAK0E,WAAW,GAAG;AAC9B,mBAAOlE,8CAAkBH,UAAU,KAAK,WAAA;MAC1C;AACA,UAAII;AACJA,YAAM,WAAWb,MAAM+E,UAAUC,QAAQ,YAAY,EAAA,GAAKA,QAAQ,WAAW,EAAA,KAAOxE,QAAQuE,QAAQ;AACpG,UAAI3E,SAAS,gBAAgB;AAC3B,YAAIJ,MAAMiF,iBAAiB;AACzB,qBAAOrE,8CAAkBH,UAAU,KAAK,WAAA;QAC1C;AACA,cAAMyE,SAAS9E,KAAK4E,QAAQ,OAAO,GAAA,EAAKA,QAAQ,QAAQ,GAAA;AACxD,YAAI,CAACE,OAAOC,WAAW,GAAA,GAAM;AAC3BtE,iBAAO;QACT;AACAA,eAAOqE;MACT,WAAWlF,MAAMoF,kBAAkB;AACjC,mBAAOxE,8CAAkBH,UAAU,KAAK,WAAA;MAC1C;AAEA,YAAMwD,mBAAmB,MAAMb,2BAA2BrD,SAASc,GAAAA;AACnE,UAAI,CAACoD,oBAAoB,CAACA,iBAAiB3B,eAAe2B,kBAAkBP,uBAAuBD,UAAU,YAAY;AACvH,mBAAO7C,8CAAkBH,UAAU,KAAK,WAAA;MAC1C;AAEA,YAAM4E,iBAA8C,MAAMtF,QAAQgC,MAAMuD,qBAAqB;QAAEC,YAAY1E;MAAI,CAAA;AAC/G,UAAIoD,kBAAkB3B,eAAe+C,gBAAgB;AAEnD,cAAMG,mBAAmBvB,iBAAiB3B,YAAYmD,WAAW,CAAA;AACjE,cAAMC,iBAAiBF,iBAAiBG,OAAO,CAACF,YAAYA,QAAQG,SAAS,8BAAA;AAG7E3B,yBAAiB3B,YAAYmD,UAAU;aAAIC;aAAmBL;;MAChE;AAEA5E,eAASqC,aAAa;AACtB,aAAOrC,SAASsC,KAAKkB,iBAAiB3B,WAAW;IACnD,SAASL,GAAG;AACV,iBAAOrB,8CAAkBH,UAAU,KAAKwB,EAAEe,SAAmBf,CAAAA;IAC/D;EACF,CAAA;AACF;AA/CgB4C;;;AC3PhB,qBAA6B;AAC7B,IAAAgB,8BAA0D;AAG1D,qBAAyC;AAIlC,IAAMC,uBAAN,MAAMA;EARb,OAQaA;;;EACX,IAAIC,SAAyB;AAC3B,WAAO,KAAKC;EACd;EAEiBC;EACAC;EACAC;EACAH;EAEjB,YAAYI,MAA+F;AACzG,UAAM,EAAEC,OAAOC,KAAI,IAAKF;AACxB,SAAKF,SAASG;AACdE,+DAA0B;MAAED;MAAME,MAAM;QAAC;QAAiB;QAAa;QAAc;;IAAiB,CAAA;AACtG,SAAKL,QAAQG;AACb,SAAKL,WAAWG,KAAKK,eAAeC;AACpC,SAAKV,UAAUU,eAAAA,QAAQC,OAAM;AAC7B,UAAMC,cAAUC,6BAAaR,KAAAA;AAC7B,UAAMS,WAAWR,MAAMS,kBAAkB;MAAC;MAAe;;AACzDC,YAAQC,IAAI,8DAA8DC,KAAKC,UAAUL,QAAAA,CAAAA,GAAY;AAGrG,QAAIA,SAASM,SAAS,aAAA,GAAgB;AACpCC,yBAAmB,KAAKtB,QAAQa,SAASN,MAAMgB,cAAcC,UAAAA;AAC7DC,4BAAsB,KAAKzB,QAAQa,SAASN,MAAMgB,cAAcG,aAAAA;IAClE;AACA,QAAIX,SAASM,SAAS,aAAA,GAAgB;AACpCM,wBAAkB,KAAK3B,QAAQa,SAASN,MAAMgB,cAAcK,SAAAA;AAC5DC,wBAAkB,KAAK7B,QAAQa,SAASN,MAAMgB,cAAcO,aAAAA;AAC5DC,4BAAsB,KAAK/B,QAAQa,SAASN,MAAMgB,cAAcO,aAAAA;IAClE;AACA,SAAK5B,SAAS8B,IAAIzB,MAAMgB,cAAcU,YAAY,IAAI,KAAKjC,MAAM;EACnE;EAEA,IAAIM,QAAkC;AACpC,WAAO,KAAKH;EACd;EAEA,IAAII,OAAgC;AAClC,WAAO,KAAKH;EACd;EAEA,IAAIO,UAAmB;AACrB,WAAO,KAAKT;EACd;AACF;;;ACrDA,IAAAgC,kBAA6B;AAI7B,IAAAC,kBAAyC;AAIlC,IAAMC,eAAN,MAAMA;EARb,OAQaA;;;EACX,IAAIC,SAAqC;AACvC,WAAO,KAAKC;EACd;EAEiBC;EACAC;EACAC;EACAH;EAEjB,YAAYI,MAAsG;AAChH,UAAM,EAAEC,OAAOC,KAAI,IAAKF;AACxB,UAAMG,WAAWD,MAAME,kBAAkB,CAAA;AACzC,QAAI,CAACD,SAASE,SAAS,2BAAA,GAA8B;AACnDC,cAAQC,IAAI,qCAAA;AACZ;IACF;AAEA,SAAKT,SAASG;AACd,QAAIC,MAAMM,YAAY;AACpBC,+BAAyBP,MAAM,cAAA;IACjC;AAEA,SAAKH,QAAQG;AACb,SAAKL,WAAWG,KAAKU,eAAeC;AACpC,SAAKf,UAAUe,gBAAAA,QAAQC,OAAM;AAE7B,UAAMC,cAAUC,8BAAab,KAAAA;AAE7BK,YAAQC,IAAI,iCAAiC;AAE7CQ,yBAAqB,KAAKpB,QAASkB,SAASX,MAAMc,YAAAA;AAClD,SAAKnB,SAASoB,IAAI,KAAKtB,MAAM;EAC/B;EAEA,IAAIM,QAA8C;AAChD,WAAO,KAAKH;EACd;EAEA,IAAII,OAAuC;AACzC,WAAO,KAAKH;EACd;EAEA,IAAIY,UAA+B;AACjC,WAAO,KAAKd;EACd;AACF;AAEA,SAASY,yBAAyBP,MAA0BgB,KAAW;AACrE,MAAIhB,MAAMM,YAAY;AAEpBN,SAAKgB,GAAAA,IAAO;MACV,GAAGhB,MAAMM;;MAET,GAAGN,KAAKgB,GAAAA;IACV;EACF;AACF;AATST;","names":["import_ssi_sdk_ext","debug","Debug","createDidEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","request","response","createRequest","body","sendErrorResponse","did","didMethod","query","method","parseDid","defaultMethod","allDidMethods","getAgentDIDMethods","includes","provider","jobId","v4","alias","undefined","id","identifier","state","noErrorOnExistingDid","agent","didManagerGet","e","options","storeSecrets","didManagerCreate","kms","didDocument","toDidDocument","use","JwkKeyUse","Signature","Encryption","createState","didState","statusCode","send","message","getDidMethodsEndpoint","get","methods","agentDidToResolutionResult","JSON","stringify","toDidResolutionResult","supportedMethods","error","didResolutionMetadata","didDocumentMetadata","resolveDidEndpoint","params","mode","toString","toLowerCase","resolutionResult","resolveDid","didUrl","deleteDidEndpoint","delete","result","didManagerDelete","deactivateDidEndpoint","deactivateRequest","status","json","errorDetails","didWebDomainEndpoint","length","hostname","replace","disableSubPaths","suffix","startsWith","disableWellKnown","serviceEntries","lvpGetServiceEntries","subjectDid","existingServices","service","nonLVPServices","filter","type","import_ssi_express_support","UniResolverApiServer","router","_router","_express","_agent","_opts","args","agent","opts","copyGlobalAuthToEndpoints","keys","expressSupport","express","Router","context","agentContext","features","enableFeatures","console","log","JSON","stringify","includes","resolveDidEndpoint","endpointOpts","resolveDid","getDidMethodsEndpoint","getDidMethods","createDidEndpoint","createDid","deleteDidEndpoint","deactivateDid","deactivateDidEndpoint","use","basePath","import_ssi_sdk","import_express","DidWebServer","router","_router","_express","_agent","_opts","args","agent","opts","features","enableFeatures","includes","console","log","globalAuth","copyGlobalAuthToEndpoint","expressSupport","express","Router","context","agentContext","didWebDomainEndpoint","endpointOpts","use","key"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/api-functions.ts","../src/uni-resolver-api-server.ts","../src/did-web-server.ts"],"sourcesContent":["/**\n * @public\n */\nexport * from './types'\nexport * from './api-functions'\nexport * from './uni-resolver-api-server'\nexport * from './did-web-server'\n","import { DIDResolutionResult } from '@sphereon/did-uni-client'\nimport { getAgentDIDMethods, toDidDocument, toDidResolutionResult } from '@sphereon/ssi-sdk-ext.did-utils'\nimport { JwkKeyUse } from '@sphereon/ssi-sdk-ext.key-utils'\nimport { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { LinkedVPServiceEntry } from '@sphereon/ssi-sdk.linked-vp'\nimport { parseDid } from '@sphereon/ssi-types'\nimport { IIdentifier } from '@veramo/core'\nimport { Service } from 'did-resolver'\nimport { Request, Response, Router } from 'express'\nimport { v4 } from 'uuid'\nimport {\n CreateState,\n DidRegistrationCreateRequest,\n DidRegistrationDeactivateRequest,\n DidStateValue,\n ICreateDidEndpointOpts,\n IGlobalDidWebEndpointOpts,\n IRequiredContext,\n IResolveEndpointOpts,\n} from './types'\nimport Debug from 'debug'\n\nconst debug = Debug('sphereon:ssi-sdk:uni-resolver-registrar')\n\nexport function createDidEndpoint(router: Router, context: IRequiredContext, opts?: ICreateDidEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`create DID endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/identifiers'\n\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const createRequest: DidRegistrationCreateRequest = request.body\n if (!createRequest) {\n return sendErrorResponse(response, 400, 'No DID create request present')\n }\n const did = createRequest.did\n const didMethod = (request.query.method as string) ?? (did ? parseDid(did).method : opts?.defaultMethod)\n const allDidMethods = await getAgentDIDMethods(context)\n if (!didMethod) {\n return sendErrorResponse(response, 400, 'No DID method supplied or deductible')\n } else if (did && parseDid(did).method != didMethod) {\n return sendErrorResponse(response, 400, 'DID method did not match method param')\n } else if (!allDidMethods.includes(didMethod)) {\n return sendErrorResponse(response, 400, 'DID method not supported')\n }\n const provider = `did:${didMethod}`\n const jobId = createRequest.jobId ?? v4()\n let alias: string | undefined = undefined\n if (didMethod === 'web') {\n if (!did) {\n return sendErrorResponse(response, 400, 'Please provide a value for \"did\" in the request body when creating a DID web')\n }\n alias = parseDid(did).id\n if (!alias) {\n return sendErrorResponse(response, 400, 'Could not determine alias from did:web DID value: ' + did)\n }\n }\n\n let identifier: IIdentifier | undefined\n let state: DidStateValue | undefined\n if (opts?.noErrorOnExistingDid && did) {\n try {\n identifier = await context.agent.didManagerGet({ did })\n state = 'exists'\n } catch (e) {\n // Okay, since we will create a new one\n }\n }\n if (identifier === undefined) {\n if (createRequest.options.storeSecrets === false) {\n return sendErrorResponse(response, 400, 'Only storeSecrets mode is supported currently')\n /*const memoryKMS = new SphereonKeyManager({\n store: new MemoryKeyStore(),\n kms: {'mem': new KeyManagementSystem(new MemoryPrivateKeyStore())}\n })\n identifier = await memoryKMS..didManagerCreate({provider, alias, kms: opts?.kms})*/\n } else if (createRequest.options.storeSecrets || opts?.storeSecrets) {\n identifier = await context.agent.didManagerCreate({ provider, alias, kms: opts?.kms })\n state = 'finished'\n } else {\n return sendErrorResponse(response, 400, 'Only storeSecrets mode is supported currently')\n }\n }\n if (!identifier || !state) {\n return sendErrorResponse(response, 400, 'An identifier and did state should be present at this point')\n }\n\n const didDocument = toDidDocument(identifier, { did, use: [JwkKeyUse.Signature, JwkKeyUse.Encryption] })\n const createState: CreateState = {\n jobId,\n didState: {\n did: identifier.did,\n state,\n didDocument,\n },\n }\n response.statusCode = 200\n return response.send(createState)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function getDidMethodsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get DID methods endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/methods'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const methods = await getAgentDIDMethods(context) // these are already without the 'did:' prefix\n response.statusCode = 200\n return response.send(methods)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nasync function agentDidToResolutionResult(context: IRequiredContext, did: string) {\n try {\n const identifier = await context.agent.didManagerGet({ did })\n debug(JSON.stringify(identifier, null, 2))\n return toDidResolutionResult(identifier, {\n did,\n supportedMethods: await getAgentDIDMethods(context),\n })\n } catch (error) {\n console.log(JSON.stringify(error.message))\n return {\n didDocument: null,\n didResolutionMetadata: {\n error: 'notFound',\n },\n didDocumentMetadata: {},\n }\n }\n}\n\nexport function resolveDidEndpoint(router: Router, context: IRequiredContext, opts?: IResolveEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Resolve DID endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/identifiers/:identifier'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const did = request.params.identifier\n if (!did) {\n return sendErrorResponse(response, 400, 'no identifier provided')\n }\n const mode = request.query.mode?.toString().toLowerCase() ?? opts?.mode?.toLowerCase() ?? 'hybrid'\n let resolutionResult: DIDResolutionResult | undefined\n if (mode === 'local' || mode === 'hybrid') {\n resolutionResult = await agentDidToResolutionResult(context, did)\n }\n if (mode !== 'local' && !resolutionResult?.didDocument) {\n resolutionResult = await context.agent.resolveDid({ didUrl: did })\n }\n\n response.statusCode = 200\n return response.send(resolutionResult)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\n/**\n * @param router\n * @param context\n * @param opts\n */\nexport function deleteDidEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Deactivate DID endpoint is disabled`)\n return\n }\n router.delete(opts?.path ?? '/identifiers/:identifier', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const did = request.params.identifier\n if (!did) {\n return sendErrorResponse(response, 400, 'no DID provided')\n }\n\n const result = await context.agent.didManagerDelete({ did })\n if (!result) {\n return sendErrorResponse(response, 404, `id ${did} not found`)\n }\n response.statusCode = 200\n return response.send()\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function deactivateDidEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log('Deactivate DID endpoint is disabled')\n return\n }\n\n router.post(opts?.path ?? '/deactivate', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const deactivateRequest: DidRegistrationDeactivateRequest = request.body\n if (!deactivateRequest) {\n return sendErrorResponse(response, 400, 'Invalid request body', { state: 'failed' })\n }\n\n const { did, jobId = v4() } = deactivateRequest\n if (!did) {\n return sendErrorResponse(response, 400, 'No DID provided', { state: 'failed' })\n }\n\n const result = await context.agent.didManagerDelete({ did })\n if (!result) {\n return sendErrorResponse(response, 404, `DID ${did} not found`, { state: 'failed' })\n }\n\n response.status(200).json({\n state: 'finished',\n did,\n jobId,\n })\n return response.send()\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, { state: 'failed', errorDetails: e })\n }\n })\n}\n\n/**\n * Endpoint that eases DID web resolution, by mapping did-web paths to stored agent DIDs.\n *\n * Typically, you will have a reverse proxy or load balancer in front of this endpoint.\n *\n * Some examples of how did:web behaves:\n * did:web:example.com resolves to https://example.com/.well-known/did.json\n * did:web:example.com:sub:paths resolves to https://example.com/sub/paths/did.json\n *\n * This endpoint translate both forms by looking at the paths that end in /did.json.\n *\n * @param router\n * @param context\n * @param opts\n */\nexport function didWebDomainEndpoint(router: Router, context: IRequiredContext, opts?: IGlobalDidWebEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`DID Web domain resolution endpoint is disabled`)\n return\n }\n router.get(opts?.path ?? ':path(*)/did.json', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const path = request.params.path\n if (!path || path.length === 0) {\n return sendErrorResponse(response, 404, 'Not found')\n }\n let did: string\n did = `did:web:${opts?.hostname?.replace('https://', '')?.replace('http://', '') ?? request.hostname}`\n if (path !== '/.well-known') {\n if (opts?.disableSubPaths) {\n return sendErrorResponse(response, 404, 'Not found')\n }\n const suffix = path.replace(/\\//g, ':').replace(/%2F/g, ':')\n if (!suffix.startsWith(':')) {\n did += ':'\n }\n did += suffix\n } else if (opts?.disableWellKnown) {\n return sendErrorResponse(response, 404, 'Not found')\n }\n\n const resolutionResult = await agentDidToResolutionResult(context, did)\n if (!resolutionResult || !resolutionResult.didDocument || resolutionResult?.didResolutionMetadata?.error === 'notFound') {\n return sendErrorResponse(response, 404, 'Not found')\n }\n\n const serviceEntries: Array<LinkedVPServiceEntry> = await context.agent.lvpGetServiceEntries({ subjectDid: did })\n if (resolutionResult?.didDocument && serviceEntries) {\n // Preserve existing services that are not LinkedVerifiablePresentation type\n const existingServices = resolutionResult.didDocument.service || []\n const nonLVPServices = existingServices.filter((service) => service.type !== 'LinkedVerifiablePresentation')\n\n // Combine non-LVP services with the new LVP service entries\n resolutionResult.didDocument.service = [...nonLVPServices, ...serviceEntries] as Array<Service>\n }\n\n // Enrich services with metadata from the database (for eInvoicing services)\n // Also remove null/undefined values from service objects\n const cleanService = (svc: Service): Service => {\n return Object.fromEntries(\n Object.entries(svc).filter(([_, v]) => v !== null && v !== undefined)\n ) as Service\n }\n\n if (resolutionResult?.didDocument?.service && typeof context.agent.getServiceMetadata === 'function') {\n const enrichedServices = await Promise.all(\n resolutionResult.didDocument.service.map(async (service: Service) => {\n try {\n const metadata = await context.agent.getServiceMetadata({\n serviceId: service.id as string,\n did,\n })\n if (metadata?.einvoice) {\n return cleanService({ ...service, einvoice: metadata.einvoice })\n }\n } catch (e) {\n // Service metadata not available, continue with basic service\n debug(`No metadata found for service ${service.id}`)\n }\n return cleanService(service)\n })\n )\n resolutionResult.didDocument.service = enrichedServices as Array<Service>\n } else if (resolutionResult?.didDocument?.service) {\n // Clean services even without metadata enrichment\n resolutionResult.didDocument.service = resolutionResult.didDocument.service.map(cleanService) as Array<Service>\n }\n\n response.statusCode = 200\n return response.send(resolutionResult.didDocument)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n","import { agentContext } from '@sphereon/ssi-sdk.core'\nimport { copyGlobalAuthToEndpoints, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { TAgent } from '@veramo/core'\n\nimport express, { Express, Router } from 'express'\nimport { createDidEndpoint, deleteDidEndpoint, deactivateDidEndpoint, getDidMethodsEndpoint, resolveDidEndpoint } from './api-functions'\nimport { IDidAPIOpts, IRequiredPlugins } from './types'\n\nexport class UniResolverApiServer {\n get router(): express.Router {\n return this._router\n }\n\n private readonly _express: Express\n private readonly _agent: TAgent<IRequiredPlugins>\n private readonly _opts?: IDidAPIOpts\n private readonly _router: Router\n\n constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: IDidAPIOpts }) {\n const { agent, opts } = args\n this._agent = agent\n copyGlobalAuthToEndpoints({ opts, keys: ['getDidMethods', 'createDid', 'resolveDid', 'deactivateDid'] })\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n const context = agentContext(agent)\n const features = opts?.enableFeatures ?? ['did-resolve', 'did-persist']\n console.log(`DID Uni Resolver and Registrar API enabled, with features: ${JSON.stringify(features)}}`)\n\n // DID endpoints\n if (features.includes('did-resolve')) {\n resolveDidEndpoint(this.router, context, opts?.endpointOpts?.resolveDid)\n getDidMethodsEndpoint(this.router, context, opts?.endpointOpts?.getDidMethods)\n }\n if (features.includes('did-persist')) {\n createDidEndpoint(this.router, context, opts?.endpointOpts?.createDid)\n deleteDidEndpoint(this.router, context, opts?.endpointOpts?.deactivateDid) // not in spec.\n deactivateDidEndpoint(this.router, context, opts?.endpointOpts?.deactivateDid)\n }\n this._express.use(opts?.endpointOpts?.basePath ?? '', this.router)\n }\n\n get agent(): TAgent<IRequiredPlugins> {\n return this._agent\n }\n\n get opts(): IDidAPIOpts | undefined {\n return this._opts\n }\n\n get express(): Express {\n return this._express\n }\n}\n","import { agentContext } from '@sphereon/ssi-sdk.core'\nimport { ExpressSupport } from '@sphereon/ssi-express-support'\nimport { TAgent } from '@veramo/core'\n\nimport express, { Express, Router } from 'express'\nimport { didWebDomainEndpoint } from './api-functions'\nimport { IDidWebServiceOpts, IRequiredPlugins } from './types'\n\nexport class DidWebServer {\n get router(): express.Router | undefined {\n return this._router\n }\n\n private readonly _express: Express | undefined\n private readonly _agent: TAgent<IRequiredPlugins> | undefined\n private readonly _opts?: IDidWebServiceOpts\n private readonly _router: Router | undefined\n\n constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: IDidWebServiceOpts }) {\n const { agent, opts } = args\n const features = opts?.enableFeatures ?? []\n if (!features.includes('did-web-global-resolution')) {\n console.log('did:web hosting service NOT enabled')\n return\n }\n\n this._agent = agent\n if (opts?.globalAuth) {\n copyGlobalAuthToEndpoint(opts, 'endpointOpts')\n }\n\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n\n const context = agentContext(agent)\n\n console.log(`did:web hosting service enabled`)\n\n didWebDomainEndpoint(this.router!, context, opts?.endpointOpts)\n this._express.use(this.router!)\n }\n\n get agent(): TAgent<IRequiredPlugins> | undefined {\n return this._agent\n }\n\n get opts(): IDidWebServiceOpts | undefined {\n return this._opts\n }\n\n get express(): Express | undefined {\n return this._express\n }\n}\n\nfunction copyGlobalAuthToEndpoint(opts: IDidWebServiceOpts, key: string) {\n if (opts?.globalAuth) {\n // @ts-ignore\n opts[key] = {\n ...opts?.globalAuth,\n // @ts-ignore\n ...opts[key],\n }\n }\n}\n"],"mappings":"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","names":["import_ssi_sdk_ext","debug","Debug","createDidEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","request","response","createRequest","body","sendErrorResponse","did","didMethod","query","method","parseDid","defaultMethod","allDidMethods","getAgentDIDMethods","includes","provider","jobId","v4","alias","undefined","id","identifier","state","noErrorOnExistingDid","agent","didManagerGet","e","options","storeSecrets","didManagerCreate","kms","didDocument","toDidDocument","use","JwkKeyUse","Signature","Encryption","createState","didState","statusCode","send","message","getDidMethodsEndpoint","get","methods","agentDidToResolutionResult","JSON","stringify","toDidResolutionResult","supportedMethods","error","didResolutionMetadata","didDocumentMetadata","resolveDidEndpoint","params","mode","toString","toLowerCase","resolutionResult","resolveDid","didUrl","deleteDidEndpoint","delete","result","didManagerDelete","deactivateDidEndpoint","deactivateRequest","status","json","errorDetails","didWebDomainEndpoint","length","hostname","replace","disableSubPaths","suffix","startsWith","disableWellKnown","serviceEntries","lvpGetServiceEntries","subjectDid","existingServices","service","nonLVPServices","filter","type","cleanService","svc","Object","fromEntries","entries","_","v","getServiceMetadata","enrichedServices","Promise","all","map","metadata","serviceId","einvoice","import_ssi_express_support","UniResolverApiServer","router","_router","_express","_agent","_opts","args","agent","opts","copyGlobalAuthToEndpoints","keys","expressSupport","express","Router","context","agentContext","features","enableFeatures","console","log","JSON","stringify","includes","resolveDidEndpoint","endpointOpts","resolveDid","getDidMethodsEndpoint","getDidMethods","createDidEndpoint","createDid","deleteDidEndpoint","deactivateDid","deactivateDidEndpoint","use","basePath","import_ssi_sdk","import_express","DidWebServer","router","_router","_express","_agent","_opts","args","agent","opts","features","enableFeatures","includes","console","log","globalAuth","copyGlobalAuthToEndpoint","expressSupport","express","Router","context","agentContext","didWebDomainEndpoint","endpointOpts","use","key"]}
package/dist/index.js CHANGED
@@ -270,6 +270,31 @@ function didWebDomainEndpoint(router, context, opts) {
270
270
  ...serviceEntries
271
271
  ];
272
272
  }
273
+ const cleanService = /* @__PURE__ */ __name((svc) => {
274
+ return Object.fromEntries(Object.entries(svc).filter(([_, v]) => v !== null && v !== void 0));
275
+ }, "cleanService");
276
+ if (resolutionResult?.didDocument?.service && typeof context.agent.getServiceMetadata === "function") {
277
+ const enrichedServices = await Promise.all(resolutionResult.didDocument.service.map(async (service) => {
278
+ try {
279
+ const metadata = await context.agent.getServiceMetadata({
280
+ serviceId: service.id,
281
+ did
282
+ });
283
+ if (metadata?.einvoice) {
284
+ return cleanService({
285
+ ...service,
286
+ einvoice: metadata.einvoice
287
+ });
288
+ }
289
+ } catch (e) {
290
+ debug(`No metadata found for service ${service.id}`);
291
+ }
292
+ return cleanService(service);
293
+ }));
294
+ resolutionResult.didDocument.service = enrichedServices;
295
+ } else if (resolutionResult?.didDocument?.service) {
296
+ resolutionResult.didDocument.service = resolutionResult.didDocument.service.map(cleanService);
297
+ }
273
298
  response.statusCode = 200;
274
299
  return response.send(resolutionResult.didDocument);
275
300
  } catch (e) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api-functions.ts","../src/uni-resolver-api-server.ts","../src/did-web-server.ts"],"sourcesContent":["import { DIDResolutionResult } from '@sphereon/did-uni-client'\nimport { getAgentDIDMethods, toDidDocument, toDidResolutionResult } from '@sphereon/ssi-sdk-ext.did-utils'\nimport { JwkKeyUse } from '@sphereon/ssi-sdk-ext.key-utils'\nimport { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { LinkedVPServiceEntry } from '@sphereon/ssi-sdk.linked-vp'\nimport { parseDid } from '@sphereon/ssi-types'\nimport { IIdentifier } from '@veramo/core'\nimport { Service } from 'did-resolver'\nimport { Request, Response, Router } from 'express'\nimport { v4 } from 'uuid'\nimport {\n CreateState,\n DidRegistrationCreateRequest,\n DidRegistrationDeactivateRequest,\n DidStateValue,\n ICreateDidEndpointOpts,\n IGlobalDidWebEndpointOpts,\n IRequiredContext,\n IResolveEndpointOpts,\n} from './types'\nimport Debug from 'debug'\n\nconst debug = Debug('sphereon:ssi-sdk:uni-resolver-registrar')\n\nexport function createDidEndpoint(router: Router, context: IRequiredContext, opts?: ICreateDidEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`create DID endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/identifiers'\n\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const createRequest: DidRegistrationCreateRequest = request.body\n if (!createRequest) {\n return sendErrorResponse(response, 400, 'No DID create request present')\n }\n const did = createRequest.did\n const didMethod = (request.query.method as string) ?? (did ? parseDid(did).method : opts?.defaultMethod)\n const allDidMethods = await getAgentDIDMethods(context)\n if (!didMethod) {\n return sendErrorResponse(response, 400, 'No DID method supplied or deductible')\n } else if (did && parseDid(did).method != didMethod) {\n return sendErrorResponse(response, 400, 'DID method did not match method param')\n } else if (!allDidMethods.includes(didMethod)) {\n return sendErrorResponse(response, 400, 'DID method not supported')\n }\n const provider = `did:${didMethod}`\n const jobId = createRequest.jobId ?? v4()\n let alias: string | undefined = undefined\n if (didMethod === 'web') {\n if (!did) {\n return sendErrorResponse(response, 400, 'Please provide a value for \"did\" in the request body when creating a DID web')\n }\n alias = parseDid(did).id\n if (!alias) {\n return sendErrorResponse(response, 400, 'Could not determine alias from did:web DID value: ' + did)\n }\n }\n\n let identifier: IIdentifier | undefined\n let state: DidStateValue | undefined\n if (opts?.noErrorOnExistingDid && did) {\n try {\n identifier = await context.agent.didManagerGet({ did })\n state = 'exists'\n } catch (e) {\n // Okay, since we will create a new one\n }\n }\n if (identifier === undefined) {\n if (createRequest.options.storeSecrets === false) {\n return sendErrorResponse(response, 400, 'Only storeSecrets mode is supported currently')\n /*const memoryKMS = new SphereonKeyManager({\n store: new MemoryKeyStore(),\n kms: {'mem': new KeyManagementSystem(new MemoryPrivateKeyStore())}\n })\n identifier = await memoryKMS..didManagerCreate({provider, alias, kms: opts?.kms})*/\n } else if (createRequest.options.storeSecrets || opts?.storeSecrets) {\n identifier = await context.agent.didManagerCreate({ provider, alias, kms: opts?.kms })\n state = 'finished'\n } else {\n return sendErrorResponse(response, 400, 'Only storeSecrets mode is supported currently')\n }\n }\n if (!identifier || !state) {\n return sendErrorResponse(response, 400, 'An identifier and did state should be present at this point')\n }\n\n const didDocument = toDidDocument(identifier, { did, use: [JwkKeyUse.Signature, JwkKeyUse.Encryption] })\n const createState: CreateState = {\n jobId,\n didState: {\n did: identifier.did,\n state,\n didDocument,\n },\n }\n response.statusCode = 200\n return response.send(createState)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function getDidMethodsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get DID methods endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/methods'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const methods = await getAgentDIDMethods(context) // these are already without the 'did:' prefix\n response.statusCode = 200\n return response.send(methods)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nasync function agentDidToResolutionResult(context: IRequiredContext, did: string) {\n try {\n const identifier = await context.agent.didManagerGet({ did })\n debug(JSON.stringify(identifier, null, 2))\n return toDidResolutionResult(identifier, {\n did,\n supportedMethods: await getAgentDIDMethods(context),\n })\n } catch (error) {\n console.log(JSON.stringify(error.message))\n return {\n didDocument: null,\n didResolutionMetadata: {\n error: 'notFound',\n },\n didDocumentMetadata: {},\n }\n }\n}\n\nexport function resolveDidEndpoint(router: Router, context: IRequiredContext, opts?: IResolveEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Resolve DID endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/identifiers/:identifier'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const did = request.params.identifier\n if (!did) {\n return sendErrorResponse(response, 400, 'no identifier provided')\n }\n const mode = request.query.mode?.toString().toLowerCase() ?? opts?.mode?.toLowerCase() ?? 'hybrid'\n let resolutionResult: DIDResolutionResult | undefined\n if (mode === 'local' || mode === 'hybrid') {\n resolutionResult = await agentDidToResolutionResult(context, did)\n }\n if (mode !== 'local' && !resolutionResult?.didDocument) {\n resolutionResult = await context.agent.resolveDid({ didUrl: did })\n }\n\n response.statusCode = 200\n return response.send(resolutionResult)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\n/**\n * @param router\n * @param context\n * @param opts\n */\nexport function deleteDidEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Deactivate DID endpoint is disabled`)\n return\n }\n router.delete(opts?.path ?? '/identifiers/:identifier', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const did = request.params.identifier\n if (!did) {\n return sendErrorResponse(response, 400, 'no DID provided')\n }\n\n const result = await context.agent.didManagerDelete({ did })\n if (!result) {\n return sendErrorResponse(response, 404, `id ${did} not found`)\n }\n response.statusCode = 200\n return response.send()\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function deactivateDidEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log('Deactivate DID endpoint is disabled')\n return\n }\n\n router.post(opts?.path ?? '/deactivate', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const deactivateRequest: DidRegistrationDeactivateRequest = request.body\n if (!deactivateRequest) {\n return sendErrorResponse(response, 400, 'Invalid request body', { state: 'failed' })\n }\n\n const { did, jobId = v4() } = deactivateRequest\n if (!did) {\n return sendErrorResponse(response, 400, 'No DID provided', { state: 'failed' })\n }\n\n const result = await context.agent.didManagerDelete({ did })\n if (!result) {\n return sendErrorResponse(response, 404, `DID ${did} not found`, { state: 'failed' })\n }\n\n response.status(200).json({\n state: 'finished',\n did,\n jobId,\n })\n return response.send()\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, { state: 'failed', errorDetails: e })\n }\n })\n}\n\n/**\n * Endpoint that eases DID web resolution, by mapping did-web paths to stored agent DIDs.\n *\n * Typically, you will have a reverse proxy or load balancer in front of this endpoint.\n *\n * Some examples of how did:web behaves:\n * did:web:example.com resolves to https://example.com/.well-known/did.json\n * did:web:example.com:sub:paths resolves to https://example.com/sub/paths/did.json\n *\n * This endpoint translate both forms by looking at the paths that end in /did.json.\n *\n * @param router\n * @param context\n * @param opts\n */\nexport function didWebDomainEndpoint(router: Router, context: IRequiredContext, opts?: IGlobalDidWebEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`DID Web domain resolution endpoint is disabled`)\n return\n }\n router.get(opts?.path ?? ':path(*)/did.json', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const path = request.params.path\n if (!path || path.length === 0) {\n return sendErrorResponse(response, 404, 'Not found')\n }\n let did: string\n did = `did:web:${opts?.hostname?.replace('https://', '')?.replace('http://', '') ?? request.hostname}`\n if (path !== '/.well-known') {\n if (opts?.disableSubPaths) {\n return sendErrorResponse(response, 404, 'Not found')\n }\n const suffix = path.replace(/\\//g, ':').replace(/%2F/g, ':')\n if (!suffix.startsWith(':')) {\n did += ':'\n }\n did += suffix\n } else if (opts?.disableWellKnown) {\n return sendErrorResponse(response, 404, 'Not found')\n }\n\n const resolutionResult = await agentDidToResolutionResult(context, did)\n if (!resolutionResult || !resolutionResult.didDocument || resolutionResult?.didResolutionMetadata?.error === 'notFound') {\n return sendErrorResponse(response, 404, 'Not found')\n }\n\n const serviceEntries: Array<LinkedVPServiceEntry> = await context.agent.lvpGetServiceEntries({ subjectDid: did })\n if (resolutionResult?.didDocument && serviceEntries) {\n // Preserve existing services that are not LinkedVerifiablePresentation type\n const existingServices = resolutionResult.didDocument.service || []\n const nonLVPServices = existingServices.filter((service) => service.type !== 'LinkedVerifiablePresentation')\n\n // Combine non-LVP services with the new LVP service entries\n resolutionResult.didDocument.service = [...nonLVPServices, ...serviceEntries] as Array<Service>\n }\n\n response.statusCode = 200\n return response.send(resolutionResult.didDocument)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n","import { agentContext } from '@sphereon/ssi-sdk.core'\nimport { copyGlobalAuthToEndpoints, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { TAgent } from '@veramo/core'\n\nimport express, { Express, Router } from 'express'\nimport { createDidEndpoint, deleteDidEndpoint, deactivateDidEndpoint, getDidMethodsEndpoint, resolveDidEndpoint } from './api-functions'\nimport { IDidAPIOpts, IRequiredPlugins } from './types'\n\nexport class UniResolverApiServer {\n get router(): express.Router {\n return this._router\n }\n\n private readonly _express: Express\n private readonly _agent: TAgent<IRequiredPlugins>\n private readonly _opts?: IDidAPIOpts\n private readonly _router: Router\n\n constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: IDidAPIOpts }) {\n const { agent, opts } = args\n this._agent = agent\n copyGlobalAuthToEndpoints({ opts, keys: ['getDidMethods', 'createDid', 'resolveDid', 'deactivateDid'] })\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n const context = agentContext(agent)\n const features = opts?.enableFeatures ?? ['did-resolve', 'did-persist']\n console.log(`DID Uni Resolver and Registrar API enabled, with features: ${JSON.stringify(features)}}`)\n\n // DID endpoints\n if (features.includes('did-resolve')) {\n resolveDidEndpoint(this.router, context, opts?.endpointOpts?.resolveDid)\n getDidMethodsEndpoint(this.router, context, opts?.endpointOpts?.getDidMethods)\n }\n if (features.includes('did-persist')) {\n createDidEndpoint(this.router, context, opts?.endpointOpts?.createDid)\n deleteDidEndpoint(this.router, context, opts?.endpointOpts?.deactivateDid) // not in spec.\n deactivateDidEndpoint(this.router, context, opts?.endpointOpts?.deactivateDid)\n }\n this._express.use(opts?.endpointOpts?.basePath ?? '', this.router)\n }\n\n get agent(): TAgent<IRequiredPlugins> {\n return this._agent\n }\n\n get opts(): IDidAPIOpts | undefined {\n return this._opts\n }\n\n get express(): Express {\n return this._express\n }\n}\n","import { agentContext } from '@sphereon/ssi-sdk.core'\nimport { ExpressSupport } from '@sphereon/ssi-express-support'\nimport { TAgent } from '@veramo/core'\n\nimport express, { Express, Router } from 'express'\nimport { didWebDomainEndpoint } from './api-functions'\nimport { IDidWebServiceOpts, IRequiredPlugins } from './types'\n\nexport class DidWebServer {\n get router(): express.Router | undefined {\n return this._router\n }\n\n private readonly _express: Express | undefined\n private readonly _agent: TAgent<IRequiredPlugins> | undefined\n private readonly _opts?: IDidWebServiceOpts\n private readonly _router: Router | undefined\n\n constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: IDidWebServiceOpts }) {\n const { agent, opts } = args\n const features = opts?.enableFeatures ?? []\n if (!features.includes('did-web-global-resolution')) {\n console.log('did:web hosting service NOT enabled')\n return\n }\n\n this._agent = agent\n if (opts?.globalAuth) {\n copyGlobalAuthToEndpoint(opts, 'endpointOpts')\n }\n\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n\n const context = agentContext(agent)\n\n console.log(`did:web hosting service enabled`)\n\n didWebDomainEndpoint(this.router!, context, opts?.endpointOpts)\n this._express.use(this.router!)\n }\n\n get agent(): TAgent<IRequiredPlugins> | undefined {\n return this._agent\n }\n\n get opts(): IDidWebServiceOpts | undefined {\n return this._opts\n }\n\n get express(): Express | undefined {\n return this._express\n }\n}\n\nfunction copyGlobalAuthToEndpoint(opts: IDidWebServiceOpts, key: string) {\n if (opts?.globalAuth) {\n // @ts-ignore\n opts[key] = {\n ...opts?.globalAuth,\n // @ts-ignore\n ...opts[key],\n }\n }\n}\n"],"mappings":"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","names":["getAgentDIDMethods","toDidDocument","toDidResolutionResult","JwkKeyUse","checkAuth","sendErrorResponse","parseDid","v4","Debug","debug","Debug","createDidEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","request","response","createRequest","body","sendErrorResponse","did","didMethod","query","method","parseDid","defaultMethod","allDidMethods","getAgentDIDMethods","includes","provider","jobId","v4","alias","undefined","id","identifier","state","noErrorOnExistingDid","agent","didManagerGet","e","options","storeSecrets","didManagerCreate","kms","didDocument","toDidDocument","use","JwkKeyUse","Signature","Encryption","createState","didState","statusCode","send","message","getDidMethodsEndpoint","get","methods","agentDidToResolutionResult","JSON","stringify","toDidResolutionResult","supportedMethods","error","didResolutionMetadata","didDocumentMetadata","resolveDidEndpoint","params","mode","toString","toLowerCase","resolutionResult","resolveDid","didUrl","deleteDidEndpoint","delete","result","didManagerDelete","deactivateDidEndpoint","deactivateRequest","status","json","errorDetails","didWebDomainEndpoint","length","hostname","replace","disableSubPaths","suffix","startsWith","disableWellKnown","serviceEntries","lvpGetServiceEntries","subjectDid","existingServices","service","nonLVPServices","filter","type","agentContext","copyGlobalAuthToEndpoints","express","UniResolverApiServer","router","_router","_express","_agent","_opts","args","agent","opts","copyGlobalAuthToEndpoints","keys","expressSupport","express","Router","context","agentContext","features","enableFeatures","console","log","JSON","stringify","includes","resolveDidEndpoint","endpointOpts","resolveDid","getDidMethodsEndpoint","getDidMethods","createDidEndpoint","createDid","deleteDidEndpoint","deactivateDid","deactivateDidEndpoint","use","basePath","agentContext","express","DidWebServer","router","_router","_express","_agent","_opts","args","agent","opts","features","enableFeatures","includes","console","log","globalAuth","copyGlobalAuthToEndpoint","expressSupport","express","Router","context","agentContext","didWebDomainEndpoint","endpointOpts","use","key"]}
1
+ {"version":3,"sources":["../src/api-functions.ts","../src/uni-resolver-api-server.ts","../src/did-web-server.ts"],"sourcesContent":["import { DIDResolutionResult } from '@sphereon/did-uni-client'\nimport { getAgentDIDMethods, toDidDocument, toDidResolutionResult } from '@sphereon/ssi-sdk-ext.did-utils'\nimport { JwkKeyUse } from '@sphereon/ssi-sdk-ext.key-utils'\nimport { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { LinkedVPServiceEntry } from '@sphereon/ssi-sdk.linked-vp'\nimport { parseDid } from '@sphereon/ssi-types'\nimport { IIdentifier } from '@veramo/core'\nimport { Service } from 'did-resolver'\nimport { Request, Response, Router } from 'express'\nimport { v4 } from 'uuid'\nimport {\n CreateState,\n DidRegistrationCreateRequest,\n DidRegistrationDeactivateRequest,\n DidStateValue,\n ICreateDidEndpointOpts,\n IGlobalDidWebEndpointOpts,\n IRequiredContext,\n IResolveEndpointOpts,\n} from './types'\nimport Debug from 'debug'\n\nconst debug = Debug('sphereon:ssi-sdk:uni-resolver-registrar')\n\nexport function createDidEndpoint(router: Router, context: IRequiredContext, opts?: ICreateDidEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`create DID endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/identifiers'\n\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const createRequest: DidRegistrationCreateRequest = request.body\n if (!createRequest) {\n return sendErrorResponse(response, 400, 'No DID create request present')\n }\n const did = createRequest.did\n const didMethod = (request.query.method as string) ?? (did ? parseDid(did).method : opts?.defaultMethod)\n const allDidMethods = await getAgentDIDMethods(context)\n if (!didMethod) {\n return sendErrorResponse(response, 400, 'No DID method supplied or deductible')\n } else if (did && parseDid(did).method != didMethod) {\n return sendErrorResponse(response, 400, 'DID method did not match method param')\n } else if (!allDidMethods.includes(didMethod)) {\n return sendErrorResponse(response, 400, 'DID method not supported')\n }\n const provider = `did:${didMethod}`\n const jobId = createRequest.jobId ?? v4()\n let alias: string | undefined = undefined\n if (didMethod === 'web') {\n if (!did) {\n return sendErrorResponse(response, 400, 'Please provide a value for \"did\" in the request body when creating a DID web')\n }\n alias = parseDid(did).id\n if (!alias) {\n return sendErrorResponse(response, 400, 'Could not determine alias from did:web DID value: ' + did)\n }\n }\n\n let identifier: IIdentifier | undefined\n let state: DidStateValue | undefined\n if (opts?.noErrorOnExistingDid && did) {\n try {\n identifier = await context.agent.didManagerGet({ did })\n state = 'exists'\n } catch (e) {\n // Okay, since we will create a new one\n }\n }\n if (identifier === undefined) {\n if (createRequest.options.storeSecrets === false) {\n return sendErrorResponse(response, 400, 'Only storeSecrets mode is supported currently')\n /*const memoryKMS = new SphereonKeyManager({\n store: new MemoryKeyStore(),\n kms: {'mem': new KeyManagementSystem(new MemoryPrivateKeyStore())}\n })\n identifier = await memoryKMS..didManagerCreate({provider, alias, kms: opts?.kms})*/\n } else if (createRequest.options.storeSecrets || opts?.storeSecrets) {\n identifier = await context.agent.didManagerCreate({ provider, alias, kms: opts?.kms })\n state = 'finished'\n } else {\n return sendErrorResponse(response, 400, 'Only storeSecrets mode is supported currently')\n }\n }\n if (!identifier || !state) {\n return sendErrorResponse(response, 400, 'An identifier and did state should be present at this point')\n }\n\n const didDocument = toDidDocument(identifier, { did, use: [JwkKeyUse.Signature, JwkKeyUse.Encryption] })\n const createState: CreateState = {\n jobId,\n didState: {\n did: identifier.did,\n state,\n didDocument,\n },\n }\n response.statusCode = 200\n return response.send(createState)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function getDidMethodsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Get DID methods endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/methods'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const methods = await getAgentDIDMethods(context) // these are already without the 'did:' prefix\n response.statusCode = 200\n return response.send(methods)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nasync function agentDidToResolutionResult(context: IRequiredContext, did: string) {\n try {\n const identifier = await context.agent.didManagerGet({ did })\n debug(JSON.stringify(identifier, null, 2))\n return toDidResolutionResult(identifier, {\n did,\n supportedMethods: await getAgentDIDMethods(context),\n })\n } catch (error) {\n console.log(JSON.stringify(error.message))\n return {\n didDocument: null,\n didResolutionMetadata: {\n error: 'notFound',\n },\n didDocumentMetadata: {},\n }\n }\n}\n\nexport function resolveDidEndpoint(router: Router, context: IRequiredContext, opts?: IResolveEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Resolve DID endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/identifiers/:identifier'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const did = request.params.identifier\n if (!did) {\n return sendErrorResponse(response, 400, 'no identifier provided')\n }\n const mode = request.query.mode?.toString().toLowerCase() ?? opts?.mode?.toLowerCase() ?? 'hybrid'\n let resolutionResult: DIDResolutionResult | undefined\n if (mode === 'local' || mode === 'hybrid') {\n resolutionResult = await agentDidToResolutionResult(context, did)\n }\n if (mode !== 'local' && !resolutionResult?.didDocument) {\n resolutionResult = await context.agent.resolveDid({ didUrl: did })\n }\n\n response.statusCode = 200\n return response.send(resolutionResult)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\n/**\n * @param router\n * @param context\n * @param opts\n */\nexport function deleteDidEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`Deactivate DID endpoint is disabled`)\n return\n }\n router.delete(opts?.path ?? '/identifiers/:identifier', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const did = request.params.identifier\n if (!did) {\n return sendErrorResponse(response, 400, 'no DID provided')\n }\n\n const result = await context.agent.didManagerDelete({ did })\n if (!result) {\n return sendErrorResponse(response, 404, `id ${did} not found`)\n }\n response.statusCode = 200\n return response.send()\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n\nexport function deactivateDidEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log('Deactivate DID endpoint is disabled')\n return\n }\n\n router.post(opts?.path ?? '/deactivate', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const deactivateRequest: DidRegistrationDeactivateRequest = request.body\n if (!deactivateRequest) {\n return sendErrorResponse(response, 400, 'Invalid request body', { state: 'failed' })\n }\n\n const { did, jobId = v4() } = deactivateRequest\n if (!did) {\n return sendErrorResponse(response, 400, 'No DID provided', { state: 'failed' })\n }\n\n const result = await context.agent.didManagerDelete({ did })\n if (!result) {\n return sendErrorResponse(response, 404, `DID ${did} not found`, { state: 'failed' })\n }\n\n response.status(200).json({\n state: 'finished',\n did,\n jobId,\n })\n return response.send()\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, { state: 'failed', errorDetails: e })\n }\n })\n}\n\n/**\n * Endpoint that eases DID web resolution, by mapping did-web paths to stored agent DIDs.\n *\n * Typically, you will have a reverse proxy or load balancer in front of this endpoint.\n *\n * Some examples of how did:web behaves:\n * did:web:example.com resolves to https://example.com/.well-known/did.json\n * did:web:example.com:sub:paths resolves to https://example.com/sub/paths/did.json\n *\n * This endpoint translate both forms by looking at the paths that end in /did.json.\n *\n * @param router\n * @param context\n * @param opts\n */\nexport function didWebDomainEndpoint(router: Router, context: IRequiredContext, opts?: IGlobalDidWebEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`DID Web domain resolution endpoint is disabled`)\n return\n }\n router.get(opts?.path ?? ':path(*)/did.json', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const path = request.params.path\n if (!path || path.length === 0) {\n return sendErrorResponse(response, 404, 'Not found')\n }\n let did: string\n did = `did:web:${opts?.hostname?.replace('https://', '')?.replace('http://', '') ?? request.hostname}`\n if (path !== '/.well-known') {\n if (opts?.disableSubPaths) {\n return sendErrorResponse(response, 404, 'Not found')\n }\n const suffix = path.replace(/\\//g, ':').replace(/%2F/g, ':')\n if (!suffix.startsWith(':')) {\n did += ':'\n }\n did += suffix\n } else if (opts?.disableWellKnown) {\n return sendErrorResponse(response, 404, 'Not found')\n }\n\n const resolutionResult = await agentDidToResolutionResult(context, did)\n if (!resolutionResult || !resolutionResult.didDocument || resolutionResult?.didResolutionMetadata?.error === 'notFound') {\n return sendErrorResponse(response, 404, 'Not found')\n }\n\n const serviceEntries: Array<LinkedVPServiceEntry> = await context.agent.lvpGetServiceEntries({ subjectDid: did })\n if (resolutionResult?.didDocument && serviceEntries) {\n // Preserve existing services that are not LinkedVerifiablePresentation type\n const existingServices = resolutionResult.didDocument.service || []\n const nonLVPServices = existingServices.filter((service) => service.type !== 'LinkedVerifiablePresentation')\n\n // Combine non-LVP services with the new LVP service entries\n resolutionResult.didDocument.service = [...nonLVPServices, ...serviceEntries] as Array<Service>\n }\n\n // Enrich services with metadata from the database (for eInvoicing services)\n // Also remove null/undefined values from service objects\n const cleanService = (svc: Service): Service => {\n return Object.fromEntries(\n Object.entries(svc).filter(([_, v]) => v !== null && v !== undefined)\n ) as Service\n }\n\n if (resolutionResult?.didDocument?.service && typeof context.agent.getServiceMetadata === 'function') {\n const enrichedServices = await Promise.all(\n resolutionResult.didDocument.service.map(async (service: Service) => {\n try {\n const metadata = await context.agent.getServiceMetadata({\n serviceId: service.id as string,\n did,\n })\n if (metadata?.einvoice) {\n return cleanService({ ...service, einvoice: metadata.einvoice })\n }\n } catch (e) {\n // Service metadata not available, continue with basic service\n debug(`No metadata found for service ${service.id}`)\n }\n return cleanService(service)\n })\n )\n resolutionResult.didDocument.service = enrichedServices as Array<Service>\n } else if (resolutionResult?.didDocument?.service) {\n // Clean services even without metadata enrichment\n resolutionResult.didDocument.service = resolutionResult.didDocument.service.map(cleanService) as Array<Service>\n }\n\n response.statusCode = 200\n return response.send(resolutionResult.didDocument)\n } catch (e) {\n return sendErrorResponse(response, 500, e.message as string, e)\n }\n })\n}\n","import { agentContext } from '@sphereon/ssi-sdk.core'\nimport { copyGlobalAuthToEndpoints, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { TAgent } from '@veramo/core'\n\nimport express, { Express, Router } from 'express'\nimport { createDidEndpoint, deleteDidEndpoint, deactivateDidEndpoint, getDidMethodsEndpoint, resolveDidEndpoint } from './api-functions'\nimport { IDidAPIOpts, IRequiredPlugins } from './types'\n\nexport class UniResolverApiServer {\n get router(): express.Router {\n return this._router\n }\n\n private readonly _express: Express\n private readonly _agent: TAgent<IRequiredPlugins>\n private readonly _opts?: IDidAPIOpts\n private readonly _router: Router\n\n constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: IDidAPIOpts }) {\n const { agent, opts } = args\n this._agent = agent\n copyGlobalAuthToEndpoints({ opts, keys: ['getDidMethods', 'createDid', 'resolveDid', 'deactivateDid'] })\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n const context = agentContext(agent)\n const features = opts?.enableFeatures ?? ['did-resolve', 'did-persist']\n console.log(`DID Uni Resolver and Registrar API enabled, with features: ${JSON.stringify(features)}}`)\n\n // DID endpoints\n if (features.includes('did-resolve')) {\n resolveDidEndpoint(this.router, context, opts?.endpointOpts?.resolveDid)\n getDidMethodsEndpoint(this.router, context, opts?.endpointOpts?.getDidMethods)\n }\n if (features.includes('did-persist')) {\n createDidEndpoint(this.router, context, opts?.endpointOpts?.createDid)\n deleteDidEndpoint(this.router, context, opts?.endpointOpts?.deactivateDid) // not in spec.\n deactivateDidEndpoint(this.router, context, opts?.endpointOpts?.deactivateDid)\n }\n this._express.use(opts?.endpointOpts?.basePath ?? '', this.router)\n }\n\n get agent(): TAgent<IRequiredPlugins> {\n return this._agent\n }\n\n get opts(): IDidAPIOpts | undefined {\n return this._opts\n }\n\n get express(): Express {\n return this._express\n }\n}\n","import { agentContext } from '@sphereon/ssi-sdk.core'\nimport { ExpressSupport } from '@sphereon/ssi-express-support'\nimport { TAgent } from '@veramo/core'\n\nimport express, { Express, Router } from 'express'\nimport { didWebDomainEndpoint } from './api-functions'\nimport { IDidWebServiceOpts, IRequiredPlugins } from './types'\n\nexport class DidWebServer {\n get router(): express.Router | undefined {\n return this._router\n }\n\n private readonly _express: Express | undefined\n private readonly _agent: TAgent<IRequiredPlugins> | undefined\n private readonly _opts?: IDidWebServiceOpts\n private readonly _router: Router | undefined\n\n constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: IDidWebServiceOpts }) {\n const { agent, opts } = args\n const features = opts?.enableFeatures ?? []\n if (!features.includes('did-web-global-resolution')) {\n console.log('did:web hosting service NOT enabled')\n return\n }\n\n this._agent = agent\n if (opts?.globalAuth) {\n copyGlobalAuthToEndpoint(opts, 'endpointOpts')\n }\n\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n\n const context = agentContext(agent)\n\n console.log(`did:web hosting service enabled`)\n\n didWebDomainEndpoint(this.router!, context, opts?.endpointOpts)\n this._express.use(this.router!)\n }\n\n get agent(): TAgent<IRequiredPlugins> | undefined {\n return this._agent\n }\n\n get opts(): IDidWebServiceOpts | undefined {\n return this._opts\n }\n\n get express(): Express | undefined {\n return this._express\n }\n}\n\nfunction copyGlobalAuthToEndpoint(opts: IDidWebServiceOpts, key: string) {\n if (opts?.globalAuth) {\n // @ts-ignore\n opts[key] = {\n ...opts?.globalAuth,\n // @ts-ignore\n ...opts[key],\n }\n }\n}\n"],"mappings":"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","names":["getAgentDIDMethods","toDidDocument","toDidResolutionResult","JwkKeyUse","checkAuth","sendErrorResponse","parseDid","v4","Debug","debug","Debug","createDidEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","request","response","createRequest","body","sendErrorResponse","did","didMethod","query","method","parseDid","defaultMethod","allDidMethods","getAgentDIDMethods","includes","provider","jobId","v4","alias","undefined","id","identifier","state","noErrorOnExistingDid","agent","didManagerGet","e","options","storeSecrets","didManagerCreate","kms","didDocument","toDidDocument","use","JwkKeyUse","Signature","Encryption","createState","didState","statusCode","send","message","getDidMethodsEndpoint","get","methods","agentDidToResolutionResult","JSON","stringify","toDidResolutionResult","supportedMethods","error","didResolutionMetadata","didDocumentMetadata","resolveDidEndpoint","params","mode","toString","toLowerCase","resolutionResult","resolveDid","didUrl","deleteDidEndpoint","delete","result","didManagerDelete","deactivateDidEndpoint","deactivateRequest","status","json","errorDetails","didWebDomainEndpoint","length","hostname","replace","disableSubPaths","suffix","startsWith","disableWellKnown","serviceEntries","lvpGetServiceEntries","subjectDid","existingServices","service","nonLVPServices","filter","type","cleanService","svc","Object","fromEntries","entries","_","v","getServiceMetadata","enrichedServices","Promise","all","map","metadata","serviceId","einvoice","agentContext","copyGlobalAuthToEndpoints","express","UniResolverApiServer","router","_router","_express","_agent","_opts","args","agent","opts","copyGlobalAuthToEndpoints","keys","expressSupport","express","Router","context","agentContext","features","enableFeatures","console","log","JSON","stringify","includes","resolveDidEndpoint","endpointOpts","resolveDid","getDidMethodsEndpoint","getDidMethods","createDidEndpoint","createDid","deleteDidEndpoint","deactivateDid","deactivateDidEndpoint","use","basePath","agentContext","express","DidWebServer","router","_router","_express","_agent","_opts","args","agent","opts","features","enableFeatures","includes","console","log","globalAuth","copyGlobalAuthToEndpoint","expressSupport","express","Router","context","agentContext","didWebDomainEndpoint","endpointOpts","use","key"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sphereon/ssi-sdk.uni-resolver-registrar-api",
3
- "version": "0.36.1-feature.vdx24.einvoice.endpoints.122+88b3421b",
3
+ "version": "0.36.1-feature.vdx24.einvoice.inbox.127+3fa475f6",
4
4
  "source": "src/index.ts",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -23,13 +23,13 @@
23
23
  "start:dev": "ts-node __tests__/agent.ts"
24
24
  },
25
25
  "dependencies": {
26
- "@sphereon/ssi-express-support": "0.36.1-feature.vdx24.einvoice.endpoints.122+88b3421b",
27
- "@sphereon/ssi-sdk-ext.did-utils": "0.36.1-feature.vdx24.einvoice.endpoints.122+88b3421b",
28
- "@sphereon/ssi-sdk-ext.key-manager": "0.36.1-feature.vdx24.einvoice.endpoints.122+88b3421b",
29
- "@sphereon/ssi-sdk-ext.key-utils": "0.36.1-feature.vdx24.einvoice.endpoints.122+88b3421b",
30
- "@sphereon/ssi-sdk.core": "0.36.1-feature.vdx24.einvoice.endpoints.122+88b3421b",
31
- "@sphereon/ssi-sdk.linked-vp": "0.36.1-feature.vdx24.einvoice.endpoints.122+88b3421b",
32
- "@sphereon/ssi-types": "0.36.1-feature.vdx24.einvoice.endpoints.122+88b3421b",
26
+ "@sphereon/ssi-express-support": "0.36.1-feature.vdx24.einvoice.inbox.127+3fa475f6",
27
+ "@sphereon/ssi-sdk-ext.did-utils": "0.36.1-feature.vdx24.einvoice.inbox.127+3fa475f6",
28
+ "@sphereon/ssi-sdk-ext.key-manager": "0.36.1-feature.vdx24.einvoice.inbox.127+3fa475f6",
29
+ "@sphereon/ssi-sdk-ext.key-utils": "0.36.1-feature.vdx24.einvoice.inbox.127+3fa475f6",
30
+ "@sphereon/ssi-sdk.core": "0.36.1-feature.vdx24.einvoice.inbox.127+3fa475f6",
31
+ "@sphereon/ssi-sdk.linked-vp": "0.36.1-feature.vdx24.einvoice.inbox.127+3fa475f6",
32
+ "@sphereon/ssi-types": "0.36.1-feature.vdx24.einvoice.inbox.127+3fa475f6",
33
33
  "@veramo/core": "4.2.0",
34
34
  "body-parser": "^1.20.2",
35
35
  "casbin": "^5.30.0",
@@ -44,11 +44,11 @@
44
44
  },
45
45
  "devDependencies": {
46
46
  "@sphereon/did-uni-client": "^0.6.3",
47
- "@sphereon/ssi-sdk-ext.did-provider-jwk": "0.36.1-feature.vdx24.einvoice.endpoints.122+88b3421b",
48
- "@sphereon/ssi-sdk-ext.did-resolver-jwk": "0.36.1-feature.vdx24.einvoice.endpoints.122+88b3421b",
49
- "@sphereon/ssi-sdk.credential-vcdm-jsonld-provider": "0.36.1-feature.vdx24.einvoice.endpoints.122+88b3421b",
50
- "@sphereon/ssi-sdk.data-store": "0.36.1-feature.vdx24.einvoice.endpoints.122+88b3421b",
51
- "@sphereon/ssi-sdk.data-store-types": "0.36.1-feature.vdx24.einvoice.endpoints.122+88b3421b",
47
+ "@sphereon/ssi-sdk-ext.did-provider-jwk": "0.36.1-feature.vdx24.einvoice.inbox.127+3fa475f6",
48
+ "@sphereon/ssi-sdk-ext.did-resolver-jwk": "0.36.1-feature.vdx24.einvoice.inbox.127+3fa475f6",
49
+ "@sphereon/ssi-sdk.credential-vcdm-jsonld-provider": "0.36.1-feature.vdx24.einvoice.inbox.127+3fa475f6",
50
+ "@sphereon/ssi-sdk.data-store": "0.36.1-feature.vdx24.einvoice.inbox.127+3fa475f6",
51
+ "@sphereon/ssi-sdk.data-store-types": "0.36.1-feature.vdx24.einvoice.inbox.127+3fa475f6",
52
52
  "@types/body-parser": "^1.19.5",
53
53
  "@types/cookie-parser": "^1.4.7",
54
54
  "@types/cors": "^2.8.17",
@@ -103,5 +103,5 @@
103
103
  "Inversal Registrar",
104
104
  "DIF"
105
105
  ],
106
- "gitHead": "88b3421b6e5bc5f630bf5f877c8db095c5850444"
106
+ "gitHead": "3fa475f6938149c7104b7ca746e6883aa44c3d24"
107
107
  }
@@ -290,6 +290,38 @@ export function didWebDomainEndpoint(router: Router, context: IRequiredContext,
290
290
  resolutionResult.didDocument.service = [...nonLVPServices, ...serviceEntries] as Array<Service>
291
291
  }
292
292
 
293
+ // Enrich services with metadata from the database (for eInvoicing services)
294
+ // Also remove null/undefined values from service objects
295
+ const cleanService = (svc: Service): Service => {
296
+ return Object.fromEntries(
297
+ Object.entries(svc).filter(([_, v]) => v !== null && v !== undefined)
298
+ ) as Service
299
+ }
300
+
301
+ if (resolutionResult?.didDocument?.service && typeof context.agent.getServiceMetadata === 'function') {
302
+ const enrichedServices = await Promise.all(
303
+ resolutionResult.didDocument.service.map(async (service: Service) => {
304
+ try {
305
+ const metadata = await context.agent.getServiceMetadata({
306
+ serviceId: service.id as string,
307
+ did,
308
+ })
309
+ if (metadata?.einvoice) {
310
+ return cleanService({ ...service, einvoice: metadata.einvoice })
311
+ }
312
+ } catch (e) {
313
+ // Service metadata not available, continue with basic service
314
+ debug(`No metadata found for service ${service.id}`)
315
+ }
316
+ return cleanService(service)
317
+ })
318
+ )
319
+ resolutionResult.didDocument.service = enrichedServices as Array<Service>
320
+ } else if (resolutionResult?.didDocument?.service) {
321
+ // Clean services even without metadata enrichment
322
+ resolutionResult.didDocument.service = resolutionResult.didDocument.service.map(cleanService) as Array<Service>
323
+ }
324
+
293
325
  response.statusCode = 200
294
326
  return response.send(resolutionResult.didDocument)
295
327
  } catch (e) {