@technomoron/apicore-server 1.0.0-beta.1

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.
Files changed (171) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/api-module.cjs +34 -0
  3. package/dist/cjs/api-module.d.ts +45 -0
  4. package/dist/cjs/apicore-server.cjs +1561 -0
  5. package/dist/cjs/apicore-server.d.ts +288 -0
  6. package/dist/cjs/auth-api/auth-module.cjs +1248 -0
  7. package/dist/cjs/auth-api/auth-module.d.ts +116 -0
  8. package/dist/cjs/auth-api/compat-auth-storage.cjs +128 -0
  9. package/dist/cjs/auth-api/compat-auth-storage.d.ts +57 -0
  10. package/dist/cjs/auth-api/mem-auth-store.cjs +121 -0
  11. package/dist/cjs/auth-api/mem-auth-store.d.ts +68 -0
  12. package/dist/cjs/auth-api/module.cjs +25 -0
  13. package/dist/cjs/auth-api/module.d.ts +20 -0
  14. package/dist/cjs/auth-api/schemas.cjs +171 -0
  15. package/dist/cjs/auth-api/schemas.d.ts +21 -0
  16. package/dist/cjs/auth-api/sql-auth-store.cjs +179 -0
  17. package/dist/cjs/auth-api/sql-auth-store.d.ts +87 -0
  18. package/dist/cjs/auth-api/storage.cjs +102 -0
  19. package/dist/cjs/auth-api/storage.d.ts +38 -0
  20. package/dist/cjs/auth-api/types.cjs +2 -0
  21. package/dist/cjs/auth-api/types.d.ts +34 -0
  22. package/dist/cjs/auth-api/user-id.cjs +47 -0
  23. package/dist/cjs/auth-api/user-id.d.ts +5 -0
  24. package/dist/cjs/auth-cookie-options.cjs +66 -0
  25. package/dist/cjs/auth-cookie-options.d.ts +13 -0
  26. package/dist/cjs/base/client-info.cjs +285 -0
  27. package/dist/cjs/base/client-info.d.ts +27 -0
  28. package/dist/cjs/base/error-utils.cjs +50 -0
  29. package/dist/cjs/base/error-utils.d.ts +16 -0
  30. package/dist/cjs/base/request-utils.cjs +27 -0
  31. package/dist/cjs/base/request-utils.d.ts +8 -0
  32. package/dist/cjs/index.cjs +51 -0
  33. package/dist/cjs/index.d.ts +34 -0
  34. package/dist/cjs/limiter/auth-rate-limiter.cjs +35 -0
  35. package/dist/cjs/limiter/auth-rate-limiter.d.ts +12 -0
  36. package/dist/cjs/limiter/fixed-window.cjs +41 -0
  37. package/dist/cjs/limiter/fixed-window.d.ts +11 -0
  38. package/dist/cjs/oauth/base.cjs +7 -0
  39. package/dist/cjs/oauth/base.d.ts +17 -0
  40. package/dist/cjs/oauth/memory.cjs +135 -0
  41. package/dist/cjs/oauth/memory.d.ts +22 -0
  42. package/dist/cjs/oauth/models.cjs +47 -0
  43. package/dist/cjs/oauth/models.d.ts +50 -0
  44. package/dist/cjs/oauth/sequelize.cjs +159 -0
  45. package/dist/cjs/oauth/sequelize.d.ts +30 -0
  46. package/dist/cjs/oauth/types.cjs +3 -0
  47. package/dist/cjs/oauth/types.d.ts +51 -0
  48. package/dist/cjs/passkey/base.cjs +7 -0
  49. package/dist/cjs/passkey/base.d.ts +28 -0
  50. package/dist/cjs/passkey/config.cjs +26 -0
  51. package/dist/cjs/passkey/config.d.ts +2 -0
  52. package/dist/cjs/passkey/memory.cjs +123 -0
  53. package/dist/cjs/passkey/memory.d.ts +34 -0
  54. package/dist/cjs/passkey/models.cjs +142 -0
  55. package/dist/cjs/passkey/models.d.ts +34 -0
  56. package/dist/cjs/passkey/sequelize.cjs +126 -0
  57. package/dist/cjs/passkey/sequelize.d.ts +42 -0
  58. package/dist/cjs/passkey/service.cjs +413 -0
  59. package/dist/cjs/passkey/service.d.ts +21 -0
  60. package/dist/cjs/passkey/types.cjs +2 -0
  61. package/dist/cjs/passkey/types.d.ts +84 -0
  62. package/dist/cjs/sequelize-utils.cjs +56 -0
  63. package/dist/cjs/sequelize-utils.d.ts +8 -0
  64. package/dist/cjs/token/base.cjs +120 -0
  65. package/dist/cjs/token/base.d.ts +46 -0
  66. package/dist/cjs/token/memory.cjs +234 -0
  67. package/dist/cjs/token/memory.d.ts +29 -0
  68. package/dist/cjs/token/sequelize.cjs +400 -0
  69. package/dist/cjs/token/sequelize.d.ts +58 -0
  70. package/dist/cjs/token/types.cjs +2 -0
  71. package/dist/cjs/token/types.d.ts +34 -0
  72. package/dist/cjs/upload/memory.cjs +92 -0
  73. package/dist/cjs/upload/memory.d.ts +17 -0
  74. package/dist/cjs/upload/tus-module.cjs +270 -0
  75. package/dist/cjs/upload/tus-module.d.ts +38 -0
  76. package/dist/cjs/upload/types.cjs +2 -0
  77. package/dist/cjs/upload/types.d.ts +28 -0
  78. package/dist/cjs/user/base.cjs +53 -0
  79. package/dist/cjs/user/base.d.ts +36 -0
  80. package/dist/cjs/user/memory.cjs +194 -0
  81. package/dist/cjs/user/memory.d.ts +37 -0
  82. package/dist/cjs/user/sequelize.cjs +194 -0
  83. package/dist/cjs/user/sequelize.d.ts +46 -0
  84. package/dist/cjs/user/types.cjs +2 -0
  85. package/dist/cjs/user/types.d.ts +11 -0
  86. package/dist/esm/api-module.d.ts +45 -0
  87. package/dist/esm/api-module.js +30 -0
  88. package/dist/esm/apicore-server.d.ts +288 -0
  89. package/dist/esm/apicore-server.js +1552 -0
  90. package/dist/esm/auth-api/auth-module.d.ts +116 -0
  91. package/dist/esm/auth-api/auth-module.js +1246 -0
  92. package/dist/esm/auth-api/compat-auth-storage.d.ts +57 -0
  93. package/dist/esm/auth-api/compat-auth-storage.js +124 -0
  94. package/dist/esm/auth-api/mem-auth-store.d.ts +68 -0
  95. package/dist/esm/auth-api/mem-auth-store.js +117 -0
  96. package/dist/esm/auth-api/module.d.ts +20 -0
  97. package/dist/esm/auth-api/module.js +21 -0
  98. package/dist/esm/auth-api/schemas.d.ts +21 -0
  99. package/dist/esm/auth-api/schemas.js +168 -0
  100. package/dist/esm/auth-api/sql-auth-store.d.ts +87 -0
  101. package/dist/esm/auth-api/sql-auth-store.js +175 -0
  102. package/dist/esm/auth-api/storage.d.ts +38 -0
  103. package/dist/esm/auth-api/storage.js +98 -0
  104. package/dist/esm/auth-api/types.d.ts +34 -0
  105. package/dist/esm/auth-api/types.js +1 -0
  106. package/dist/esm/auth-api/user-id.d.ts +5 -0
  107. package/dist/esm/auth-api/user-id.js +41 -0
  108. package/dist/esm/auth-cookie-options.d.ts +13 -0
  109. package/dist/esm/auth-cookie-options.js +63 -0
  110. package/dist/esm/base/client-info.d.ts +27 -0
  111. package/dist/esm/base/client-info.js +282 -0
  112. package/dist/esm/base/error-utils.d.ts +16 -0
  113. package/dist/esm/base/error-utils.js +44 -0
  114. package/dist/esm/base/request-utils.d.ts +8 -0
  115. package/dist/esm/base/request-utils.js +23 -0
  116. package/dist/esm/index.d.ts +34 -0
  117. package/dist/esm/index.js +21 -0
  118. package/dist/esm/limiter/auth-rate-limiter.d.ts +12 -0
  119. package/dist/esm/limiter/auth-rate-limiter.js +32 -0
  120. package/dist/esm/limiter/fixed-window.d.ts +11 -0
  121. package/dist/esm/limiter/fixed-window.js +37 -0
  122. package/dist/esm/oauth/base.d.ts +17 -0
  123. package/dist/esm/oauth/base.js +3 -0
  124. package/dist/esm/oauth/memory.d.ts +22 -0
  125. package/dist/esm/oauth/memory.js +128 -0
  126. package/dist/esm/oauth/models.d.ts +50 -0
  127. package/dist/esm/oauth/models.js +38 -0
  128. package/dist/esm/oauth/sequelize.d.ts +30 -0
  129. package/dist/esm/oauth/sequelize.js +148 -0
  130. package/dist/esm/oauth/types.d.ts +51 -0
  131. package/dist/esm/oauth/types.js +2 -0
  132. package/dist/esm/passkey/base.d.ts +28 -0
  133. package/dist/esm/passkey/base.js +3 -0
  134. package/dist/esm/passkey/config.d.ts +2 -0
  135. package/dist/esm/passkey/config.js +23 -0
  136. package/dist/esm/passkey/memory.d.ts +34 -0
  137. package/dist/esm/passkey/memory.js +119 -0
  138. package/dist/esm/passkey/models.d.ts +34 -0
  139. package/dist/esm/passkey/models.js +135 -0
  140. package/dist/esm/passkey/sequelize.d.ts +42 -0
  141. package/dist/esm/passkey/sequelize.js +122 -0
  142. package/dist/esm/passkey/service.d.ts +21 -0
  143. package/dist/esm/passkey/service.js +376 -0
  144. package/dist/esm/passkey/types.d.ts +84 -0
  145. package/dist/esm/passkey/types.js +1 -0
  146. package/dist/esm/sequelize-utils.d.ts +8 -0
  147. package/dist/esm/sequelize-utils.js +47 -0
  148. package/dist/esm/token/base.d.ts +46 -0
  149. package/dist/esm/token/base.js +113 -0
  150. package/dist/esm/token/memory.d.ts +29 -0
  151. package/dist/esm/token/memory.js +230 -0
  152. package/dist/esm/token/sequelize.d.ts +58 -0
  153. package/dist/esm/token/sequelize.js +396 -0
  154. package/dist/esm/token/types.d.ts +34 -0
  155. package/dist/esm/token/types.js +1 -0
  156. package/dist/esm/upload/memory.d.ts +17 -0
  157. package/dist/esm/upload/memory.js +86 -0
  158. package/dist/esm/upload/tus-module.d.ts +38 -0
  159. package/dist/esm/upload/tus-module.js +266 -0
  160. package/dist/esm/upload/types.d.ts +28 -0
  161. package/dist/esm/upload/types.js +1 -0
  162. package/dist/esm/user/base.d.ts +36 -0
  163. package/dist/esm/user/base.js +46 -0
  164. package/dist/esm/user/memory.d.ts +37 -0
  165. package/dist/esm/user/memory.js +190 -0
  166. package/dist/esm/user/sequelize.d.ts +46 -0
  167. package/dist/esm/user/sequelize.js +188 -0
  168. package/dist/esm/user/types.d.ts +11 -0
  169. package/dist/esm/user/types.js +1 -0
  170. package/docs/swagger/openapi.json +2162 -0
  171. package/package.json +131 -0
