@atproto/bsky 0.0.198 → 0.0.199

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 (151) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/api/age-assurance/const.d.ts +11 -0
  3. package/dist/api/age-assurance/const.d.ts.map +1 -0
  4. package/dist/api/age-assurance/const.js +142 -0
  5. package/dist/api/age-assurance/const.js.map +1 -0
  6. package/dist/api/age-assurance/index.d.ts +4 -0
  7. package/dist/api/age-assurance/index.d.ts.map +1 -0
  8. package/dist/api/age-assurance/index.js +24 -0
  9. package/dist/api/age-assurance/index.js.map +1 -0
  10. package/dist/api/age-assurance/kws/age-verified.d.ts +109 -0
  11. package/dist/api/age-assurance/kws/age-verified.d.ts.map +1 -0
  12. package/dist/api/age-assurance/kws/age-verified.js +63 -0
  13. package/dist/api/age-assurance/kws/age-verified.js.map +1 -0
  14. package/dist/api/age-assurance/kws/const.d.ts +13 -0
  15. package/dist/api/age-assurance/kws/const.d.ts.map +1 -0
  16. package/dist/api/age-assurance/kws/const.js +36 -0
  17. package/dist/api/age-assurance/kws/const.js.map +1 -0
  18. package/dist/api/age-assurance/kws/external-payload.d.ts +75 -0
  19. package/dist/api/age-assurance/kws/external-payload.d.ts.map +1 -0
  20. package/dist/api/age-assurance/kws/external-payload.js +124 -0
  21. package/dist/api/age-assurance/kws/external-payload.js.map +1 -0
  22. package/dist/api/age-assurance/kws/external-payload.test.d.ts +2 -0
  23. package/dist/api/age-assurance/kws/external-payload.test.d.ts.map +1 -0
  24. package/dist/api/age-assurance/kws/external-payload.test.js +65 -0
  25. package/dist/api/age-assurance/kws/external-payload.test.js.map +1 -0
  26. package/dist/api/age-assurance/redirects/kws-age-verified.d.ts +4 -0
  27. package/dist/api/age-assurance/redirects/kws-age-verified.d.ts.map +1 -0
  28. package/dist/api/age-assurance/redirects/kws-age-verified.js +76 -0
  29. package/dist/api/age-assurance/redirects/kws-age-verified.js.map +1 -0
  30. package/dist/api/age-assurance/stash.d.ts +4 -0
  31. package/dist/api/age-assurance/stash.d.ts.map +1 -0
  32. package/dist/api/age-assurance/stash.js +19 -0
  33. package/dist/api/age-assurance/stash.js.map +1 -0
  34. package/dist/api/age-assurance/types.d.ts +10 -0
  35. package/dist/api/age-assurance/types.d.ts.map +1 -0
  36. package/dist/api/age-assurance/types.js +3 -0
  37. package/dist/api/age-assurance/types.js.map +1 -0
  38. package/dist/api/age-assurance/util.d.ts +15 -0
  39. package/dist/api/age-assurance/util.d.ts.map +1 -0
  40. package/dist/api/age-assurance/util.js +54 -0
  41. package/dist/api/age-assurance/util.js.map +1 -0
  42. package/dist/api/age-assurance/webhooks/kws-age-verified.d.ts +4 -0
  43. package/dist/api/age-assurance/webhooks/kws-age-verified.d.ts.map +1 -0
  44. package/dist/api/age-assurance/webhooks/kws-age-verified.js +63 -0
  45. package/dist/api/age-assurance/webhooks/kws-age-verified.js.map +1 -0
  46. package/dist/api/app/bsky/ageassurance/begin.d.ts +4 -0
  47. package/dist/api/app/bsky/ageassurance/begin.d.ts.map +1 -0
  48. package/dist/api/app/bsky/ageassurance/begin.js +131 -0
  49. package/dist/api/app/bsky/ageassurance/begin.js.map +1 -0
  50. package/dist/api/app/bsky/ageassurance/getConfig.d.ts +4 -0
  51. package/dist/api/app/bsky/ageassurance/getConfig.d.ts.map +1 -0
  52. package/dist/api/app/bsky/ageassurance/getConfig.js +16 -0
  53. package/dist/api/app/bsky/ageassurance/getConfig.js.map +1 -0
  54. package/dist/api/app/bsky/ageassurance/getState.d.ts +4 -0
  55. package/dist/api/app/bsky/ageassurance/getState.d.ts.map +1 -0
  56. package/dist/api/app/bsky/ageassurance/getState.js +42 -0
  57. package/dist/api/app/bsky/ageassurance/getState.js.map +1 -0
  58. package/dist/api/external.d.ts.map +1 -1
  59. package/dist/api/external.js +2 -0
  60. package/dist/api/external.js.map +1 -1
  61. package/dist/api/index.d.ts.map +1 -1
  62. package/dist/api/index.js +8 -2
  63. package/dist/api/index.js.map +1 -1
  64. package/dist/api/kws/api.d.ts.map +1 -1
  65. package/dist/api/kws/api.js +44 -26
  66. package/dist/api/kws/api.js.map +1 -1
  67. package/dist/api/kws/index.d.ts.map +1 -1
  68. package/dist/api/kws/index.js +3 -1
  69. package/dist/api/kws/index.js.map +1 -1
  70. package/dist/api/kws/webhook.d.ts +3 -1
  71. package/dist/api/kws/webhook.d.ts.map +1 -1
  72. package/dist/api/kws/webhook.js +48 -20
  73. package/dist/api/kws/webhook.js.map +1 -1
  74. package/dist/config.d.ts +14 -0
  75. package/dist/config.d.ts.map +1 -1
  76. package/dist/config.js +10 -2
  77. package/dist/config.js.map +1 -1
  78. package/dist/data-plane/bsync/index.d.ts.map +1 -1
  79. package/dist/data-plane/bsync/index.js +22 -0
  80. package/dist/data-plane/bsync/index.js.map +1 -1
  81. package/dist/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.d.ts +4 -0
  82. package/dist/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.d.ts.map +1 -0
  83. package/dist/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.js +30 -0
  84. package/dist/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.js.map +1 -0
  85. package/dist/data-plane/server/db/migrations/index.d.ts +1 -0
  86. package/dist/data-plane/server/db/migrations/index.d.ts.map +1 -1
  87. package/dist/data-plane/server/db/migrations/index.js +2 -1
  88. package/dist/data-plane/server/db/migrations/index.js.map +1 -1
  89. package/dist/data-plane/server/db/pagination.d.ts +3 -3
  90. package/dist/data-plane/server/db/tables/actor.d.ts +3 -0
  91. package/dist/data-plane/server/db/tables/actor.d.ts.map +1 -1
  92. package/dist/data-plane/server/db/tables/actor.js.map +1 -1
  93. package/dist/data-plane/server/routes/profile.d.ts.map +1 -1
  94. package/dist/data-plane/server/routes/profile.js +13 -1
  95. package/dist/data-plane/server/routes/profile.js.map +1 -1
  96. package/dist/hydration/hydrator.js +1 -1
  97. package/dist/hydration/hydrator.js.map +1 -1
  98. package/dist/kws.d.ts +35 -0
  99. package/dist/kws.d.ts.map +1 -1
  100. package/dist/kws.js +54 -0
  101. package/dist/kws.js.map +1 -1
  102. package/dist/logger.d.ts +1 -0
  103. package/dist/logger.d.ts.map +1 -1
  104. package/dist/logger.js +2 -1
  105. package/dist/logger.js.map +1 -1
  106. package/dist/proto/bsky_pb.d.ts +8 -0
  107. package/dist/proto/bsky_pb.d.ts.map +1 -1
  108. package/dist/proto/bsky_pb.js +20 -0
  109. package/dist/proto/bsky_pb.js.map +1 -1
  110. package/dist/stash.d.ts +1 -0
  111. package/dist/stash.d.ts.map +1 -1
  112. package/dist/stash.js +1 -0
  113. package/dist/stash.js.map +1 -1
  114. package/dist/util/uris.d.ts +2 -2
  115. package/dist/util/uris.d.ts.map +1 -1
  116. package/package.json +10 -9
  117. package/proto/bsky.proto +1 -0
  118. package/src/api/age-assurance/const.ts +142 -0
  119. package/src/api/age-assurance/index.ts +34 -0
  120. package/src/api/age-assurance/kws/age-verified.ts +75 -0
  121. package/src/api/age-assurance/kws/const.ts +33 -0
  122. package/src/api/age-assurance/kws/external-payload.test.ts +72 -0
  123. package/src/api/age-assurance/kws/external-payload.ts +149 -0
  124. package/src/api/age-assurance/redirects/kws-age-verified.ts +107 -0
  125. package/src/api/age-assurance/stash.ts +22 -0
  126. package/src/api/age-assurance/types.ts +10 -0
  127. package/src/api/age-assurance/util.ts +66 -0
  128. package/src/api/age-assurance/webhooks/kws-age-verified.ts +75 -0
  129. package/src/api/app/bsky/ageassurance/begin.ts +167 -0
  130. package/src/api/app/bsky/ageassurance/getConfig.ts +15 -0
  131. package/src/api/app/bsky/ageassurance/getState.ts +53 -0
  132. package/src/api/external.ts +2 -0
  133. package/src/api/index.ts +6 -0
  134. package/src/api/kws/api.ts +55 -34
  135. package/src/api/kws/index.ts +7 -1
  136. package/src/api/kws/webhook.ts +57 -34
  137. package/src/config.ts +26 -2
  138. package/src/data-plane/bsync/index.ts +31 -0
  139. package/src/data-plane/server/db/migrations/20251120T004738098Z-update-actor-age-assurance-v2.ts +28 -0
  140. package/src/data-plane/server/db/migrations/index.ts +1 -0
  141. package/src/data-plane/server/db/tables/actor.ts +3 -0
  142. package/src/data-plane/server/routes/profile.ts +12 -1
  143. package/src/hydration/hydrator.ts +1 -1
  144. package/src/kws.ts +81 -0
  145. package/src/logger.ts +2 -0
  146. package/src/proto/bsky_pb.ts +12 -0
  147. package/src/stash.ts +3 -0
  148. package/tests/views/age-assurance-v2.test.ts +745 -0
  149. package/tests/views/age-assurance.test.ts +2 -0
  150. package/tsconfig.build.tsbuildinfo +1 -1
  151. package/tsconfig.tests.tsbuildinfo +1 -1
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = default_1;
7
+ const node_crypto_1 = __importDefault(require("node:crypto"));
8
+ const address_1 = require("@hapi/address");
9
+ const disposable_email_domains_js_1 = require("disposable-email-domains-js");
10
+ const api_1 = require("@atproto/api");
11
+ const xrpc_server_1 = require("@atproto/xrpc-server");
12
+ const logger_1 = require("../../../../logger");
13
+ const const_1 = require("../../../age-assurance/const");
14
+ const const_2 = require("../../../age-assurance/kws/const");
15
+ const external_payload_1 = require("../../../age-assurance/kws/external-payload");
16
+ const stash_1 = require("../../../age-assurance/stash");
17
+ const util_1 = require("../../../age-assurance/util");
18
+ const util_2 = require("../../../kws/util");
19
+ function default_1(server, ctx) {
20
+ server.app.bsky.ageassurance.begin({
21
+ auth: ctx.authVerifier.standard,
22
+ handler: async ({ auth, input, req }) => {
23
+ if (!ctx.kwsClient) {
24
+ throw new xrpc_server_1.MethodNotImplementedError('This service is not configured to support age assurance.');
25
+ }
26
+ const actorDid = auth.credentials.iss;
27
+ const actorInfo = await getAgeVerificationState(ctx, actorDid);
28
+ if (actorInfo?.ageAssuranceStatus) {
29
+ if (actorInfo.ageAssuranceStatus.status !== 'unknown' &&
30
+ actorInfo.ageAssuranceStatus.status !== 'pending') {
31
+ throw new xrpc_server_1.InvalidRequestError(`Cannot initiate age assurance flow from current state: ${actorInfo.ageAssuranceStatus.status}`, 'InvalidInitiation');
32
+ }
33
+ }
34
+ const attemptId = node_crypto_1.default.randomUUID();
35
+ const { email, language, countryCode, regionCode } = validateInput(input.body);
36
+ let externalPayload;
37
+ try {
38
+ externalPayload = (0, external_payload_1.serializeKWSExternalPayloadV2)({
39
+ version: external_payload_1.KWSExternalPayloadVersion.V2,
40
+ actorDid,
41
+ attemptId,
42
+ countryCode,
43
+ regionCode,
44
+ });
45
+ }
46
+ catch (err) {
47
+ if (err instanceof external_payload_1.KWSExternalPayloadTooLargeError) {
48
+ logger_1.httpLogger.error({ err, actorDid }, err.message);
49
+ throw new xrpc_server_1.InvalidRequestError('Age Assurance flow failed because DID is too long', 'DidTooLong');
50
+ }
51
+ throw err;
52
+ }
53
+ /*
54
+ * Determine if age assurance config exists for this region. The calling
55
+ * application should already have checked for this, so this is just a
56
+ * safeguard.
57
+ */
58
+ const region = (0, api_1.getAgeAssuranceRegionConfig)(const_1.AGE_ASSURANCE_CONFIG, {
59
+ countryCode,
60
+ regionCode,
61
+ });
62
+ if (!region) {
63
+ const message = 'Age Assurance is not required in this region';
64
+ logger_1.httpLogger.error({ actorDid, countryCode, regionCode }, message);
65
+ throw new xrpc_server_1.InvalidRequestError(message, 'RegionNotSupported');
66
+ }
67
+ const location = (0, util_1.createLocationString)(countryCode, regionCode);
68
+ if (const_2.KWS_V2_COUNTRIES.has(region.countryCode)) {
69
+ // `age-verified` flow
70
+ await ctx.kwsClient.sendAgeVerifiedFlowEmail({
71
+ location,
72
+ email,
73
+ externalPayload,
74
+ language,
75
+ });
76
+ }
77
+ else {
78
+ // `adult-verified` flow is what we've been using prior to `age-verified`
79
+ await ctx.kwsClient.sendAdultVerifiedFlowEmail({
80
+ location,
81
+ email,
82
+ externalPayload,
83
+ language,
84
+ });
85
+ }
86
+ const event = await (0, stash_1.createEvent)(ctx, actorDid, {
87
+ attemptId,
88
+ email,
89
+ // Assumes `app.set('trust proxy', ...)` configured with `true` or specific values.
90
+ initIp: req.ip,
91
+ initUa: (0, util_2.getClientUa)(req),
92
+ status: 'pending',
93
+ access: 'unknown',
94
+ countryCode,
95
+ regionCode,
96
+ });
97
+ return {
98
+ encoding: 'application/json',
99
+ body: {
100
+ lastInitiatedAt: event.createdAt,
101
+ status: 'pending',
102
+ access: 'unknown',
103
+ },
104
+ };
105
+ },
106
+ });
107
+ }
108
+ function validateInput({ email, language, ...rest }) {
109
+ if (!(0, address_1.isEmailValid)(email) || (0, disposable_email_domains_js_1.isDisposableEmail)(email)) {
110
+ throw new xrpc_server_1.InvalidRequestError('This email address is not supported, please use a different email.', 'InvalidEmail');
111
+ }
112
+ return {
113
+ email,
114
+ language: const_2.KWS_SUPPORTED_LANGUAGES.has(language) ? language : 'en',
115
+ ...rest,
116
+ };
117
+ }
118
+ async function getAgeVerificationState(ctx, actorDid) {
119
+ try {
120
+ const res = await ctx.dataplane.getActors({
121
+ dids: [actorDid],
122
+ returnAgeAssuranceForDids: [actorDid],
123
+ skipCacheForDids: [actorDid],
124
+ });
125
+ return res.actors[0];
126
+ }
127
+ catch (err) {
128
+ return undefined;
129
+ }
130
+ }
131
+ //# sourceMappingURL=begin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"begin.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/ageassurance/begin.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from 'node:crypto'\nimport { isEmailValid } from '@hapi/address'\nimport { isDisposableEmail } from 'disposable-email-domains-js'\nimport { getAgeAssuranceRegionConfig } from '@atproto/api'\nimport {\n InvalidRequestError,\n MethodNotImplementedError,\n} from '@atproto/xrpc-server'\nimport { AppContext } from '../../../../context'\nimport { Server } from '../../../../lexicon'\nimport { InputSchema } from '../../../../lexicon/types/app/bsky/ageassurance/begin'\nimport { httpLogger as log } from '../../../../logger'\nimport { ActorInfo } from '../../../../proto/bsky_pb'\nimport { AGE_ASSURANCE_CONFIG } from '../../../age-assurance/const'\nimport {\n KWS_SUPPORTED_LANGUAGES,\n KWS_V2_COUNTRIES,\n} from '../../../age-assurance/kws/const'\nimport {\n KWSExternalPayloadTooLargeError,\n KWSExternalPayloadVersion,\n serializeKWSExternalPayloadV2,\n} from '../../../age-assurance/kws/external-payload'\nimport { createEvent } from '../../../age-assurance/stash'\nimport { createLocationString } from '../../../age-assurance/util'\nimport { getClientUa } from '../../../kws/util'\n\nexport default function (server: Server, ctx: AppContext) {\n server.app.bsky.ageassurance.begin({\n auth: ctx.authVerifier.standard,\n handler: async ({ auth, input, req }) => {\n if (!ctx.kwsClient) {\n throw new MethodNotImplementedError(\n 'This service is not configured to support age assurance.',\n )\n }\n\n const actorDid = auth.credentials.iss\n const actorInfo = await getAgeVerificationState(ctx, actorDid)\n\n if (actorInfo?.ageAssuranceStatus) {\n if (\n actorInfo.ageAssuranceStatus.status !== 'unknown' &&\n actorInfo.ageAssuranceStatus.status !== 'pending'\n ) {\n throw new InvalidRequestError(\n `Cannot initiate age assurance flow from current state: ${actorInfo.ageAssuranceStatus.status}`,\n 'InvalidInitiation',\n )\n }\n }\n\n const attemptId = crypto.randomUUID()\n const { email, language, countryCode, regionCode } = validateInput(\n input.body,\n )\n\n let externalPayload: string\n try {\n externalPayload = serializeKWSExternalPayloadV2({\n version: KWSExternalPayloadVersion.V2,\n actorDid,\n attemptId,\n countryCode,\n regionCode,\n })\n } catch (err) {\n if (err instanceof KWSExternalPayloadTooLargeError) {\n log.error({ err, actorDid }, err.message)\n throw new InvalidRequestError(\n 'Age Assurance flow failed because DID is too long',\n 'DidTooLong',\n )\n }\n throw err\n }\n\n /*\n * Determine if age assurance config exists for this region. The calling\n * application should already have checked for this, so this is just a\n * safeguard.\n */\n const region = getAgeAssuranceRegionConfig(AGE_ASSURANCE_CONFIG, {\n countryCode,\n regionCode,\n })\n if (!region) {\n const message = 'Age Assurance is not required in this region'\n log.error({ actorDid, countryCode, regionCode }, message)\n throw new InvalidRequestError(message, 'RegionNotSupported')\n }\n\n const location = createLocationString(countryCode, regionCode)\n\n if (KWS_V2_COUNTRIES.has(region.countryCode)) {\n // `age-verified` flow\n await ctx.kwsClient.sendAgeVerifiedFlowEmail({\n location,\n email,\n externalPayload,\n language,\n })\n } else {\n // `adult-verified` flow is what we've been using prior to `age-verified`\n await ctx.kwsClient.sendAdultVerifiedFlowEmail({\n location,\n email,\n externalPayload,\n language,\n })\n }\n\n const event = await createEvent(ctx, actorDid, {\n attemptId,\n email,\n // Assumes `app.set('trust proxy', ...)` configured with `true` or specific values.\n initIp: req.ip,\n initUa: getClientUa(req),\n status: 'pending',\n access: 'unknown',\n countryCode,\n regionCode,\n })\n\n return {\n encoding: 'application/json',\n body: {\n lastInitiatedAt: event.createdAt,\n status: 'pending',\n access: 'unknown',\n },\n }\n },\n })\n}\n\nfunction validateInput({ email, language, ...rest }: InputSchema): InputSchema {\n if (!isEmailValid(email) || isDisposableEmail(email)) {\n throw new InvalidRequestError(\n 'This email address is not supported, please use a different email.',\n 'InvalidEmail',\n )\n }\n\n return {\n email,\n language: KWS_SUPPORTED_LANGUAGES.has(language) ? language : 'en',\n ...rest,\n }\n}\n\nasync function getAgeVerificationState(\n ctx: AppContext,\n actorDid: string,\n): Promise<ActorInfo | undefined> {\n try {\n const res = await ctx.dataplane.getActors({\n dids: [actorDid],\n returnAgeAssuranceForDids: [actorDid],\n skipCacheForDids: [actorDid],\n })\n\n return res.actors[0]\n } catch (err) {\n return undefined\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { AppContext } from '../../../../context';
2
+ import { Server } from '../../../../lexicon';
3
+ export default function (server: Server, ctx: AppContext): void;
4
+ //# sourceMappingURL=getConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getConfig.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/ageassurance/getConfig.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAUvD"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = default_1;
4
+ const const_1 = require("../../../../api/age-assurance/const");
5
+ function default_1(server, ctx) {
6
+ server.app.bsky.ageassurance.getConfig({
7
+ auth: ctx.authVerifier.standardOptional,
8
+ handler: async () => {
9
+ return {
10
+ encoding: 'application/json',
11
+ body: const_1.AGE_ASSURANCE_CONFIG,
12
+ };
13
+ },
14
+ });
15
+ }
16
+ //# sourceMappingURL=getConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getConfig.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/ageassurance/getConfig.ts"],"names":[],"mappings":";;AAIA,4BAUC;AAdD,+DAA0E;AAI1E,mBAAyB,MAAc,EAAE,GAAe;IACtD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;QACrC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,gBAAgB;QACvC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,OAAO;gBACL,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,4BAAoB;aAC3B,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { AGE_ASSURANCE_CONFIG } from '../../../../api/age-assurance/const'\nimport { AppContext } from '../../../../context'\nimport { Server } from '../../../../lexicon'\n\nexport default function (server: Server, ctx: AppContext) {\n server.app.bsky.ageassurance.getConfig({\n auth: ctx.authVerifier.standardOptional,\n handler: async () => {\n return {\n encoding: 'application/json',\n body: AGE_ASSURANCE_CONFIG,\n }\n },\n })\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { AppContext } from '../../../../context';
2
+ import { Server } from '../../../../lexicon';
3
+ export default function (server: Server, ctx: AppContext): void;
4
+ //# sourceMappingURL=getState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getState.d.ts","sourceRoot":"","sources":["../../../../../src/api/app/bsky/ageassurance/getState.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAG5C,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QA0BvD"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = default_1;
4
+ const xrpc_server_1 = require("@atproto/xrpc-server");
5
+ function default_1(server, ctx) {
6
+ server.app.bsky.ageassurance.getState({
7
+ auth: ctx.authVerifier.standard,
8
+ handler: async ({ auth }) => {
9
+ const viewer = auth.credentials.iss;
10
+ const actor = await getActorInfo(ctx, viewer);
11
+ return {
12
+ encoding: 'application/json',
13
+ body: {
14
+ state: {
15
+ lastInitiatedAt: actor.ageAssuranceStatus?.lastInitiatedAt
16
+ ?.toDate()
17
+ .toISOString() || undefined,
18
+ status: actor.ageAssuranceStatus?.status || 'unknown',
19
+ access: actor.ageAssuranceStatus?.access || 'unknown',
20
+ },
21
+ metadata: {
22
+ accountCreatedAt: actor.createdAt?.toDate().toISOString() || undefined,
23
+ },
24
+ },
25
+ };
26
+ },
27
+ });
28
+ }
29
+ const getActorInfo = async (ctx, actorDid) => {
30
+ try {
31
+ const res = await ctx.dataplane.getActors({
32
+ dids: [actorDid],
33
+ returnAgeAssuranceForDids: [actorDid],
34
+ skipCacheForDids: [actorDid],
35
+ });
36
+ return res.actors[0];
37
+ }
38
+ catch (err) {
39
+ throw new xrpc_server_1.UpstreamFailureError('Cannot get current age assurance state', 'GetAgeAssuranceStateFailed', { cause: err });
40
+ }
41
+ };
42
+ //# sourceMappingURL=getState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getState.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/ageassurance/getState.ts"],"names":[],"mappings":";;AAKA,4BA0BC;AA/BD,sDAA2D;AAK3D,mBAAyB,MAAc,EAAE,GAAe;IACtD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;QACpC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,QAAQ;QAC/B,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAA;YACnC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YAE7C,OAAO;gBACL,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE;oBACJ,KAAK,EAAE;wBACL,eAAe,EACb,KAAK,CAAC,kBAAkB,EAAE,eAAe;4BACvC,EAAE,MAAM,EAAE;6BACT,WAAW,EAAE,IAAI,SAAS;wBAC/B,MAAM,EAAE,KAAK,CAAC,kBAAkB,EAAE,MAAM,IAAI,SAAS;wBACrD,MAAM,EAAE,KAAK,CAAC,kBAAkB,EAAE,MAAM,IAAI,SAAS;qBACtD;oBACD,QAAQ,EAAE;wBACR,gBAAgB,EACd,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,IAAI,SAAS;qBACvD;iBACF;aACF,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,YAAY,GAAG,KAAK,EACxB,GAAe,EACf,QAAgB,EACI,EAAE;IACtB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC;YACxC,IAAI,EAAE,CAAC,QAAQ,CAAC;YAChB,yBAAyB,EAAE,CAAC,QAAQ,CAAC;YACrC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;SAC7B,CAAC,CAAA;QAEF,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACtB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,kCAAoB,CAC5B,wCAAwC,EACxC,4BAA4B,EAC5B,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAA;IACH,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { UpstreamFailureError } from '@atproto/xrpc-server'\nimport { AppContext } from '../../../../context'\nimport { Server } from '../../../../lexicon'\nimport { ActorInfo } from '../../../../proto/bsky_pb'\n\nexport default function (server: Server, ctx: AppContext) {\n server.app.bsky.ageassurance.getState({\n auth: ctx.authVerifier.standard,\n handler: async ({ auth }) => {\n const viewer = auth.credentials.iss\n const actor = await getActorInfo(ctx, viewer)\n\n return {\n encoding: 'application/json',\n body: {\n state: {\n lastInitiatedAt:\n actor.ageAssuranceStatus?.lastInitiatedAt\n ?.toDate()\n .toISOString() || undefined,\n status: actor.ageAssuranceStatus?.status || 'unknown',\n access: actor.ageAssuranceStatus?.access || 'unknown',\n },\n metadata: {\n accountCreatedAt:\n actor.createdAt?.toDate().toISOString() || undefined,\n },\n },\n }\n },\n })\n}\n\nconst getActorInfo = async (\n ctx: AppContext,\n actorDid: string,\n): Promise<ActorInfo> => {\n try {\n const res = await ctx.dataplane.getActors({\n dids: [actorDid],\n returnAgeAssuranceForDids: [actorDid],\n skipCacheForDids: [actorDid],\n })\n\n return res.actors[0]\n } catch (err) {\n throw new UpstreamFailureError(\n 'Cannot get current age assurance state',\n 'GetAgeAssuranceStateFailed',\n { cause: err },\n )\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"external.d.ts","sourceRoot":"","sources":["../../src/api/external.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAGvC,eAAO,MAAM,YAAY,GAAI,KAAK,UAAU,KAAG,MAQ9C,CAAA"}
1
+ {"version":3,"file":"external.d.ts","sourceRoot":"","sources":["../../src/api/external.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAIvC,eAAO,MAAM,YAAY,GAAI,KAAK,UAAU,KAAG,MAS9C,CAAA"}
@@ -35,11 +35,13 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.createRouter = void 0;
37
37
  const express_1 = require("express");
38
+ const aaApi = __importStar(require("./age-assurance"));
38
39
  const kwsApi = __importStar(require("./kws"));
39
40
  const createRouter = (ctx) => {
40
41
  const router = (0, express_1.Router)();
41
42
  if (ctx.kwsClient) {
42
43
  router.use('/kws', kwsApi.createRouter(ctx));
44
+ router.use(aaApi.createRouter(ctx));
43
45
  }
44
46
  return router;
45
47
  };
@@ -1 +1 @@
1
- {"version":3,"file":"external.js","sourceRoot":"","sources":["../../src/api/external.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAgC;AAEhC,8CAA+B;AAExB,MAAM,YAAY,GAAG,CAAC,GAAe,EAAU,EAAE;IACtD,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;IAEvB,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;IAC9C,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AARY,QAAA,YAAY,gBAQxB","sourcesContent":["import { Router } from 'express'\nimport { AppContext } from '../context'\nimport * as kwsApi from './kws'\n\nexport const createRouter = (ctx: AppContext): Router => {\n const router = Router()\n\n if (ctx.kwsClient) {\n router.use('/kws', kwsApi.createRouter(ctx))\n }\n\n return router\n}\n"]}
1
+ {"version":3,"file":"external.js","sourceRoot":"","sources":["../../src/api/external.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAgC;AAEhC,uDAAwC;AACxC,8CAA+B;AAExB,MAAM,YAAY,GAAG,CAAC,GAAe,EAAU,EAAE;IACtD,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;IAEvB,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;QAC5C,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;IACrC,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AATY,QAAA,YAAY,gBASxB","sourcesContent":["import { Router } from 'express'\nimport { AppContext } from '../context'\nimport * as aaApi from './age-assurance'\nimport * as kwsApi from './kws'\n\nexport const createRouter = (ctx: AppContext): Router => {\n const router = Router()\n\n if (ctx.kwsClient) {\n router.use('/kws', kwsApi.createRouter(ctx))\n router.use(aaApi.createRouter(ctx))\n }\n\n return router\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AA8EnC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAElC,OAAO,KAAK,SAAS,MAAM,cAAc,CAAA;AAEzC,OAAO,KAAK,YAAY,MAAM,iBAAiB,CAAA;AAE/C,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAA;AAEtC,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,UAgFvD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAiFnC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAElC,OAAO,KAAK,SAAS,MAAM,cAAc,CAAA;AAEzC,OAAO,KAAK,YAAY,MAAM,iBAAiB,CAAA;AAE/C,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAA;AAEtC,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,UAmFvD"}
package/dist/api/index.js CHANGED
@@ -43,6 +43,9 @@ const getProfiles_1 = __importDefault(require("./app/bsky/actor/getProfiles"));
43
43
  const getSuggestions_1 = __importDefault(require("./app/bsky/actor/getSuggestions"));
44
44
  const searchActors_1 = __importDefault(require("./app/bsky/actor/searchActors"));
45
45
  const searchActorsTypeahead_1 = __importDefault(require("./app/bsky/actor/searchActorsTypeahead"));
46
+ const begin_1 = __importDefault(require("./app/bsky/ageassurance/begin"));
47
+ const getConfig_1 = __importDefault(require("./app/bsky/ageassurance/getConfig"));
48
+ const getState_1 = __importDefault(require("./app/bsky/ageassurance/getState"));
46
49
  const createBookmark_1 = __importDefault(require("./app/bsky/bookmark/createBookmark"));
47
50
  const deleteBookmark_1 = __importDefault(require("./app/bsky/bookmark/deleteBookmark"));
48
51
  const getBookmarks_1 = __importDefault(require("./app/bsky/bookmark/getBookmarks"));
@@ -95,7 +98,7 @@ const putPreferencesV2_1 = __importDefault(require("./app/bsky/notification/putP
95
98
  const registerPush_1 = __importDefault(require("./app/bsky/notification/registerPush"));
96
99
  const updateSeen_1 = __importDefault(require("./app/bsky/notification/updateSeen"));
97
100
  const getAgeAssuranceState_1 = __importDefault(require("./app/bsky/unspecced/getAgeAssuranceState"));
98
- const getConfig_1 = __importDefault(require("./app/bsky/unspecced/getConfig"));
101
+ const getConfig_2 = __importDefault(require("./app/bsky/unspecced/getConfig"));
99
102
  const getOnboardingSuggestedStarterPacks_1 = __importDefault(require("./app/bsky/unspecced/getOnboardingSuggestedStarterPacks"));
100
103
  const getPopularFeedGenerators_1 = __importDefault(require("./app/bsky/unspecced/getPopularFeedGenerators"));
101
104
  const getPostThreadOtherV2_1 = __importDefault(require("./app/bsky/unspecced/getPostThreadOtherV2"));
@@ -184,11 +187,14 @@ function default_1(server, ctx) {
184
187
  (0, putPreferences_1.default)(server, ctx);
185
188
  (0, putPreferencesV2_1.default)(server, ctx);
186
189
  (0, registerPush_1.default)(server, ctx);
187
- (0, getConfig_1.default)(server, ctx);
190
+ (0, getConfig_2.default)(server, ctx);
188
191
  (0, getPopularFeedGenerators_1.default)(server, ctx);
189
192
  (0, getTaggedSuggestions_1.default)(server, ctx);
190
193
  (0, getAgeAssuranceState_1.default)(server, ctx);
191
194
  (0, initAgeAssurance_1.default)(server, ctx);
195
+ (0, getConfig_1.default)(server, ctx);
196
+ (0, getState_1.default)(server, ctx);
197
+ (0, begin_1.default)(server, ctx);
192
198
  // com.atproto
193
199
  (0, getSubjectStatus_1.default)(server, ctx);
194
200
  (0, updateSubjectStatus_1.default)(server, ctx);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppContext } from '../context'\nimport { Server } from '../lexicon'\nimport getProfile from './app/bsky/actor/getProfile'\nimport getProfiles from './app/bsky/actor/getProfiles'\nimport getSuggestions from './app/bsky/actor/getSuggestions'\nimport searchActors from './app/bsky/actor/searchActors'\nimport searchActorsTypeahead from './app/bsky/actor/searchActorsTypeahead'\nimport createBookmark from './app/bsky/bookmark/createBookmark'\nimport deleteBookmark from './app/bsky/bookmark/deleteBookmark'\nimport getBookmarks from './app/bsky/bookmark/getBookmarks'\nimport getActorFeeds from './app/bsky/feed/getActorFeeds'\nimport getActorLikes from './app/bsky/feed/getActorLikes'\nimport getAuthorFeed from './app/bsky/feed/getAuthorFeed'\nimport getFeed from './app/bsky/feed/getFeed'\nimport getFeedGenerator from './app/bsky/feed/getFeedGenerator'\nimport getFeedGenerators from './app/bsky/feed/getFeedGenerators'\nimport getLikes from './app/bsky/feed/getLikes'\nimport getListFeed from './app/bsky/feed/getListFeed'\nimport getPostThread from './app/bsky/feed/getPostThread'\nimport getPosts from './app/bsky/feed/getPosts'\nimport getQuotes from './app/bsky/feed/getQuotes'\nimport getRepostedBy from './app/bsky/feed/getRepostedBy'\nimport getSuggestedFeeds from './app/bsky/feed/getSuggestedFeeds'\nimport getTimeline from './app/bsky/feed/getTimeline'\nimport searchPosts from './app/bsky/feed/searchPosts'\nimport getActorStarterPacks from './app/bsky/graph/getActorStarterPacks'\nimport getBlocks from './app/bsky/graph/getBlocks'\nimport getFollowers from './app/bsky/graph/getFollowers'\nimport getFollows from './app/bsky/graph/getFollows'\nimport getKnownFollowers from './app/bsky/graph/getKnownFollowers'\nimport getList from './app/bsky/graph/getList'\nimport getListBlocks from './app/bsky/graph/getListBlocks'\nimport getListMutes from './app/bsky/graph/getListMutes'\nimport getLists from './app/bsky/graph/getLists'\nimport getListsWithMembership from './app/bsky/graph/getListsWithMembership'\nimport getMutes from './app/bsky/graph/getMutes'\nimport getRelationships from './app/bsky/graph/getRelationships'\nimport getStarterPack from './app/bsky/graph/getStarterPack'\nimport getStarterPacks from './app/bsky/graph/getStarterPacks'\nimport getStarterPacksWithMembership from './app/bsky/graph/getStarterPacksWithMembership'\nimport getSuggestedFollowsByActor from './app/bsky/graph/getSuggestedFollowsByActor'\nimport muteActor from './app/bsky/graph/muteActor'\nimport muteActorList from './app/bsky/graph/muteActorList'\nimport muteThread from './app/bsky/graph/muteThread'\nimport searchStarterPacks from './app/bsky/graph/searchStarterPacks'\nimport unmuteActor from './app/bsky/graph/unmuteActor'\nimport unmuteActorList from './app/bsky/graph/unmuteActorList'\nimport unmuteThread from './app/bsky/graph/unmuteThread'\nimport getLabelerServices from './app/bsky/labeler/getServices'\nimport getPreferences from './app/bsky/notification/getPreferences'\nimport getUnreadCount from './app/bsky/notification/getUnreadCount'\nimport listActivitySubscriptions from './app/bsky/notification/listActivitySubscriptions'\nimport listNotifications from './app/bsky/notification/listNotifications'\nimport putActivitySubscription from './app/bsky/notification/putActivitySubscription'\nimport putPreferences from './app/bsky/notification/putPreferences'\nimport putPreferencesV2 from './app/bsky/notification/putPreferencesV2'\nimport registerPush from './app/bsky/notification/registerPush'\nimport updateSeen from './app/bsky/notification/updateSeen'\nimport getAgeAssuranceState from './app/bsky/unspecced/getAgeAssuranceState'\nimport getConfig from './app/bsky/unspecced/getConfig'\nimport getOnboardingSuggestedStarterPacks from './app/bsky/unspecced/getOnboardingSuggestedStarterPacks'\nimport getPopularFeedGenerators from './app/bsky/unspecced/getPopularFeedGenerators'\nimport getPostThreadOtherV2 from './app/bsky/unspecced/getPostThreadOtherV2'\nimport getPostThreadV2 from './app/bsky/unspecced/getPostThreadV2'\nimport getUnspeccedSuggestedFeeds from './app/bsky/unspecced/getSuggestedFeeds'\nimport getSuggestedStarterPacks from './app/bsky/unspecced/getSuggestedStarterPacks'\nimport getSuggestedUsers from './app/bsky/unspecced/getSuggestedUsers'\nimport getTaggedSuggestions from './app/bsky/unspecced/getTaggedSuggestions'\nimport getTrendingTopics from './app/bsky/unspecced/getTrendingTopics'\nimport getTrends from './app/bsky/unspecced/getTrends'\nimport initAgeAssurance from './app/bsky/unspecced/initAgeAssurance'\nimport getAccountInfos from './com/atproto/admin/getAccountInfos'\nimport getSubjectStatus from './com/atproto/admin/getSubjectStatus'\nimport updateSubjectStatus from './com/atproto/admin/updateSubjectStatus'\nimport resolveHandle from './com/atproto/identity/resolveHandle'\nimport queryLabels from './com/atproto/label/queryLabels'\nimport getRecord from './com/atproto/repo/getRecord'\nimport fetchLabels from './com/atproto/temp/fetchLabels'\n\nexport * as health from './health'\n\nexport * as wellKnown from './well-known'\n\nexport * as blobResolver from './blob-resolver'\n\nexport * as external from './external'\n\nexport default function (server: Server, ctx: AppContext) {\n // app.bsky\n getTimeline(server, ctx)\n createBookmark(server, ctx)\n deleteBookmark(server, ctx)\n getBookmarks(server, ctx)\n getActorFeeds(server, ctx)\n getSuggestedFeeds(server, ctx)\n getAuthorFeed(server, ctx)\n getFeed(server, ctx)\n getFeedGenerator(server, ctx)\n getFeedGenerators(server, ctx)\n getLikes(server, ctx)\n getListFeed(server, ctx)\n getQuotes(server, ctx)\n getPostThread(server, ctx)\n getPostThreadOtherV2(server, ctx)\n getPostThreadV2(server, ctx)\n getPosts(server, ctx)\n searchPosts(server, ctx)\n getActorLikes(server, ctx)\n getProfile(server, ctx)\n getProfiles(server, ctx)\n getRepostedBy(server, ctx)\n getActorStarterPacks(server, ctx)\n getBlocks(server, ctx)\n getListBlocks(server, ctx)\n getFollowers(server, ctx)\n getKnownFollowers(server, ctx)\n getFollows(server, ctx)\n getList(server, ctx)\n getLists(server, ctx)\n getListsWithMembership(server, ctx)\n getListMutes(server, ctx)\n getMutes(server, ctx)\n getRelationships(server, ctx)\n getStarterPack(server, ctx)\n getStarterPacks(server, ctx)\n getStarterPacksWithMembership(server, ctx)\n searchStarterPacks(server, ctx)\n muteActor(server, ctx)\n unmuteActor(server, ctx)\n muteActorList(server, ctx)\n unmuteActorList(server, ctx)\n muteThread(server, ctx)\n unmuteThread(server, ctx)\n getSuggestedFollowsByActor(server, ctx)\n getTrendingTopics(server, ctx)\n getTrends(server, ctx)\n getOnboardingSuggestedStarterPacks(server, ctx)\n getSuggestedStarterPacks(server, ctx)\n getSuggestedUsers(server, ctx)\n getUnspeccedSuggestedFeeds(server, ctx)\n getLabelerServices(server, ctx)\n searchActors(server, ctx)\n searchActorsTypeahead(server, ctx)\n getSuggestions(server, ctx)\n getPreferences(server, ctx)\n getUnreadCount(server, ctx)\n listActivitySubscriptions(server, ctx)\n listNotifications(server, ctx)\n putActivitySubscription(server, ctx)\n updateSeen(server, ctx)\n putPreferences(server, ctx)\n putPreferencesV2(server, ctx)\n registerPush(server, ctx)\n getConfig(server, ctx)\n getPopularFeedGenerators(server, ctx)\n getTaggedSuggestions(server, ctx)\n getAgeAssuranceState(server, ctx)\n initAgeAssurance(server, ctx)\n // com.atproto\n getSubjectStatus(server, ctx)\n updateSubjectStatus(server, ctx)\n getAccountInfos(server, ctx)\n resolveHandle(server, ctx)\n getRecord(server, ctx)\n fetchLabels(server, ctx)\n queryLabels(server, ctx)\n return server\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppContext } from '../context'\nimport { Server } from '../lexicon'\nimport getProfile from './app/bsky/actor/getProfile'\nimport getProfiles from './app/bsky/actor/getProfiles'\nimport getSuggestions from './app/bsky/actor/getSuggestions'\nimport searchActors from './app/bsky/actor/searchActors'\nimport searchActorsTypeahead from './app/bsky/actor/searchActorsTypeahead'\nimport aaBegin from './app/bsky/ageassurance/begin'\nimport aaGetConfig from './app/bsky/ageassurance/getConfig'\nimport aaGetState from './app/bsky/ageassurance/getState'\nimport createBookmark from './app/bsky/bookmark/createBookmark'\nimport deleteBookmark from './app/bsky/bookmark/deleteBookmark'\nimport getBookmarks from './app/bsky/bookmark/getBookmarks'\nimport getActorFeeds from './app/bsky/feed/getActorFeeds'\nimport getActorLikes from './app/bsky/feed/getActorLikes'\nimport getAuthorFeed from './app/bsky/feed/getAuthorFeed'\nimport getFeed from './app/bsky/feed/getFeed'\nimport getFeedGenerator from './app/bsky/feed/getFeedGenerator'\nimport getFeedGenerators from './app/bsky/feed/getFeedGenerators'\nimport getLikes from './app/bsky/feed/getLikes'\nimport getListFeed from './app/bsky/feed/getListFeed'\nimport getPostThread from './app/bsky/feed/getPostThread'\nimport getPosts from './app/bsky/feed/getPosts'\nimport getQuotes from './app/bsky/feed/getQuotes'\nimport getRepostedBy from './app/bsky/feed/getRepostedBy'\nimport getSuggestedFeeds from './app/bsky/feed/getSuggestedFeeds'\nimport getTimeline from './app/bsky/feed/getTimeline'\nimport searchPosts from './app/bsky/feed/searchPosts'\nimport getActorStarterPacks from './app/bsky/graph/getActorStarterPacks'\nimport getBlocks from './app/bsky/graph/getBlocks'\nimport getFollowers from './app/bsky/graph/getFollowers'\nimport getFollows from './app/bsky/graph/getFollows'\nimport getKnownFollowers from './app/bsky/graph/getKnownFollowers'\nimport getList from './app/bsky/graph/getList'\nimport getListBlocks from './app/bsky/graph/getListBlocks'\nimport getListMutes from './app/bsky/graph/getListMutes'\nimport getLists from './app/bsky/graph/getLists'\nimport getListsWithMembership from './app/bsky/graph/getListsWithMembership'\nimport getMutes from './app/bsky/graph/getMutes'\nimport getRelationships from './app/bsky/graph/getRelationships'\nimport getStarterPack from './app/bsky/graph/getStarterPack'\nimport getStarterPacks from './app/bsky/graph/getStarterPacks'\nimport getStarterPacksWithMembership from './app/bsky/graph/getStarterPacksWithMembership'\nimport getSuggestedFollowsByActor from './app/bsky/graph/getSuggestedFollowsByActor'\nimport muteActor from './app/bsky/graph/muteActor'\nimport muteActorList from './app/bsky/graph/muteActorList'\nimport muteThread from './app/bsky/graph/muteThread'\nimport searchStarterPacks from './app/bsky/graph/searchStarterPacks'\nimport unmuteActor from './app/bsky/graph/unmuteActor'\nimport unmuteActorList from './app/bsky/graph/unmuteActorList'\nimport unmuteThread from './app/bsky/graph/unmuteThread'\nimport getLabelerServices from './app/bsky/labeler/getServices'\nimport getPreferences from './app/bsky/notification/getPreferences'\nimport getUnreadCount from './app/bsky/notification/getUnreadCount'\nimport listActivitySubscriptions from './app/bsky/notification/listActivitySubscriptions'\nimport listNotifications from './app/bsky/notification/listNotifications'\nimport putActivitySubscription from './app/bsky/notification/putActivitySubscription'\nimport putPreferences from './app/bsky/notification/putPreferences'\nimport putPreferencesV2 from './app/bsky/notification/putPreferencesV2'\nimport registerPush from './app/bsky/notification/registerPush'\nimport updateSeen from './app/bsky/notification/updateSeen'\nimport getAgeAssuranceState from './app/bsky/unspecced/getAgeAssuranceState'\nimport getConfig from './app/bsky/unspecced/getConfig'\nimport getOnboardingSuggestedStarterPacks from './app/bsky/unspecced/getOnboardingSuggestedStarterPacks'\nimport getPopularFeedGenerators from './app/bsky/unspecced/getPopularFeedGenerators'\nimport getPostThreadOtherV2 from './app/bsky/unspecced/getPostThreadOtherV2'\nimport getPostThreadV2 from './app/bsky/unspecced/getPostThreadV2'\nimport getUnspeccedSuggestedFeeds from './app/bsky/unspecced/getSuggestedFeeds'\nimport getSuggestedStarterPacks from './app/bsky/unspecced/getSuggestedStarterPacks'\nimport getSuggestedUsers from './app/bsky/unspecced/getSuggestedUsers'\nimport getTaggedSuggestions from './app/bsky/unspecced/getTaggedSuggestions'\nimport getTrendingTopics from './app/bsky/unspecced/getTrendingTopics'\nimport getTrends from './app/bsky/unspecced/getTrends'\nimport initAgeAssurance from './app/bsky/unspecced/initAgeAssurance'\nimport getAccountInfos from './com/atproto/admin/getAccountInfos'\nimport getSubjectStatus from './com/atproto/admin/getSubjectStatus'\nimport updateSubjectStatus from './com/atproto/admin/updateSubjectStatus'\nimport resolveHandle from './com/atproto/identity/resolveHandle'\nimport queryLabels from './com/atproto/label/queryLabels'\nimport getRecord from './com/atproto/repo/getRecord'\nimport fetchLabels from './com/atproto/temp/fetchLabels'\n\nexport * as health from './health'\n\nexport * as wellKnown from './well-known'\n\nexport * as blobResolver from './blob-resolver'\n\nexport * as external from './external'\n\nexport default function (server: Server, ctx: AppContext) {\n // app.bsky\n getTimeline(server, ctx)\n createBookmark(server, ctx)\n deleteBookmark(server, ctx)\n getBookmarks(server, ctx)\n getActorFeeds(server, ctx)\n getSuggestedFeeds(server, ctx)\n getAuthorFeed(server, ctx)\n getFeed(server, ctx)\n getFeedGenerator(server, ctx)\n getFeedGenerators(server, ctx)\n getLikes(server, ctx)\n getListFeed(server, ctx)\n getQuotes(server, ctx)\n getPostThread(server, ctx)\n getPostThreadOtherV2(server, ctx)\n getPostThreadV2(server, ctx)\n getPosts(server, ctx)\n searchPosts(server, ctx)\n getActorLikes(server, ctx)\n getProfile(server, ctx)\n getProfiles(server, ctx)\n getRepostedBy(server, ctx)\n getActorStarterPacks(server, ctx)\n getBlocks(server, ctx)\n getListBlocks(server, ctx)\n getFollowers(server, ctx)\n getKnownFollowers(server, ctx)\n getFollows(server, ctx)\n getList(server, ctx)\n getLists(server, ctx)\n getListsWithMembership(server, ctx)\n getListMutes(server, ctx)\n getMutes(server, ctx)\n getRelationships(server, ctx)\n getStarterPack(server, ctx)\n getStarterPacks(server, ctx)\n getStarterPacksWithMembership(server, ctx)\n searchStarterPacks(server, ctx)\n muteActor(server, ctx)\n unmuteActor(server, ctx)\n muteActorList(server, ctx)\n unmuteActorList(server, ctx)\n muteThread(server, ctx)\n unmuteThread(server, ctx)\n getSuggestedFollowsByActor(server, ctx)\n getTrendingTopics(server, ctx)\n getTrends(server, ctx)\n getOnboardingSuggestedStarterPacks(server, ctx)\n getSuggestedStarterPacks(server, ctx)\n getSuggestedUsers(server, ctx)\n getUnspeccedSuggestedFeeds(server, ctx)\n getLabelerServices(server, ctx)\n searchActors(server, ctx)\n searchActorsTypeahead(server, ctx)\n getSuggestions(server, ctx)\n getPreferences(server, ctx)\n getUnreadCount(server, ctx)\n listActivitySubscriptions(server, ctx)\n listNotifications(server, ctx)\n putActivitySubscription(server, ctx)\n updateSeen(server, ctx)\n putPreferences(server, ctx)\n putPreferencesV2(server, ctx)\n registerPush(server, ctx)\n getConfig(server, ctx)\n getPopularFeedGenerators(server, ctx)\n getTaggedSuggestions(server, ctx)\n getAgeAssuranceState(server, ctx)\n initAgeAssurance(server, ctx)\n aaGetConfig(server, ctx)\n aaGetState(server, ctx)\n aaBegin(server, ctx)\n // com.atproto\n getSubjectStatus(server, ctx)\n updateSubjectStatus(server, ctx)\n getAccountInfos(server, ctx)\n resolveHandle(server, ctx)\n getRecord(server, ctx)\n fetchLabels(server, ctx)\n queryLabels(server, ctx)\n return server\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/api/kws/api.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAEjD,OAAO,EACL,uBAAuB,EAIxB,MAAM,SAAS,CAAA;AAsChB,eAAO,MAAM,mBAAmB,GAC7B,KAAK,uBAAuB,KAAG,cA6C/B,CAAA"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/api/kws/api.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AASjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAmCjD,eAAO,MAAM,mBAAmB,GAC7B,KAAK,uBAAuB,KAAG,cAmE/B,CAAA"}
@@ -2,47 +2,65 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.verificationHandler = void 0;
4
4
  const logger_1 = require("../../logger");
5
- const types_1 = require("./types");
6
- const util_1 = require("./util");
7
- const validateRequest = (ctx, req) => {
5
+ const const_1 = require("../age-assurance/const");
6
+ const external_payload_1 = require("../age-assurance/kws/external-payload");
7
+ const stash_1 = require("../age-assurance/stash");
8
+ const util_1 = require("../age-assurance/util");
9
+ const util_2 = require("./util");
10
+ function parseQueryParams(ctx, req) {
8
11
  try {
9
- const intermediate = types_1.verificationIntermediateQuerySchema.parse({
10
- externalPayload: req.query.externalPayload,
11
- signature: req.query.signature,
12
- status: req.query.status,
13
- });
14
- const data = `${intermediate.status}:${intermediate.externalPayload}`;
15
- (0, util_1.validateSignature)(ctx.cfg.kws.verificationSecret, data, intermediate.signature);
12
+ const status = String(req.query.status);
13
+ const externalPayload = String(req.query.externalPayload);
14
+ const signature = String(req.query.signature);
15
+ (0, util_2.validateSignature)(ctx.cfg.kws.verificationSecret, `${status}:${externalPayload}`, signature);
16
16
  return {
17
- ...intermediate,
18
- externalPayload: (0, util_1.parseExternalPayload)(intermediate.externalPayload),
19
- status: (0, util_1.parseStatus)(intermediate.status),
17
+ status,
18
+ externalPayload,
20
19
  };
21
20
  }
22
21
  catch (err) {
23
22
  throw new Error('Invalid KWS API request', { cause: err });
24
23
  }
25
- };
24
+ }
26
25
  const verificationHandler = (ctx) => async (req, res) => {
27
26
  let actorDid;
28
27
  try {
29
- const query = validateRequest(ctx, req);
30
- const { externalPayload, status: { verified }, } = query;
28
+ const query = parseQueryParams(ctx, req);
29
+ const { verified } = (0, util_2.parseStatus)(query.status);
31
30
  if (!verified) {
32
31
  throw new Error('Unexpected KWS verification response call with unverified status');
33
32
  }
34
- const { actorDid: externalPayloadActorDid, attemptId } = externalPayload;
35
- actorDid = externalPayloadActorDid;
36
33
  // Assumes `app.set('trust proxy', ...)` configured with `true` or specific values.
37
34
  const completeIp = req.ip;
38
- const completeUa = (0, util_1.getClientUa)(req);
39
- await (0, util_1.createStashEvent)(ctx, {
40
- actorDid,
41
- attemptId,
42
- completeIp,
43
- completeUa,
44
- status: 'assured',
45
- });
35
+ const completeUa = (0, util_2.getClientUa)(req);
36
+ const externalPayload = (0, external_payload_1.parseKWSExternalPayloadV1WithV2Compat)(query.externalPayload);
37
+ actorDid = externalPayload.actorDid;
38
+ if (externalPayload.version === external_payload_1.KWSExternalPayloadVersion.V2) {
39
+ const { countryCode, regionCode, attemptId } = externalPayload;
40
+ const { access } = (0, util_1.computeAgeAssuranceAccessOrThrow)(const_1.AGE_ASSURANCE_CONFIG, {
41
+ countryCode: countryCode,
42
+ regionCode: regionCode,
43
+ verifiedMinimumAge: 18, // `adult-verified` is 18+ only
44
+ });
45
+ await (0, stash_1.createEvent)(ctx, actorDid, {
46
+ attemptId,
47
+ status: 'assured',
48
+ access,
49
+ countryCode,
50
+ regionCode,
51
+ completeIp,
52
+ completeUa,
53
+ });
54
+ }
55
+ else {
56
+ await (0, util_2.createStashEvent)(ctx, {
57
+ actorDid,
58
+ attemptId: externalPayload.attemptId,
59
+ status: 'assured',
60
+ completeIp,
61
+ completeUa,
62
+ });
63
+ }
46
64
  return res
47
65
  .status(302)
48
66
  .setHeader('Location', `${ctx.cfg.kws.redirectUrl}?${new URLSearchParams({ actorDid, result: 'success' })}`)
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/api/kws/api.ts"],"names":[],"mappings":";;;AACA,yCAAgD;AAChD,mCAKgB;AAChB,iCAMe;AAEf,MAAM,eAAe,GAAG,CACtB,GAA4B,EAC5B,GAAoB,EACE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,YAAY,GAChB,2CAAmC,CAAC,KAAK,CAAC;YACxC,eAAe,EAAE,GAAG,CAAC,KAAK,CAAC,eAAe;YAC1C,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS;YAC9B,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM;SACzB,CAAC,CAAA;QAEJ,MAAM,IAAI,GAAG,GAAG,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,CAAA;QACrE,IAAA,wBAAiB,EACf,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAC9B,IAAI,EACJ,YAAY,CAAC,SAAS,CACvB,CAAA;QAED,OAAO;YACL,GAAG,YAAY;YACf,eAAe,EAAE,IAAA,2BAAoB,EAAC,YAAY,CAAC,eAAe,CAAC;YACnE,MAAM,EAAE,IAAA,kBAAW,EAAC,YAAY,CAAC,MAAM,CAAC;SACzC,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC5D,CAAC;AACH,CAAC,CAAA;AAEM,MAAM,mBAAmB,GAC9B,CAAC,GAA4B,EAAkB,EAAE,CACjD,KAAK,EAAE,GAAoB,EAAE,GAAqB,EAAE,EAAE;IACpD,IAAI,QAA4B,CAAA;IAChC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QACvC,MAAM,EACJ,eAAe,EACf,MAAM,EAAE,EAAE,QAAQ,EAAE,GACrB,GAAG,KAAK,CAAA;QACT,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAA;QACH,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,uBAAuB,EAAE,SAAS,EAAE,GAAG,eAAe,CAAA;QACxE,QAAQ,GAAG,uBAAuB,CAAA;QAClC,mFAAmF;QACnF,MAAM,UAAU,GAAG,GAAG,CAAC,EAAE,CAAA;QACzB,MAAM,UAAU,GAAG,IAAA,kBAAW,EAAC,GAAG,CAAC,CAAA;QACnC,MAAM,IAAA,uBAAgB,EAAC,GAAG,EAAE;YAC1B,QAAQ;YACR,SAAS;YACT,UAAU;YACV,UAAU;YACV,MAAM,EAAE,SAAS;SAClB,CAAC,CAAA;QACF,OAAO,GAAG;aACP,MAAM,CAAC,GAAG,CAAC;aACX,SAAS,CACR,UAAU,EACV,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CACrF;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,mBAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,4CAA4C,CAAC,CAAA;QAEhE,OAAO,GAAG;aACP,MAAM,CAAC,GAAG,CAAC;aACX,SAAS,CACR,UAAU,EACV,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,eAAe,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAC9G;aACA,GAAG,EAAE,CAAA;IACV,CAAC;AACH,CAAC,CAAA;AA9CU,QAAA,mBAAmB,uBA8C7B","sourcesContent":["import express, { RequestHandler } from 'express'\nimport { httpLogger as log } from '../../logger'\nimport {\n AppContextWithKwsClient,\n KwsVerificationIntermediateQuery,\n KwsVerificationQuery,\n verificationIntermediateQuerySchema,\n} from './types'\nimport {\n createStashEvent,\n getClientUa,\n parseExternalPayload,\n parseStatus,\n validateSignature,\n} from './util'\n\nconst validateRequest = (\n ctx: AppContextWithKwsClient,\n req: express.Request,\n): KwsVerificationQuery => {\n try {\n const intermediate: KwsVerificationIntermediateQuery =\n verificationIntermediateQuerySchema.parse({\n externalPayload: req.query.externalPayload,\n signature: req.query.signature,\n status: req.query.status,\n })\n\n const data = `${intermediate.status}:${intermediate.externalPayload}`\n validateSignature(\n ctx.cfg.kws.verificationSecret,\n data,\n intermediate.signature,\n )\n\n return {\n ...intermediate,\n externalPayload: parseExternalPayload(intermediate.externalPayload),\n status: parseStatus(intermediate.status),\n }\n } catch (err) {\n throw new Error('Invalid KWS API request', { cause: err })\n }\n}\n\nexport const verificationHandler =\n (ctx: AppContextWithKwsClient): RequestHandler =>\n async (req: express.Request, res: express.Response) => {\n let actorDid: string | undefined\n try {\n const query = validateRequest(ctx, req)\n const {\n externalPayload,\n status: { verified },\n } = query\n if (!verified) {\n throw new Error(\n 'Unexpected KWS verification response call with unverified status',\n )\n }\n\n const { actorDid: externalPayloadActorDid, attemptId } = externalPayload\n actorDid = externalPayloadActorDid\n // Assumes `app.set('trust proxy', ...)` configured with `true` or specific values.\n const completeIp = req.ip\n const completeUa = getClientUa(req)\n await createStashEvent(ctx, {\n actorDid,\n attemptId,\n completeIp,\n completeUa,\n status: 'assured',\n })\n return res\n .status(302)\n .setHeader(\n 'Location',\n `${ctx.cfg.kws.redirectUrl}?${new URLSearchParams({ actorDid, result: 'success' })}`,\n )\n .end()\n } catch (err) {\n log.error({ err }, 'Failed to handle KWS verification response')\n\n return res\n .status(302)\n .setHeader(\n 'Location',\n `${ctx.cfg.kws.redirectUrl}?${new URLSearchParams({ ...(actorDid ? { actorDid } : {}), result: 'unknown' })}`,\n )\n .end()\n }\n }\n"]}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/api/kws/api.ts"],"names":[],"mappings":"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","sourcesContent":["import express, { RequestHandler } from 'express'\nimport { httpLogger as log } from '../../logger'\nimport { AGE_ASSURANCE_CONFIG } from '../age-assurance/const'\nimport {\n KWSExternalPayloadVersion,\n parseKWSExternalPayloadV1WithV2Compat,\n} from '../age-assurance/kws/external-payload'\nimport { createEvent } from '../age-assurance/stash'\nimport { computeAgeAssuranceAccessOrThrow } from '../age-assurance/util'\nimport { AppContextWithKwsClient } from './types'\nimport {\n createStashEvent,\n getClientUa,\n parseStatus,\n validateSignature,\n} from './util'\n\nfunction parseQueryParams(\n ctx: AppContextWithKwsClient,\n req: express.Request,\n): {\n status: string\n externalPayload: string\n} {\n try {\n const status = String(req.query.status)\n const externalPayload = String(req.query.externalPayload)\n const signature = String(req.query.signature)\n\n validateSignature(\n ctx.cfg.kws.verificationSecret,\n `${status}:${externalPayload}`,\n signature,\n )\n\n return {\n status,\n externalPayload,\n }\n } catch (err) {\n throw new Error('Invalid KWS API request', { cause: err })\n }\n}\n\nexport const verificationHandler =\n (ctx: AppContextWithKwsClient): RequestHandler =>\n async (req: express.Request, res: express.Response) => {\n let actorDid: string | undefined\n try {\n const query = parseQueryParams(ctx, req)\n const { verified } = parseStatus(query.status)\n if (!verified) {\n throw new Error(\n 'Unexpected KWS verification response call with unverified status',\n )\n }\n\n // Assumes `app.set('trust proxy', ...)` configured with `true` or specific values.\n const completeIp = req.ip\n const completeUa = getClientUa(req)\n const externalPayload = parseKWSExternalPayloadV1WithV2Compat(\n query.externalPayload,\n )\n actorDid = externalPayload.actorDid\n\n if (externalPayload.version === KWSExternalPayloadVersion.V2) {\n const { countryCode, regionCode, attemptId } = externalPayload\n const { access } = computeAgeAssuranceAccessOrThrow(\n AGE_ASSURANCE_CONFIG,\n {\n countryCode: countryCode,\n regionCode: regionCode,\n verifiedMinimumAge: 18, // `adult-verified` is 18+ only\n },\n )\n await createEvent(ctx, actorDid, {\n attemptId,\n status: 'assured',\n access,\n countryCode,\n regionCode,\n completeIp,\n completeUa,\n })\n } else {\n await createStashEvent(ctx, {\n actorDid,\n attemptId: externalPayload.attemptId,\n status: 'assured',\n completeIp,\n completeUa,\n })\n }\n\n return res\n .status(302)\n .setHeader(\n 'Location',\n `${ctx.cfg.kws.redirectUrl}?${new URLSearchParams({ actorDid, result: 'success' })}`,\n )\n .end()\n } catch (err) {\n log.error({ err }, 'Failed to handle KWS verification response')\n\n return res\n .status(302)\n .setHeader(\n 'Location',\n `${ctx.cfg.kws.redirectUrl}?${new URLSearchParams({ ...(actorDid ? { actorDid } : {}), result: 'unknown' })}`,\n )\n .end()\n }\n }\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/kws/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAO,MAAM,SAAS,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAK1C,eAAO,MAAM,YAAY,GAAI,KAAK,UAAU,KAAG,MAQ9C,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/kws/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAO,MAAM,SAAS,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAK1C,eAAO,MAAM,YAAY,GAAI,KAAK,UAAU,KAAG,MAc9C,CAAA"}
@@ -8,7 +8,9 @@ const createRouter = (ctx) => {
8
8
  assertAppContextWithAgeAssuranceClient(ctx);
9
9
  const router = (0, express_1.Router)();
10
10
  router.use((0, express_1.raw)({ type: 'application/json' }));
11
- router.post('/age-assurance-webhook', (0, webhook_1.webhookAuth)(ctx), (0, webhook_1.webhookHandler)(ctx));
11
+ router.post('/age-assurance-webhook', (0, webhook_1.webhookAuth)({
12
+ secret: ctx.cfg.kws.webhookSecret,
13
+ }), (0, webhook_1.webhookHandler)(ctx));
12
14
  router.get('/age-assurance-verification', (0, api_1.verificationHandler)(ctx));
13
15
  return router;
14
16
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/kws/index.ts"],"names":[],"mappings":";;;AAAA,qCAAqC;AAErC,+BAA2C;AAE3C,uCAAuD;AAEhD,MAAM,YAAY,GAAG,CAAC,GAAe,EAAU,EAAE;IACtD,sCAAsC,CAAC,GAAG,CAAC,CAAA;IAE3C,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;IACvB,MAAM,CAAC,GAAG,CAAC,IAAA,aAAG,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAA;IAC7C,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,IAAA,qBAAW,EAAC,GAAG,CAAC,EAAE,IAAA,wBAAc,EAAC,GAAG,CAAC,CAAC,CAAA;IAC5E,MAAM,CAAC,GAAG,CAAC,6BAA6B,EAAE,IAAA,yBAAmB,EAAC,GAAG,CAAC,CAAC,CAAA;IACnE,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AARY,QAAA,YAAY,gBAQxB;AAED,MAAM,sCAAsC,GAEE,CAAC,GAAe,EAAE,EAAE;IAChE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;IAC7E,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { Router, raw } from 'express'\nimport { AppContext } from '../../context'\nimport { verificationHandler } from './api'\nimport { AppContextWithKwsClient } from './types'\nimport { webhookAuth, webhookHandler } from './webhook'\n\nexport const createRouter = (ctx: AppContext): Router => {\n assertAppContextWithAgeAssuranceClient(ctx)\n\n const router = Router()\n router.use(raw({ type: 'application/json' }))\n router.post('/age-assurance-webhook', webhookAuth(ctx), webhookHandler(ctx))\n router.get('/age-assurance-verification', verificationHandler(ctx))\n return router\n}\n\nconst assertAppContextWithAgeAssuranceClient: (\n ctx: AppContext,\n) => asserts ctx is AppContextWithKwsClient = (ctx: AppContext) => {\n if (!ctx.kwsClient) {\n throw new Error('Tried to set up KWS router without kwsClient configured.')\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/kws/index.ts"],"names":[],"mappings":";;;AAAA,qCAAqC;AAErC,+BAA2C;AAE3C,uCAAuD;AAEhD,MAAM,YAAY,GAAG,CAAC,GAAe,EAAU,EAAE;IACtD,sCAAsC,CAAC,GAAG,CAAC,CAAA;IAE3C,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;IACvB,MAAM,CAAC,GAAG,CAAC,IAAA,aAAG,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAA;IAC7C,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,IAAA,qBAAW,EAAC;QACV,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa;KAClC,CAAC,EACF,IAAA,wBAAc,EAAC,GAAG,CAAC,CACpB,CAAA;IACD,MAAM,CAAC,GAAG,CAAC,6BAA6B,EAAE,IAAA,yBAAmB,EAAC,GAAG,CAAC,CAAC,CAAA;IACnE,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAdY,QAAA,YAAY,gBAcxB;AAED,MAAM,sCAAsC,GAEE,CAAC,GAAe,EAAE,EAAE;IAChE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;IAC7E,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { Router, raw } from 'express'\nimport { AppContext } from '../../context'\nimport { verificationHandler } from './api'\nimport { AppContextWithKwsClient } from './types'\nimport { webhookAuth, webhookHandler } from './webhook'\n\nexport const createRouter = (ctx: AppContext): Router => {\n assertAppContextWithAgeAssuranceClient(ctx)\n\n const router = Router()\n router.use(raw({ type: 'application/json' }))\n router.post(\n '/age-assurance-webhook',\n webhookAuth({\n secret: ctx.cfg.kws.webhookSecret,\n }),\n webhookHandler(ctx),\n )\n router.get('/age-assurance-verification', verificationHandler(ctx))\n return router\n}\n\nconst assertAppContextWithAgeAssuranceClient: (\n ctx: AppContext,\n) => asserts ctx is AppContextWithKwsClient = (ctx: AppContext) => {\n if (!ctx.kwsClient) {\n throw new Error('Tried to set up KWS router without kwsClient configured.')\n }\n}\n"]}
@@ -1,5 +1,7 @@
1
1
  import { RequestHandler } from 'express';
2
2
  import { AppContextWithKwsClient } from './types';
3
- export declare const webhookAuth: (ctx: AppContextWithKwsClient) => RequestHandler;
3
+ export declare const webhookAuth: ({ secret }: {
4
+ secret: string;
5
+ }) => RequestHandler;
4
6
  export declare const webhookHandler: (ctx: AppContextWithKwsClient) => RequestHandler;
5
7
  //# sourceMappingURL=webhook.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../../src/api/kws/webhook.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAEjD,OAAO,EACL,uBAAuB,EAGxB,MAAM,SAAS,CAAA;AAQhB,eAAO,MAAM,WAAW,GACrB,KAAK,uBAAuB,KAAG,cA8B/B,CAAA;AA4BH,eAAO,MAAM,cAAc,GACxB,KAAK,uBAAuB,KAAG,cAgC/B,CAAA"}
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../../src/api/kws/webhook.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AASjD,OAAO,EACL,uBAAuB,EAGxB,MAAM,SAAS,CAAA;AAGhB,eAAO,MAAM,WAAW,GACrB,YAAY;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,KAAG,cA8BjC,CAAA;AAiBH,eAAO,MAAM,cAAc,GACxB,KAAK,uBAAuB,KAAG,cAgE/B,CAAA"}