@sphereon/ssi-sdk.oid4vci-issuer 0.32.1-next.54 → 0.33.1-feature.vcdm2.4
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/IssuerInstance.d.ts +4 -5
- package/dist/IssuerInstance.d.ts.map +1 -1
- package/dist/IssuerInstance.js +21 -28
- package/dist/IssuerInstance.js.map +1 -1
- package/dist/agent/OID4VCIIssuer.d.ts +3 -2
- package/dist/agent/OID4VCIIssuer.d.ts.map +1 -1
- package/dist/agent/OID4VCIIssuer.js +155 -168
- package/dist/agent/OID4VCIIssuer.js.map +1 -1
- package/dist/functions.d.ts +4 -5
- package/dist/functions.d.ts.map +1 -1
- package/dist/functions.js +243 -235
- package/dist/functions.js.map +1 -1
- package/dist/index.js +5 -23
- package/dist/index.js.map +1 -1
- package/dist/state-manager/TypeOrmStateManager.d.ts +1 -0
- package/dist/state-manager/TypeOrmStateManager.d.ts.map +1 -0
- package/dist/state-manager/TypeOrmStateManager.js +2 -0
- package/dist/state-manager/TypeOrmStateManager.js.map +1 -0
- package/dist/state-manager/oid4vcState/IAbstractMachineStateStore.d.ts +39 -0
- package/dist/state-manager/oid4vcState/IAbstractMachineStateStore.d.ts.map +1 -0
- package/dist/state-manager/oid4vcState/IAbstractMachineStateStore.js +2 -0
- package/dist/state-manager/oid4vcState/IAbstractMachineStateStore.js.map +1 -0
- package/dist/state-manager/oid4vcState/MachineStateStore.d.ts +1 -0
- package/dist/state-manager/oid4vcState/MachineStateStore.d.ts.map +1 -0
- package/dist/state-manager/oid4vcState/MachineStateStore.js +137 -0
- package/dist/state-manager/oid4vcState/MachineStateStore.js.map +1 -0
- package/dist/types/IOID4VCIIssuer.d.ts +10 -2
- package/dist/types/IOID4VCIIssuer.d.ts.map +1 -1
- package/dist/types/IOID4VCIIssuer.js +1 -2
- package/package.json +19 -16
- package/src/IssuerInstance.ts +8 -7
- package/src/agent/OID4VCIIssuer.ts +49 -13
- package/src/functions.ts +79 -29
- package/src/state-manager/TypeOrmStateManager.ts +0 -0
- package/src/state-manager/oid4vcState/IAbstractMachineStateStore.ts +51 -0
- package/src/state-manager/oid4vcState/MachineStateStore.ts +135 -0
- package/src/types/IOID4VCIIssuer.ts +16 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,CAAA;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,wBAAwB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=TypeOrmStateManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TypeOrmStateManager.d.ts","sourceRoot":"","sources":["../../src/state-manager/TypeOrmStateManager.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TypeOrmStateManager.js","sourceRoot":"","sources":["../../src/state-manager/TypeOrmStateManager.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { StateType } from '@sphereon/oid4vci-common';
|
|
2
|
+
import { Oid4vcStateEntity } from '@sphereon/ssi-sdk.data-store';
|
|
3
|
+
export interface IOid4vcStateStore<StateType> {
|
|
4
|
+
persistOid4vcState(args: Oid4vcStateStoreParams<StateType>): Promise<Oid4vcStatePersisted<StateType>>;
|
|
5
|
+
findOid4vcStates(args: StoreOid4vcFindActiveArgs): Promise<Array<Oid4vcStatePersisted<StateType>>>;
|
|
6
|
+
getOid4vcState(args: StoreOid4vcGetArgs): Promise<Oid4vcStatePersisted<StateType>>;
|
|
7
|
+
deleteOid4vcState(args: StoreOid4vcDeleteArgs): Promise<boolean>;
|
|
8
|
+
deleteExpiredOid4vcStates(args: StoreOid4vcDeleteExpiredArgs): Promise<number>;
|
|
9
|
+
}
|
|
10
|
+
export type StoreMachineStatePersistArgs<StateType> = Omit<Oid4vcStateStoreParams<StateType>, 'createdAt' | 'updatedAt'>;
|
|
11
|
+
export type StoreOid4vcFindActiveArgs = Partial<Pick<Oid4vcStateStoreParams<StateType>, 'expiresAt' | 'tenantId' | 'stateId'>>;
|
|
12
|
+
export type FindMachineStatesFilterArgs = Array<Partial<Omit<Oid4vcStateStoreParams<StateType>, 'state'>>>;
|
|
13
|
+
export type StoreFindMachineStatesArgs = {
|
|
14
|
+
filter: FindMachineStatesFilterArgs;
|
|
15
|
+
};
|
|
16
|
+
export type StoreOid4vcGetArgs = Pick<Oid4vcStateEntity<StateType>, 'id' | 'stateId' | 'correlationId' | 'lookups' | 'tenantId'>;
|
|
17
|
+
export type Oid4vcStateStore<StateType> = Pick<Oid4vcStateEntity<StateType>, 'id' | 'stateId' | 'correlationId' | 'lookups'>;
|
|
18
|
+
export type StoreOid4vcDeleteArgs = StoreOid4vcGetArgs;
|
|
19
|
+
export type StoreOid4vcDeleteExpiredArgs = {
|
|
20
|
+
id?: string;
|
|
21
|
+
correlationId?: string;
|
|
22
|
+
sessionId?: string;
|
|
23
|
+
lookups?: Array<string>;
|
|
24
|
+
tenantId?: string;
|
|
25
|
+
};
|
|
26
|
+
export type Oid4vcStatePersisted<StateType> = {
|
|
27
|
+
id: string;
|
|
28
|
+
stateId?: string;
|
|
29
|
+
correlationId?: string;
|
|
30
|
+
type: string;
|
|
31
|
+
state: StateType;
|
|
32
|
+
lookups?: Array<string>;
|
|
33
|
+
createdAt: Date;
|
|
34
|
+
lastUpdatedAt: Date;
|
|
35
|
+
expiresAt?: Date;
|
|
36
|
+
tenantId?: string;
|
|
37
|
+
};
|
|
38
|
+
export type Oid4vcStateStoreParams<StateType> = Omit<Oid4vcStatePersisted<StateType>, 'id'>;
|
|
39
|
+
//# sourceMappingURL=IAbstractMachineStateStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IAbstractMachineStateStore.d.ts","sourceRoot":"","sources":["../../../src/state-manager/oid4vcState/IAbstractMachineStateStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAEhE,MAAM,WAAW,iBAAiB,CAAC,SAAS;IAC1C,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAA;IAErG,gBAAgB,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAElG,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAA;IAElF,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAEhE,yBAAyB,CAAC,IAAI,EAAE,4BAA4B,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CAC/E;AAED,MAAM,MAAM,4BAA4B,CAAC,SAAS,IAAI,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC,CAAA;AAExH,MAAM,MAAM,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC,CAAC,CAAA;AAE9H,MAAM,MAAM,2BAA2B,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;AAE1G,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,2BAA2B,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,IAAI,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,GAAG,UAAU,CAAC,CAAA;AAChI,MAAM,MAAM,gBAAgB,CAAC,SAAS,IAAI,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,IAAI,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,CAAC,CAAA;AAE5H,MAAM,MAAM,qBAAqB,GAAG,kBAAkB,CAAA;AACtD,MAAM,MAAM,4BAA4B,GAAG;IACzC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,oBAAoB,CAAC,SAAS,IAAI;IAC5C,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,SAAS,CAAA;IAChB,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IACvB,SAAS,EAAE,IAAI,CAAA;IACf,aAAa,EAAE,IAAI,CAAA;IACnB,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,sBAAsB,CAAC,SAAS,IAAI,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IAbstractMachineStateStore.js","sourceRoot":"","sources":["../../../src/state-manager/oid4vcState/IAbstractMachineStateStore.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=MachineStateStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MachineStateStore.d.ts","sourceRoot":"","sources":["../../../src/state-manager/oid4vcState/MachineStateStore.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// import Debug from 'debug'
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// const debug = Debug('sphereon:ssi-sdk:machine-state:store')
|
|
6
|
+
//
|
|
7
|
+
// /**
|
|
8
|
+
// * Represents a data store for managing machine states.
|
|
9
|
+
// */
|
|
10
|
+
// export class MachineStateStore extends IAbstractMachineStateStore {
|
|
11
|
+
// private readonly _dbConnection: OrPromise<DataSource>
|
|
12
|
+
//
|
|
13
|
+
// constructor(dbConnection: OrPromise<DataSource>) {
|
|
14
|
+
// super()
|
|
15
|
+
// this._dbConnection = dbConnection
|
|
16
|
+
// }
|
|
17
|
+
// async persistMachineState(state: StoreMachineStatePersistArgs): Promise<StoreMachineStateInfo> {
|
|
18
|
+
// const connection: DataSource = await this._dbConnection
|
|
19
|
+
// const { machineName, instanceId, tenantId } = state
|
|
20
|
+
// debug(`Executing persistMachineState for machine ${machineName}, instance ${instanceId}, tenantId: ${tenantId}...`)
|
|
21
|
+
// const entity = MachineStateStore.machineStateInfoEntityFrom(state)
|
|
22
|
+
// const existing = await connection.getRepository(MachineStateInfoEntity).findOne({
|
|
23
|
+
// where: {
|
|
24
|
+
// instanceId: state.instanceId,
|
|
25
|
+
// },
|
|
26
|
+
// })
|
|
27
|
+
// if (existing && existing.updatedCount > state.updatedCount) {
|
|
28
|
+
// const error = `Updating machine state with an older version is not allowed. Machine ${existing.machineName}, last count: ${
|
|
29
|
+
// existing.updatedCount
|
|
30
|
+
// }, new count: ${existing.updatedCount}, last updated: ${existing.updatedAt}, current: ${new Date()}, instance: ${existing.instanceId}`
|
|
31
|
+
// console.log(error)
|
|
32
|
+
// return Promise.reject(new Error(error))
|
|
33
|
+
// }
|
|
34
|
+
// // No need for a transaction. This is a single entity. We don't want to be surprised by an isolation level hiding the state from others
|
|
35
|
+
// const result = await connection.getRepository(MachineStateInfoEntity).save(entity, { transaction: false })
|
|
36
|
+
// debug(`Done persistMachineState machine ${machineName}, instance ${instanceId}, tenantId: ${tenantId}`)
|
|
37
|
+
// return MachineStateStore.machineInfoFrom(result)
|
|
38
|
+
// }
|
|
39
|
+
//
|
|
40
|
+
// async findActiveMachineStates(args: StoreMachineStatesFindActiveArgs): Promise<Array<StoreMachineStateInfo>> {
|
|
41
|
+
// const { tenantId, machineName, instanceId } = args
|
|
42
|
+
// const connection: DataSource = await this._dbConnection
|
|
43
|
+
// debug(`Executing findActiveMachineStates query with machineName: ${machineName}, tenantId: ${tenantId}`)
|
|
44
|
+
// const queryBuilder = connection
|
|
45
|
+
// .getRepository(MachineStateInfoEntity)
|
|
46
|
+
// .createQueryBuilder('state')
|
|
47
|
+
// .where('state.completedAt IS NULL')
|
|
48
|
+
// .andWhere(
|
|
49
|
+
// new Brackets((qb) => {
|
|
50
|
+
// qb.where('state.expiresAt IS NULL').orWhere('state.expiresAt > :now', { now: new Date() })
|
|
51
|
+
// }),
|
|
52
|
+
// )
|
|
53
|
+
//
|
|
54
|
+
// if (instanceId) {
|
|
55
|
+
// queryBuilder.andWhere('state.instanceId = :instanceId', { instanceId })
|
|
56
|
+
// }
|
|
57
|
+
// if (tenantId) {
|
|
58
|
+
// queryBuilder.andWhere('state.tenantId = :tenantId', { tenantId })
|
|
59
|
+
// }
|
|
60
|
+
// if (machineName) {
|
|
61
|
+
// queryBuilder.andWhere('state.machineName = :machineName', { machineName })
|
|
62
|
+
// }
|
|
63
|
+
//
|
|
64
|
+
// return (
|
|
65
|
+
// (await queryBuilder
|
|
66
|
+
// .orderBy('state.updatedAt', 'DESC')
|
|
67
|
+
// .getMany()
|
|
68
|
+
// .then((entities) => entities.map(MachineStateStore.machineInfoFrom))) ?? []
|
|
69
|
+
// )
|
|
70
|
+
// }
|
|
71
|
+
//
|
|
72
|
+
// async findMachineStates(args?: StoreFindMachineStatesArgs): Promise<Array<StoreMachineStateInfo>> {
|
|
73
|
+
// const connection: DataSource = await this._dbConnection
|
|
74
|
+
// debug('findMachineStates', args)
|
|
75
|
+
// const result: Array<MachineStateInfoEntity> = await connection.getRepository(MachineStateInfoEntity).find({
|
|
76
|
+
// ...(args?.filter && { where: args?.filter }),
|
|
77
|
+
// transaction: false,
|
|
78
|
+
// })
|
|
79
|
+
//
|
|
80
|
+
// return result.map((event: MachineStateInfoEntity) => MachineStateStore.machineInfoFrom(event))
|
|
81
|
+
// }
|
|
82
|
+
//
|
|
83
|
+
// async getMachineState(args: StoreMachineStateGetArgs): Promise<StoreMachineStateInfo> {
|
|
84
|
+
// const connection: DataSource = await this._dbConnection
|
|
85
|
+
// debug('getMachineState', args)
|
|
86
|
+
// return connection.getRepository(MachineStateInfoEntity).findOneOrFail({ where: { instanceId: args.instanceId } })
|
|
87
|
+
// }
|
|
88
|
+
//
|
|
89
|
+
// async deleteMachineState(args: StoreMachineStateDeleteArgs): Promise<boolean> {
|
|
90
|
+
// debug(`Executing deleteMachineState query with id: ${args.instanceId}`)
|
|
91
|
+
// if (!args.instanceId) {
|
|
92
|
+
// throw new Error('No instanceId parameter is provided.')
|
|
93
|
+
// }
|
|
94
|
+
// try {
|
|
95
|
+
// const connection: DataSource = await this._dbConnection
|
|
96
|
+
//
|
|
97
|
+
// const result = await connection.getRepository(MachineStateInfoEntity).delete(args.instanceId)
|
|
98
|
+
// return result.affected != null && result.affected > 0
|
|
99
|
+
// } catch (error) {
|
|
100
|
+
// debug(`Error deleting state: ${error}`)
|
|
101
|
+
// return false
|
|
102
|
+
// }
|
|
103
|
+
// }
|
|
104
|
+
//
|
|
105
|
+
// async deleteExpiredMachineStates(args: StoreMachineStateDeleteExpiredArgs): Promise<number> {
|
|
106
|
+
// const { machineName, tenantId, deleteDoneStates } = args
|
|
107
|
+
// debug(`Executing deleteExpiredMachineStates query with params: ${JSON.stringify(args)}`)
|
|
108
|
+
// try {
|
|
109
|
+
// const connection: DataSource = await this._dbConnection
|
|
110
|
+
//
|
|
111
|
+
// const deleteCriteria: FindOptionsWhere<MachineStateInfoEntity> = {
|
|
112
|
+
// ...(machineName && { machineName }),
|
|
113
|
+
// ...(tenantId && { tenantId }),
|
|
114
|
+
// // When deleteOnDone state is set we only look at completedAt, in other cases we compare current time with expiresAt
|
|
115
|
+
// ...(!deleteDoneStates && { expiresAt: LessThan(new Date()) }),
|
|
116
|
+
// ...(deleteDoneStates && { completedAt: Not(IsNull()) }),
|
|
117
|
+
// }
|
|
118
|
+
// const result = await connection.getRepository(MachineStateInfoEntity).delete(deleteCriteria)
|
|
119
|
+
// return result.affected ?? 0
|
|
120
|
+
// } catch (error) {
|
|
121
|
+
// debug(`Error deleting machine info: ${error}`)
|
|
122
|
+
// return Promise.reject(new Error(`Error deleting expired machine states for machine type ${machineName}`))
|
|
123
|
+
// }
|
|
124
|
+
// }
|
|
125
|
+
//
|
|
126
|
+
// protected static machineInfoFrom = (machineStateInfoEntity: MachineStateInfoEntity): StoreMachineStateInfo => {
|
|
127
|
+
// // We are making sure no entity function get copied
|
|
128
|
+
// return JSON.parse(JSON.stringify(machineStateInfoEntity))
|
|
129
|
+
// }
|
|
130
|
+
//
|
|
131
|
+
// static machineStateInfoEntityFrom = (machineStateInfo: StoreMachineStateInfo | StoreMachineStatePersistArgs): MachineStateInfoEntity => {
|
|
132
|
+
// const entity = new MachineStateInfoEntity()
|
|
133
|
+
// Object.assign(entity, machineStateInfo)
|
|
134
|
+
// return entity
|
|
135
|
+
// }
|
|
136
|
+
// }
|
|
137
|
+
//# sourceMappingURL=MachineStateStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MachineStateStore.js","sourceRoot":"","sources":["../../../src/state-manager/oid4vcState/MachineStateStore.ts"],"names":[],"mappings":";AAAA,4BAA4B;AAC5B,EAAE;AACF,EAAE;AACF,8DAA8D;AAC9D,EAAE;AACF,MAAM;AACN,0DAA0D;AAC1D,MAAM;AACN,sEAAsE;AACtE,wDAAwD;AACxD,EAAE;AACF,qDAAqD;AACrD,YAAY;AACZ,sCAAsC;AACtC,IAAI;AACJ,mGAAmG;AACnG,4DAA4D;AAC5D,wDAAwD;AACxD,wHAAwH;AACxH,uEAAuE;AACvE,sFAAsF;AACtF,eAAe;AACf,sCAAsC;AACtC,SAAS;AACT,OAAO;AACP,kEAAkE;AAClE,kIAAkI;AAClI,8BAA8B;AAC9B,6IAA6I;AAC7I,yBAAyB;AACzB,8CAA8C;AAC9C,MAAM;AACN,4IAA4I;AAC5I,+GAA+G;AAC/G,4GAA4G;AAC5G,qDAAqD;AACrD,IAAI;AACJ,EAAE;AACF,iHAAiH;AACjH,uDAAuD;AACvD,4DAA4D;AAC5D,6GAA6G;AAC7G,oCAAoC;AACpC,6CAA6C;AAC7C,mCAAmC;AACnC,0CAA0C;AAC1C,iBAAiB;AACjB,+BAA+B;AAC/B,qGAAqG;AACrG,YAAY;AACZ,QAAQ;AACR,EAAE;AACF,sBAAsB;AACtB,8EAA8E;AAC9E,MAAM;AACN,oBAAoB;AACpB,wEAAwE;AACxE,MAAM;AACN,uBAAuB;AACvB,iFAAiF;AACjF,MAAM;AACN,EAAE;AACF,aAAa;AACb,0BAA0B;AAC1B,4CAA4C;AAC5C,mBAAmB;AACnB,oFAAoF;AACpF,MAAM;AACN,IAAI;AACJ,EAAE;AACF,sGAAsG;AACtG,4DAA4D;AAC5D,qCAAqC;AACrC,gHAAgH;AAChH,oDAAoD;AACpD,0BAA0B;AAC1B,OAAO;AACP,EAAE;AACF,mGAAmG;AACnG,IAAI;AACJ,EAAE;AACF,0FAA0F;AAC1F,4DAA4D;AAC5D,mCAAmC;AACnC,sHAAsH;AACtH,IAAI;AACJ,EAAE;AACF,kFAAkF;AAClF,4EAA4E;AAC5E,4BAA4B;AAC5B,8DAA8D;AAC9D,MAAM;AACN,UAAU;AACV,8DAA8D;AAC9D,EAAE;AACF,oGAAoG;AACpG,4DAA4D;AAC5D,sBAAsB;AACtB,8CAA8C;AAC9C,mBAAmB;AACnB,MAAM;AACN,IAAI;AACJ,EAAE;AACF,gGAAgG;AAChG,6DAA6D;AAC7D,6FAA6F;AAC7F,UAAU;AACV,8DAA8D;AAC9D,EAAE;AACF,yEAAyE;AACzE,6CAA6C;AAC7C,uCAAuC;AACvC,6HAA6H;AAC7H,uEAAuE;AACvE,iEAAiE;AACjE,QAAQ;AACR,mGAAmG;AACnG,kCAAkC;AAClC,sBAAsB;AACtB,qDAAqD;AACrD,gHAAgH;AAChH,MAAM;AACN,IAAI;AACJ,EAAE;AACF,kHAAkH;AAClH,wDAAwD;AACxD,8DAA8D;AAC9D,IAAI;AACJ,EAAE;AACF,4IAA4I;AAC5I,gDAAgD;AAChD,4CAA4C;AAC5C,kBAAkB;AAClB,IAAI;AACJ,IAAI"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AccessTokenRequest, AccessTokenResponse, CredentialConfigurationSupported, CredentialDataSupplierInput, CredentialIssuerMetadataOpts, CredentialOfferSession, CredentialRequest, CredentialResponse, Grant, JsonLdIssuerCredentialDefinition } from '@sphereon/oid4vci-common';
|
|
1
|
+
import { AccessTokenRequest, AccessTokenResponse, ClientMetadata, CredentialConfigurationSupported, CredentialDataSupplierInput, CredentialIssuerMetadataOpts, CredentialOfferMode, CredentialOfferSession, CredentialRequest, CredentialResponse, Grant, JsonLdIssuerCredentialDefinition, QRCodeOpts, StatusListOpts } from '@sphereon/oid4vci-common';
|
|
2
2
|
import { CredentialDataSupplier } from '@sphereon/oid4vci-issuer';
|
|
3
3
|
import { IDIDOptions, ResolveOpts } from '@sphereon/ssi-sdk-ext.did-utils';
|
|
4
4
|
import { IIdentifierResolution, ManagedIdentifierOptsOrResult } from '@sphereon/ssi-sdk-ext.identifier-resolution';
|
|
@@ -6,7 +6,7 @@ import { IOID4VCIStore } from '@sphereon/ssi-sdk.oid4vci-issuer-store';
|
|
|
6
6
|
import { ICredential } from '@sphereon/ssi-types/dist';
|
|
7
7
|
import { IAgentContext, ICredentialIssuer, IDIDManager, IKeyManager, IPluginMethodMap, IResolver } from '@veramo/core';
|
|
8
8
|
import { IssuerInstance } from '../IssuerInstance';
|
|
9
|
-
import { IJwtService } from '@sphereon/ssi-sdk-ext.
|
|
9
|
+
import { IJwtService } from '@sphereon/ssi-sdk-ext.jwt-service';
|
|
10
10
|
export type IssuerCredentialDefinition = JsonLdIssuerCredentialDefinition;
|
|
11
11
|
export interface IOID4VCIIssuer extends IPluginMethodMap {
|
|
12
12
|
oid4vciCreateOfferURI(createArgs: ICreateOfferArgs, context: IRequiredContext): Promise<ICreateCredentialOfferURIResult>;
|
|
@@ -26,6 +26,13 @@ export interface ICreateOfferArgs extends IIssuerInstanceArgs {
|
|
|
26
26
|
credentialDefinition?: IssuerCredentialDefinition;
|
|
27
27
|
credentialOfferUri?: string;
|
|
28
28
|
credentialDataSupplierInput?: CredentialDataSupplierInput;
|
|
29
|
+
redirectUri?: string;
|
|
30
|
+
correlationId?: string;
|
|
31
|
+
sessionLifeTimeInSec?: number;
|
|
32
|
+
qrCodeOpts?: QRCodeOpts;
|
|
33
|
+
client_id?: string;
|
|
34
|
+
statusListOpts?: Array<StatusListOpts>;
|
|
35
|
+
offerMode?: CredentialOfferMode;
|
|
29
36
|
baseUri?: string;
|
|
30
37
|
scheme?: string;
|
|
31
38
|
pinLength?: number;
|
|
@@ -54,6 +61,7 @@ export interface IIssuerInstanceOptions extends IMetadataOptions {
|
|
|
54
61
|
metadataOpts?: CredentialIssuerMetadataOpts;
|
|
55
62
|
}
|
|
56
63
|
export interface IIssuerOptions {
|
|
64
|
+
asClientOpts?: ClientMetadata;
|
|
57
65
|
idOpts?: ManagedIdentifierOptsOrResult;
|
|
58
66
|
resolveOpts?: ResolveOpts;
|
|
59
67
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IOID4VCIIssuer.d.ts","sourceRoot":"","sources":["../../src/types/IOID4VCIIssuer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,gCAAgC,EAChC,2BAA2B,EAC3B,4BAA4B,EAC5B,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,EACL,gCAAgC,
|
|
1
|
+
{"version":3,"file":"IOID4VCIIssuer.d.ts","sourceRoot":"","sources":["../../src/types/IOID4VCIIssuer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sphereon/ssi-sdk.oid4vci-issuer",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
4
4
|
"source": "src/index.ts",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -14,19 +14,22 @@
|
|
|
14
14
|
"build:clean": "tsc --build --clean && tsc --build"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@sphereon/oid4vci-
|
|
18
|
-
"@sphereon/oid4vci-
|
|
19
|
-
"@sphereon/
|
|
20
|
-
"@sphereon/ssi-sdk-ext.
|
|
21
|
-
"@sphereon/ssi-sdk.
|
|
22
|
-
"@sphereon/ssi-sdk.
|
|
23
|
-
"@sphereon/ssi-sdk.
|
|
24
|
-
"@sphereon/ssi-sdk.
|
|
25
|
-
"@sphereon/ssi-sdk.
|
|
26
|
-
"@sphereon/ssi-sdk.
|
|
27
|
-
"@sphereon/ssi-sdk.
|
|
28
|
-
"@sphereon/ssi-sdk.
|
|
29
|
-
"@sphereon/ssi-
|
|
17
|
+
"@sphereon/oid4vci-client": "0.17.0",
|
|
18
|
+
"@sphereon/oid4vci-common": "0.17.0",
|
|
19
|
+
"@sphereon/oid4vci-issuer": "0.17.0",
|
|
20
|
+
"@sphereon/ssi-sdk-ext.did-utils": "0.28.0",
|
|
21
|
+
"@sphereon/ssi-sdk-ext.identifier-resolution": "0.28.0",
|
|
22
|
+
"@sphereon/ssi-sdk-ext.jwt-service": "0.28.0",
|
|
23
|
+
"@sphereon/ssi-sdk.agent-config": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
24
|
+
"@sphereon/ssi-sdk.core": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
25
|
+
"@sphereon/ssi-sdk.data-store": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
26
|
+
"@sphereon/ssi-sdk.kv-store-temp": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
27
|
+
"@sphereon/ssi-sdk.mdl-mdoc": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
28
|
+
"@sphereon/ssi-sdk.oid4vci-issuer-store": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
29
|
+
"@sphereon/ssi-sdk.sd-jwt": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
30
|
+
"@sphereon/ssi-sdk.vc-status-list": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
31
|
+
"@sphereon/ssi-sdk.vc-status-list-issuer": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
32
|
+
"@sphereon/ssi-types": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
30
33
|
"@types/uuid": "^9.0.8",
|
|
31
34
|
"@veramo/core": "4.2.0",
|
|
32
35
|
"@veramo/credential-w3c": "4.2.0",
|
|
@@ -35,7 +38,7 @@
|
|
|
35
38
|
"uuid": "^9.0.1"
|
|
36
39
|
},
|
|
37
40
|
"devDependencies": {
|
|
38
|
-
"@sphereon/did-auth-siop": "0.
|
|
41
|
+
"@sphereon/did-auth-siop": "0.17.0",
|
|
39
42
|
"@sphereon/did-uni-client": "^0.6.3",
|
|
40
43
|
"@veramo/did-provider-key": "4.2.0",
|
|
41
44
|
"@veramo/did-resolver": "4.2.0",
|
|
@@ -71,5 +74,5 @@
|
|
|
71
74
|
"Authenticator"
|
|
72
75
|
],
|
|
73
76
|
"nx": {},
|
|
74
|
-
"gitHead": "
|
|
77
|
+
"gitHead": "9f634bdb714061141e277508c124b08d626f6036"
|
|
75
78
|
}
|
package/src/IssuerInstance.ts
CHANGED
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
import { VcIssuer } from '@sphereon/oid4vci-issuer'
|
|
2
|
-
import { DIDDocument } from '@veramo/core'
|
|
1
|
+
import { CredentialDataSupplier, VcIssuer } from '@sphereon/oid4vci-issuer'
|
|
3
2
|
import { createVciIssuerBuilder } from './functions'
|
|
4
3
|
import { AuthorizationServerMetadata, IssuerMetadata } from '@sphereon/oid4vci-common'
|
|
5
|
-
|
|
6
|
-
import { CredentialDataSupplier } from '@sphereon/oid4vci-issuer'
|
|
7
4
|
import { IIssuerOptions, IMetadataOptions, IRequiredContext } from './types/IOID4VCIIssuer'
|
|
8
5
|
|
|
9
6
|
export class IssuerInstance {
|
|
10
|
-
private _issuer: VcIssuer
|
|
7
|
+
private _issuer: VcIssuer | undefined
|
|
11
8
|
private readonly _metadataOptions: IMetadataOptions
|
|
12
9
|
private readonly _issuerOptions: IIssuerOptions
|
|
13
|
-
private
|
|
10
|
+
private _issuerMetadata: IssuerMetadata
|
|
14
11
|
private readonly _authorizationServerMetadata: AuthorizationServerMetadata
|
|
15
12
|
|
|
16
13
|
public constructor({
|
|
@@ -30,7 +27,7 @@ export class IssuerInstance {
|
|
|
30
27
|
this._authorizationServerMetadata = authorizationServerMetadata
|
|
31
28
|
}
|
|
32
29
|
|
|
33
|
-
public async get(opts: { context: IRequiredContext; credentialDataSupplier?: CredentialDataSupplier }): Promise<VcIssuer
|
|
30
|
+
public async get(opts: { context: IRequiredContext; credentialDataSupplier?: CredentialDataSupplier }): Promise<VcIssuer> {
|
|
34
31
|
if (!this._issuer) {
|
|
35
32
|
const builder = await createVciIssuerBuilder(
|
|
36
33
|
{
|
|
@@ -58,6 +55,10 @@ export class IssuerInstance {
|
|
|
58
55
|
return this._issuerMetadata
|
|
59
56
|
}
|
|
60
57
|
|
|
58
|
+
set issuerMetadata(value: IssuerMetadata) {
|
|
59
|
+
this._issuerMetadata = value
|
|
60
|
+
}
|
|
61
|
+
|
|
61
62
|
get authorizationServerMetadata() {
|
|
62
63
|
return this._authorizationServerMetadata
|
|
63
64
|
}
|
|
@@ -1,8 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
AccessTokenResponse,
|
|
3
|
+
AuthorizationServerMetadata,
|
|
4
|
+
CredentialResponse,
|
|
5
|
+
IssuerMetadata,
|
|
6
|
+
OpenIDResponse,
|
|
7
|
+
WellKnownEndpoints,
|
|
8
|
+
} from '@sphereon/oid4vci-common'
|
|
2
9
|
import { assertValidAccessTokenRequest, createAccessTokenResponse, VcIssuer } from '@sphereon/oid4vci-issuer'
|
|
10
|
+
import { retrieveWellknown } from '@sphereon/oid4vci-client'
|
|
3
11
|
import { getAgentResolver } from '@sphereon/ssi-sdk-ext.did-utils'
|
|
4
12
|
import { IMetadataOptions } from '@sphereon/ssi-sdk.oid4vci-issuer-store'
|
|
5
|
-
import {
|
|
13
|
+
import { IAgentPlugin } from '@veramo/core'
|
|
6
14
|
import { getAccessTokenSignerCallback } from '../functions'
|
|
7
15
|
import {
|
|
8
16
|
IAssertValidAccessTokenArgs,
|
|
@@ -39,7 +47,7 @@ export class OID4VCIIssuer implements IAgentPlugin {
|
|
|
39
47
|
private async oid4vciCreateOfferURI(createArgs: ICreateOfferArgs, context: IRequiredContext): Promise<ICreateCredentialOfferURIResult> {
|
|
40
48
|
return await this.oid4vciGetInstance(createArgs, context)
|
|
41
49
|
.then((instance) => instance.get({ context }))
|
|
42
|
-
.then((issuer: VcIssuer
|
|
50
|
+
.then((issuer: VcIssuer) =>
|
|
43
51
|
issuer.createCredentialOfferURI(createArgs).then((response) => {
|
|
44
52
|
const result: ICreateCredentialOfferURIResult = response
|
|
45
53
|
if (this._opts.returnSessions === false) {
|
|
@@ -53,7 +61,7 @@ export class OID4VCIIssuer implements IAgentPlugin {
|
|
|
53
61
|
private async oid4vciIssueCredential(issueArgs: IIssueCredentialArgs, context: IRequiredContext): Promise<CredentialResponse> {
|
|
54
62
|
return await this.oid4vciGetInstance(issueArgs, context)
|
|
55
63
|
.then((instance) => instance.get({ context }))
|
|
56
|
-
.then((issuer: VcIssuer
|
|
64
|
+
.then((issuer: VcIssuer) => issuer.issueCredential(issueArgs))
|
|
57
65
|
}
|
|
58
66
|
|
|
59
67
|
private async oid4vciCreateAccessTokenResponse(
|
|
@@ -82,14 +90,42 @@ export class OID4VCIIssuer implements IAgentPlugin {
|
|
|
82
90
|
})
|
|
83
91
|
}
|
|
84
92
|
|
|
93
|
+
private getExternalAS(issuerMetadata: IssuerMetadata): string | undefined {
|
|
94
|
+
if ('authorization_servers' in issuerMetadata && Array.isArray(issuerMetadata.authorization_servers)) {
|
|
95
|
+
return issuerMetadata.authorization_servers.find((as) => as !== issuerMetadata.credential_issuer)
|
|
96
|
+
}
|
|
97
|
+
return undefined
|
|
98
|
+
}
|
|
99
|
+
|
|
85
100
|
private async createIssuerInstance(args: IIssuerInstanceArgs, context: IRequiredContext): Promise<IssuerInstance> {
|
|
86
101
|
const credentialIssuer = args.credentialIssuer ?? OID4VCIIssuer._DEFAULT_OPTS_KEY
|
|
87
102
|
//todo: prob doesn't make sense as credentialIssuer is mandatory anyway
|
|
88
103
|
|
|
89
104
|
const metadataOpts = await this.getMetadataOpts({ ...args, credentialIssuer }, context)
|
|
90
105
|
const issuerMetadata = await this.getIssuerMetadata({ ...args, credentialIssuer }, context)
|
|
91
|
-
const
|
|
92
|
-
|
|
106
|
+
const externalAS = this.getExternalAS(issuerMetadata)
|
|
107
|
+
let asMetadataResponse: OpenIDResponse<AuthorizationServerMetadata> | undefined = undefined
|
|
108
|
+
if (externalAS) {
|
|
109
|
+
// Let's try OIDC first and then fallback to OAuth2
|
|
110
|
+
asMetadataResponse = await retrieveWellknown(externalAS, WellKnownEndpoints.OPENID_CONFIGURATION, {
|
|
111
|
+
errorOnNotFound: false,
|
|
112
|
+
})
|
|
113
|
+
if (!asMetadataResponse) {
|
|
114
|
+
asMetadataResponse = await retrieveWellknown(externalAS, WellKnownEndpoints.OAUTH_AS, {
|
|
115
|
+
errorOnNotFound: true,
|
|
116
|
+
})
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const authorizationServerMetadata = asMetadataResponse?.successBody
|
|
120
|
+
? asMetadataResponse!.successBody
|
|
121
|
+
: await this.getAuthorizationServerMetadataFromStore(
|
|
122
|
+
{
|
|
123
|
+
...args,
|
|
124
|
+
credentialIssuer,
|
|
125
|
+
},
|
|
126
|
+
context,
|
|
127
|
+
)
|
|
128
|
+
const issuerOpts = await this.getIssuerOptsFromStore({ ...args, credentialIssuer }, context)
|
|
93
129
|
if (!issuerOpts.resolveOpts) {
|
|
94
130
|
issuerOpts.resolveOpts = { ...issuerOpts.didOpts?.resolveOpts, ...this._opts.resolveOpts }
|
|
95
131
|
}
|
|
@@ -117,7 +153,7 @@ export class OID4VCIIssuer implements IAgentPlugin {
|
|
|
117
153
|
return this.instances.get(credentialIssuer)!
|
|
118
154
|
}
|
|
119
155
|
|
|
120
|
-
private async
|
|
156
|
+
private async getIssuerOptsFromStore(
|
|
121
157
|
opts: {
|
|
122
158
|
credentialIssuer: string
|
|
123
159
|
storeId?: string
|
|
@@ -129,7 +165,7 @@ export class OID4VCIIssuer implements IAgentPlugin {
|
|
|
129
165
|
const storeId = await this.storeId(opts, context)
|
|
130
166
|
const namespace = await this.namespace(opts, context)
|
|
131
167
|
const options = await context.agent.oid4vciStoreGetIssuerOpts({
|
|
132
|
-
metadataType: '
|
|
168
|
+
metadataType: 'issuer',
|
|
133
169
|
correlationId: credentialIssuer,
|
|
134
170
|
storeId,
|
|
135
171
|
namespace,
|
|
@@ -170,14 +206,12 @@ export class OID4VCIIssuer implements IAgentPlugin {
|
|
|
170
206
|
storeId: metadataOpts.storeId,
|
|
171
207
|
})) as IssuerMetadata
|
|
172
208
|
if (!metadata) {
|
|
173
|
-
throw Error(
|
|
174
|
-
`Authorization server metadata not found for issuer ${opts.credentialIssuer}, namespace ${opts.namespace} and store ${opts.storeId}`,
|
|
175
|
-
)
|
|
209
|
+
throw Error(`Issuer metadata not found for issuer ${opts.credentialIssuer}, namespace ${opts.namespace} and store ${opts.storeId}`)
|
|
176
210
|
}
|
|
177
211
|
return metadata
|
|
178
212
|
}
|
|
179
213
|
|
|
180
|
-
private async
|
|
214
|
+
private async getAuthorizationServerMetadataFromStore(
|
|
181
215
|
opts: {
|
|
182
216
|
credentialIssuer: string
|
|
183
217
|
storeId?: string
|
|
@@ -193,7 +227,9 @@ export class OID4VCIIssuer implements IAgentPlugin {
|
|
|
193
227
|
storeId: metadataOpts.storeId,
|
|
194
228
|
})) as AuthorizationServerMetadata
|
|
195
229
|
if (!metadata) {
|
|
196
|
-
throw Error(
|
|
230
|
+
throw Error(
|
|
231
|
+
`Authorization server ${opts.credentialIssuer} metadata not found for namespace ${metadataOpts.storeNamespace} and store ${metadataOpts.storeId}`,
|
|
232
|
+
)
|
|
197
233
|
}
|
|
198
234
|
return metadata
|
|
199
235
|
}
|