@@ -0,0 +1,34 @@
1
+ import { Model, type InferAttributes, type InferCreationAttributes, type ModelStatic, type Sequelize } from 'sequelize';
2
+ export declare class PasskeyCredentialModel extends Model<InferAttributes<PasskeyCredentialModel>, InferCreationAttributes<PasskeyCredentialModel>> {
3
+ credentialId: Buffer;
4
+ userId: number;
5
+ publicKey: Buffer;
6
+ counter: number;
7
+ transports: string[] | null;
8
+ backedUp: boolean;
9
+ deviceType: string;
10
+ label: string | null;
11
+ createdDomain: string | null;
12
+ createdUserAgent: string | null;
13
+ createdBrowser: string | null;
14
+ createdOs: string | null;
15
+ createdDevice: string | null;
16
+ createdIp: string | null;
17
+ createdAt?: Date;
18
+ updatedAt?: Date;
19
+ }
20
+ export declare class PasskeyChallengeModel extends Model<InferAttributes<PasskeyChallengeModel>, InferCreationAttributes<PasskeyChallengeModel>> {
21
+ challenge: string;
22
+ action: 'register' | 'authenticate';
23
+ userId: number | null;
24
+ login: string | null;
25
+ expiresAt: Date;
26
+ createdAt?: Date;
27
+ updatedAt?: Date;
28
+ }
29
+ export declare function initPasskeyCredentialModel(sequelize: Sequelize, options?: {
30
+ tablePrefix?: string;
31
+ }): ModelStatic<PasskeyCredentialModel>;
32
+ export declare function initPasskeyChallengeModel(sequelize: Sequelize, options?: {
33
+ tablePrefix?: string;
34
+ }): ModelStatic<PasskeyChallengeModel>;
@@ -0,0 +1,135 @@
1
+ import { DataTypes, Model } from 'sequelize';
2
+ import { applyTablePrefix, integerIdType } from '../sequelize-utils.js';
3
+ export class PasskeyCredentialModel extends Model {
4
+ }
5
+ export class PasskeyChallengeModel extends Model {
6
+ }
7
+ export function initPasskeyCredentialModel(sequelize, options = {}) {
8
+ const idType = integerIdType(sequelize);
9
+ return PasskeyCredentialModel.init({
10
+ credentialId: {
11
+ field: 'credential_id',
12
+ type: DataTypes.STRING(768),
13
+ primaryKey: true,
14
+ allowNull: false,
15
+ get() {
16
+ const raw = this.getDataValue('credentialId');
17
+ if (!raw) {
18
+ return raw;
19
+ }
20
+ if (Buffer.isBuffer(raw)) {
21
+ return raw;
22
+ }
23
+ return Buffer.from(raw, 'base64');
24
+ },
25
+ set(value) {
26
+ const encoded = typeof value === 'string' ? value : value.toString('base64');
27
+ this.setDataValue('credentialId', encoded);
28
+ }
29
+ },
30
+ userId: {
31
+ field: 'user_id',
32
+ type: idType,
33
+ allowNull: false
34
+ },
35
+ publicKey: {
36
+ field: 'public_key',
37
+ type: DataTypes.BLOB,
38
+ allowNull: false
39
+ },
40
+ counter: {
41
+ type: DataTypes.INTEGER,
42
+ allowNull: false,
43
+ defaultValue: 0
44
+ },
45
+ transports: {
46
+ type: DataTypes.JSON,
47
+ allowNull: true
48
+ },
49
+ backedUp: {
50
+ field: 'backed_up',
51
+ type: DataTypes.BOOLEAN,
52
+ allowNull: false,
53
+ defaultValue: false
54
+ },
55
+ deviceType: {
56
+ field: 'device_type',
57
+ type: DataTypes.STRING(32),
58
+ allowNull: false,
59
+ defaultValue: 'multiDevice'
60
+ },
61
+ label: {
62
+ type: DataTypes.STRING(120),
63
+ allowNull: true
64
+ },
65
+ createdDomain: {
66
+ field: 'created_domain',
67
+ type: DataTypes.STRING(255),
68
+ allowNull: true
69
+ },
70
+ createdUserAgent: {
71
+ field: 'created_user_agent',
72
+ type: DataTypes.TEXT,
73
+ allowNull: true
74
+ },
75
+ createdBrowser: {
76
+ field: 'created_browser',
77
+ type: DataTypes.STRING(120),
78
+ allowNull: true
79
+ },
80
+ createdOs: {
81
+ field: 'created_os',
82
+ type: DataTypes.STRING(120),
83
+ allowNull: true
84
+ },
85
+ createdDevice: {
86
+ field: 'created_device',
87
+ type: DataTypes.STRING(120),
88
+ allowNull: true
89
+ },
90
+ createdIp: {
91
+ field: 'created_ip',
92
+ type: DataTypes.STRING(45),
93
+ allowNull: true
94
+ }
95
+ }, {
96
+ sequelize,
97
+ tableName: applyTablePrefix(options.tablePrefix, 'passkey_credentials'),
98
+ timestamps: true,
99
+ underscored: true
100
+ });
101
+ }
102
+ export function initPasskeyChallengeModel(sequelize, options = {}) {
103
+ const idType = integerIdType(sequelize);
104
+ return PasskeyChallengeModel.init({
105
+ challenge: {
106
+ type: DataTypes.STRING(255),
107
+ primaryKey: true,
108
+ allowNull: false
109
+ },
110
+ action: {
111
+ type: DataTypes.STRING(16),
112
+ allowNull: false
113
+ },
114
+ userId: {
115
+ field: 'user_id',
116
+ type: idType,
117
+ allowNull: true
118
+ },
119
+ login: {
120
+ type: DataTypes.STRING(128),
121
+ allowNull: true
122
+ },
123
+ expiresAt: {
124
+ field: 'expires_at',
125
+ type: DataTypes.DATE,
126
+ allowNull: false
127
+ }
128
+ }, {
129
+ sequelize,
130
+ tableName: applyTablePrefix(options.tablePrefix, 'passkey_challenges'),
131
+ timestamps: true,
132
+ underscored: true,
133
+ indexes: [{ fields: ['expires_at'] }, { fields: ['user_id'] }]
134
+ });
135
+ }
@@ -0,0 +1,42 @@
1
+ import { type ModelStatic, type Sequelize } from 'sequelize';
2
+ import { PasskeyStore } from './base.js';
3
+ import { PasskeyChallengeModel, PasskeyCredentialModel } from './models.js';
4
+ import type { PasskeyChallengeRecord, PasskeyUserDescriptor, StoredPasskeyCredential } from './types.js';
5
+ import type { AuthIdentifier } from '../auth-api/types.js';
6
+ export interface SequelizePasskeyStoreOptions {
7
+ sequelize: Sequelize;
8
+ tablePrefix?: string;
9
+ credentialModel?: ModelStatic<PasskeyCredentialModel>;
10
+ challengeModel?: ModelStatic<PasskeyChallengeModel>;
11
+ credentialModelFactory?: (sequelize: Sequelize, options?: {
12
+ tablePrefix?: string;
13
+ }) => ModelStatic<PasskeyCredentialModel>;
14
+ challengeModelFactory?: (sequelize: Sequelize, options?: {
15
+ tablePrefix?: string;
16
+ }) => ModelStatic<PasskeyChallengeModel>;
17
+ resolveUser: (params: {
18
+ userId?: AuthIdentifier;
19
+ login?: string;
20
+ }) => Promise<PasskeyUserDescriptor | null>;
21
+ }
22
+ export declare class SequelizePasskeyStore extends PasskeyStore {
23
+ private readonly resolveUserFn;
24
+ private readonly credentials;
25
+ private readonly challenges;
26
+ constructor(options: SequelizePasskeyStoreOptions);
27
+ resolveUser(params: {
28
+ userId?: AuthIdentifier;
29
+ login?: string;
30
+ }): Promise<PasskeyUserDescriptor | null>;
31
+ listUserCredentials(userId: AuthIdentifier): Promise<StoredPasskeyCredential[]>;
32
+ deleteCredential(credentialId: Buffer | string): Promise<boolean>;
33
+ findCredentialById(credentialId: Buffer): Promise<StoredPasskeyCredential | null>;
34
+ saveCredential(record: StoredPasskeyCredential): Promise<void>;
35
+ updateCredentialCounter(credentialId: Buffer, counter: number): Promise<void>;
36
+ saveChallenge(record: PasskeyChallengeRecord): Promise<void>;
37
+ getChallenge(challenge: string): Promise<PasskeyChallengeRecord | null>;
38
+ consumeChallenge(challenge: string): Promise<PasskeyChallengeRecord | null>;
39
+ cleanupChallenges(now: Date): Promise<void>;
40
+ private toChallengeRecord;
41
+ private toStoredCredential;
42
+ }
@@ -0,0 +1,122 @@
1
+ import { Op, Transaction } from 'sequelize';
2
+ import { normalizeNumericUserId } from '../auth-api/user-id.js';
3
+ import { PasskeyStore } from './base.js';
4
+ import { initPasskeyChallengeModel, initPasskeyCredentialModel } from './models.js';
5
+ function encodeCredentialId(value) {
6
+ return Buffer.isBuffer(value) ? value.toString('base64') : value;
7
+ }
8
+ export class SequelizePasskeyStore extends PasskeyStore {
9
+ constructor(options) {
10
+ super();
11
+ if (!options?.sequelize) {
12
+ throw new Error('SequelizePasskeyStore requires an initialised Sequelize instance');
13
+ }
14
+ this.resolveUserFn = options.resolveUser;
15
+ this.credentials =
16
+ options.credentialModel ??
17
+ (options.credentialModelFactory ?? initPasskeyCredentialModel)(options.sequelize, {
18
+ tablePrefix: options.tablePrefix
19
+ });
20
+ this.challenges =
21
+ options.challengeModel ??
22
+ (options.challengeModelFactory ?? initPasskeyChallengeModel)(options.sequelize, {
23
+ tablePrefix: options.tablePrefix
24
+ });
25
+ }
26
+ async resolveUser(params) {
27
+ return this.resolveUserFn(params);
28
+ }
29
+ async listUserCredentials(userId) {
30
+ const models = await this.credentials.findAll({ where: { userId: normalizeNumericUserId(userId) } });
31
+ return models.map((model) => this.toStoredCredential(model));
32
+ }
33
+ async deleteCredential(credentialId) {
34
+ const encoded = Buffer.isBuffer(credentialId) ? credentialId.toString('base64') : credentialId;
35
+ const deleted = await this.credentials.destroy({ where: { credentialId: encoded } });
36
+ return deleted > 0;
37
+ }
38
+ async findCredentialById(credentialId) {
39
+ const model = await this.credentials.findByPk(encodeCredentialId(credentialId));
40
+ return model ? this.toStoredCredential(model) : null;
41
+ }
42
+ async saveCredential(record) {
43
+ await this.credentials.upsert({
44
+ credentialId: record.credentialId,
45
+ userId: normalizeNumericUserId(record.userId),
46
+ publicKey: record.publicKey,
47
+ counter: record.counter,
48
+ transports: record.transports ?? null,
49
+ backedUp: record.backedUp,
50
+ deviceType: record.deviceType,
51
+ label: record.label ?? null,
52
+ createdDomain: record.createdDomain ?? null,
53
+ createdUserAgent: record.createdUserAgent ?? null,
54
+ createdBrowser: record.createdBrowser ?? null,
55
+ createdOs: record.createdOs ?? null,
56
+ createdDevice: record.createdDevice ?? null,
57
+ createdIp: record.createdIp ?? null
58
+ });
59
+ }
60
+ async updateCredentialCounter(credentialId, counter) {
61
+ await this.credentials.update({ counter }, { where: { credentialId: encodeCredentialId(credentialId) } });
62
+ }
63
+ async saveChallenge(record) {
64
+ await this.challenges.upsert({
65
+ challenge: record.challenge,
66
+ action: record.action,
67
+ userId: record.userId !== undefined ? normalizeNumericUserId(record.userId) : null,
68
+ login: record.login ?? null,
69
+ expiresAt: record.expiresAt
70
+ });
71
+ }
72
+ async getChallenge(challenge) {
73
+ const model = await this.challenges.findByPk(challenge);
74
+ return model ? this.toChallengeRecord(model) : null;
75
+ }
76
+ async consumeChallenge(challenge) {
77
+ const sequelize = this.challenges.sequelize;
78
+ if (!sequelize) {
79
+ throw new Error('Challenge model is not bound to a Sequelize instance');
80
+ }
81
+ return sequelize.transaction({ isolationLevel: Transaction.ISOLATION_LEVELS.READ_COMMITTED }, async (transaction) => {
82
+ const model = await this.challenges.findByPk(challenge, { transaction, lock: true });
83
+ if (!model) {
84
+ return null;
85
+ }
86
+ await model.destroy({ transaction });
87
+ return this.toChallengeRecord(model);
88
+ });
89
+ }
90
+ async cleanupChallenges(now) {
91
+ await this.challenges.destroy({ where: { expiresAt: { [Op.lte]: now } } });
92
+ }
93
+ toChallengeRecord(model) {
94
+ return {
95
+ challenge: model.challenge,
96
+ action: model.action,
97
+ userId: model.userId !== null ? String(model.userId) : undefined,
98
+ login: model.login ?? undefined,
99
+ expiresAt: model.expiresAt
100
+ };
101
+ }
102
+ toStoredCredential(model) {
103
+ return {
104
+ userId: String(model.userId),
105
+ credentialId: model.credentialId,
106
+ publicKey: model.publicKey,
107
+ counter: model.counter,
108
+ transports: (model.transports ?? undefined),
109
+ backedUp: model.backedUp,
110
+ deviceType: model.deviceType,
111
+ label: model.label ?? undefined,
112
+ createdDomain: model.createdDomain ?? undefined,
113
+ createdUserAgent: model.createdUserAgent ?? undefined,
114
+ createdBrowser: model.createdBrowser ?? undefined,
115
+ createdOs: model.createdOs ?? undefined,
116
+ createdDevice: model.createdDevice ?? undefined,
117
+ createdIp: model.createdIp ?? undefined,
118
+ createdAt: model.createdAt ?? undefined,
119
+ updatedAt: model.updatedAt ?? undefined
120
+ };
121
+ }
122
+ }
@@ -0,0 +1,21 @@
1
+ import type { PasskeyChallenge, PasskeyChallengeParams, PasskeyStorageAdapter, PasskeyVerificationParams, PasskeyVerificationResult, PasskeyServiceConfig, StoredPasskeyCredential } from './types.js';
2
+ import type { AuthIdentifier } from '../auth-api/types.js';
3
+ export type { CredentialDeviceType, PasskeyChallenge, PasskeyChallengeParams, PasskeyChallengeRecord, PasskeyUserDescriptor, PasskeyVerificationParams, PasskeyVerificationResult, PasskeyServiceConfig, PasskeyStorageAdapter, StoredPasskeyCredential } from './types.js';
4
+ type Logger = Pick<typeof console, 'error' | 'warn'>;
5
+ export declare class PasskeyService {
6
+ private readonly config;
7
+ private readonly adapter;
8
+ private readonly logger;
9
+ constructor(config: PasskeyServiceConfig, adapter: PasskeyStorageAdapter, logger?: Logger);
10
+ listUserCredentials(userId: AuthIdentifier): Promise<StoredPasskeyCredential[]>;
11
+ deleteCredential(credentialId: Buffer | string, userId?: AuthIdentifier): Promise<boolean>;
12
+ createChallenge(params: PasskeyChallengeParams): Promise<PasskeyChallenge>;
13
+ verifyResponse(params: PasskeyVerificationParams): Promise<PasskeyVerificationResult>;
14
+ private createRegistrationChallenge;
15
+ private createAuthenticationChallenge;
16
+ private verifyRegistration;
17
+ private verifyAuthentication;
18
+ private requireUser;
19
+ private createExpiry;
20
+ private requireUserVerification;
21
+ }