@knpkv/codecommit-web 0.11.4 → 0.14.0

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 (94) hide show
  1. package/dist/client/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
  2. package/dist/client/assets/index-DQUoxciG.js +90 -0
  3. package/dist/client/assets/index-NJaNHeOS.css +1 -0
  4. package/dist/client/assets/pr-review-workspace-C0TVEp1y.js +22 -0
  5. package/dist/client/assets/pr-review-workspace-mH4SV5xO.css +1 -0
  6. package/dist/client/index.html +2 -2
  7. package/dist/main.js +9 -3
  8. package/dist/main.js.map +1 -1
  9. package/dist/server/Api.d.ts +1333 -114
  10. package/dist/server/Api.d.ts.map +1 -1
  11. package/dist/server/Api.js +251 -6
  12. package/dist/server/Api.js.map +1 -1
  13. package/dist/server/Server.d.ts +13 -7
  14. package/dist/server/Server.d.ts.map +1 -1
  15. package/dist/server/Server.js +45 -13
  16. package/dist/server/Server.js.map +1 -1
  17. package/dist/server/handlers/accounts-live.d.ts +1 -1
  18. package/dist/server/handlers/accounts-live.d.ts.map +1 -1
  19. package/dist/server/handlers/audit-live.d.ts +1 -1
  20. package/dist/server/handlers/audit-live.d.ts.map +1 -1
  21. package/dist/server/handlers/config-live.d.ts +9 -1
  22. package/dist/server/handlers/config-live.d.ts.map +1 -1
  23. package/dist/server/handlers/config-live.js +33 -10
  24. package/dist/server/handlers/config-live.js.map +1 -1
  25. package/dist/server/handlers/events-live.d.ts +1 -1
  26. package/dist/server/handlers/events-live.d.ts.map +1 -1
  27. package/dist/server/handlers/notifications-live.d.ts +1 -1
  28. package/dist/server/handlers/notifications-live.d.ts.map +1 -1
  29. package/dist/server/handlers/notifications-live.js +3 -3
  30. package/dist/server/handlers/notifications-live.js.map +1 -1
  31. package/dist/server/handlers/permissions-live.d.ts +1 -1
  32. package/dist/server/handlers/permissions-live.d.ts.map +1 -1
  33. package/dist/server/handlers/prs-live.d.ts +79 -2
  34. package/dist/server/handlers/prs-live.d.ts.map +1 -1
  35. package/dist/server/handlers/prs-live.js +117 -7
  36. package/dist/server/handlers/prs-live.js.map +1 -1
  37. package/dist/server/handlers/sandbox-live.d.ts +1 -1
  38. package/dist/server/handlers/sandbox-live.d.ts.map +1 -1
  39. package/dist/server/handlers/sandbox-live.js +5 -1
  40. package/dist/server/handlers/sandbox-live.js.map +1 -1
  41. package/dist/server/handlers/stats-live.d.ts +1 -1
  42. package/dist/server/handlers/stats-live.d.ts.map +1 -1
  43. package/dist/server/handlers/subscriptions-live.d.ts +1 -1
  44. package/dist/server/handlers/subscriptions-live.d.ts.map +1 -1
  45. package/dist/server/internal/BackgroundWorkers.d.ts +1 -1
  46. package/dist/server/internal/BackgroundWorkers.d.ts.map +1 -1
  47. package/dist/server/internal/BackgroundWorkers.js +43 -5
  48. package/dist/server/internal/BackgroundWorkers.js.map +1 -1
  49. package/dist/server/internal/OwnerSessionSecurity.d.ts +46 -0
  50. package/dist/server/internal/OwnerSessionSecurity.d.ts.map +1 -0
  51. package/dist/server/internal/OwnerSessionSecurity.js +143 -0
  52. package/dist/server/internal/OwnerSessionSecurity.js.map +1 -0
  53. package/dist/server/internal/PermissionedReadClient.d.ts +27 -0
  54. package/dist/server/internal/PermissionedReadClient.d.ts.map +1 -0
  55. package/dist/server/internal/PermissionedReadClient.js +132 -0
  56. package/dist/server/internal/PermissionedReadClient.js.map +1 -0
  57. package/dist/server/review/PullRequestReview.d.ts +394 -0
  58. package/dist/server/review/PullRequestReview.d.ts.map +1 -0
  59. package/dist/server/review/PullRequestReview.js +714 -0
  60. package/dist/server/review/PullRequestReview.js.map +1 -0
  61. package/dist/server/review/RelayFindingPublisher.d.ts +39 -0
  62. package/dist/server/review/RelayFindingPublisher.d.ts.map +1 -0
  63. package/dist/server/review/RelayFindingPublisher.js +78 -0
  64. package/dist/server/review/RelayFindingPublisher.js.map +1 -0
  65. package/dist/server/review/ReviewPromptBudget.d.ts +10 -0
  66. package/dist/server/review/ReviewPromptBudget.d.ts.map +1 -0
  67. package/dist/server/review/ReviewPromptBudget.js +11 -0
  68. package/dist/server/review/ReviewPromptBudget.js.map +1 -0
  69. package/dist/server/review/ReviewSkillCatalog.d.ts +34 -0
  70. package/dist/server/review/ReviewSkillCatalog.d.ts.map +1 -0
  71. package/dist/server/review/ReviewSkillCatalog.js +204 -0
  72. package/dist/server/review/ReviewSkillCatalog.js.map +1 -0
  73. package/dist/tooling/authenticated-dev-proxy.d.ts +15 -0
  74. package/dist/tooling/authenticated-dev-proxy.d.ts.map +1 -0
  75. package/dist/tooling/authenticated-dev-proxy.js +19 -0
  76. package/dist/tooling/authenticated-dev-proxy.js.map +1 -0
  77. package/dist/tooling/authenticated-dev-proxy.test.d.ts +2 -0
  78. package/dist/tooling/authenticated-dev-proxy.test.d.ts.map +1 -0
  79. package/dist/tooling/authenticated-dev-proxy.test.js +26 -0
  80. package/dist/tooling/authenticated-dev-proxy.test.js.map +1 -0
  81. package/dist/tooling/production-prototype-boundary.d.ts.map +1 -1
  82. package/package.json +31 -24
  83. package/dist/client/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  84. package/dist/client/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  85. package/dist/client/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  86. package/dist/client/assets/geist-mono-cyrillic-ext-wght-normal-I4S5GZfc.woff2 +0 -0
  87. package/dist/client/assets/geist-mono-cyrillic-wght-normal-BmXc_FBt.woff2 +0 -0
  88. package/dist/client/assets/geist-mono-latin-ext-wght-normal-DrnZ1wKl.woff2 +0 -0
  89. package/dist/client/assets/geist-mono-latin-wght-normal-B_7UjwxQ.woff2 +0 -0
  90. package/dist/client/assets/geist-mono-symbols2-wght-normal-GZpp1pK2.woff2 +0 -0
  91. package/dist/client/assets/geist-mono-vietnamese-wght-normal-D8KDMBhC.woff2 +0 -0
  92. package/dist/client/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  93. package/dist/client/assets/index-DHUFjL8d.css +0 -1
  94. package/dist/client/assets/index-DvOqBYkk.js +0 -90
@@ -0,0 +1,143 @@
1
+ import { Clock, Context, Crypto, Effect, Layer, Redacted, Ref, Schema } from "effect";
2
+ import { HttpRouter, HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
3
+ import { ForbiddenApiError, OwnerSessionAuth, UnauthorizedApiError } from "../Api.js";
4
+ export class OwnerSessionSecrets extends Context.Service()("@knpkv/codecommit-web/OwnerSessionSecrets") {
5
+ }
6
+ export class UnsafeServerHostnameError extends Schema.TaggedError()("UnsafeServerHostnameError", { hostname: Schema.String, message: Schema.String }) {
7
+ }
8
+ const safeMethods = new Set(["GET", "HEAD", "OPTIONS"]);
9
+ export const isLoopbackHostname = (hostname) => hostname === "127.0.0.1" || hostname === "localhost" || hostname === "::1" || hostname === "[::1]";
10
+ export const requireLoopbackHostname = Effect.fn("OwnerSessionSecurity.requireLoopbackHostname")(function* (hostname) {
11
+ if (!isLoopbackHostname(hostname)) {
12
+ return yield* new UnsafeServerHostnameError({
13
+ hostname,
14
+ message: "CodeCommit web may only listen on a loopback hostname"
15
+ });
16
+ }
17
+ return hostname;
18
+ });
19
+ export const makeOwnerSessionSecrets = Effect.fn("OwnerSessionSecurity.makeSecrets")(function* () {
20
+ const cryptoService = yield* Crypto.Crypto;
21
+ const [ownerToken, csrfToken, bootstrapToken] = yield* Effect.all([
22
+ cryptoService.randomUUIDv4,
23
+ cryptoService.randomUUIDv4,
24
+ cryptoService.randomUUIDv4
25
+ ]);
26
+ const bootstrapAvailable = yield* Ref.make(true);
27
+ return OwnerSessionSecrets.of({
28
+ ownerToken: Redacted.make(ownerToken),
29
+ csrfToken: Redacted.make(csrfToken),
30
+ bootstrapToken: Redacted.make(bootstrapToken),
31
+ bootstrapAvailable,
32
+ bootstrapExpiresAtMillis: yield* Ref.make(undefined)
33
+ });
34
+ });
35
+ export const activateOwnerSessionBootstrap = Effect.fn("OwnerSessionSecurity.activateBootstrap")(function* (secrets) {
36
+ const now = yield* Clock.currentTimeMillis;
37
+ yield* Ref.set(secrets.bootstrapExpiresAtMillis, now + 60_000);
38
+ });
39
+ export const ownerSessionOrigin = (hostname, port) => {
40
+ const urlHostname = hostname === "::1" ? "[::1]" : hostname;
41
+ return `http://${urlHostname}:${port}/`;
42
+ };
43
+ export const ownerSessionUrl = (hostname, port, secrets) => ownerSessionUrlForOrigin(ownerSessionOrigin(hostname, port), secrets);
44
+ export const ownerSessionUrlForOrigin = (origin, secrets) => {
45
+ const bootstrapToken = encodeURIComponent(Redacted.value(secrets.bootstrapToken));
46
+ return `${origin.replace(/\/+$/u, "")}/#bootstrap_token=${bootstrapToken}`;
47
+ };
48
+ export const requireLoopbackOrigin = Effect.fn("OwnerSessionSecurity.requireLoopbackOrigin")(function* (origin) {
49
+ const url = yield* Effect.try({
50
+ try: () => new URL(origin),
51
+ catch: () => new UnsafeServerHostnameError({
52
+ hostname: origin,
53
+ message: "CodeCommit public origin must be a valid loopback HTTP origin"
54
+ })
55
+ });
56
+ if (url.protocol !== "http:" || !isLoopbackHostname(url.hostname) || url.pathname !== "/" || url.search || url.hash) {
57
+ return yield* new UnsafeServerHostnameError({
58
+ hostname: origin,
59
+ message: "CodeCommit public origin must be an HTTP loopback origin without a path, query, or fragment"
60
+ });
61
+ }
62
+ return url.origin;
63
+ });
64
+ export const ownerSessionCookie = (secrets) => `cc_owner=${Redacted.value(secrets.ownerToken)}; HttpOnly; Path=/api; SameSite=Strict`;
65
+ export const authorizeOwnerRequest = Effect.fn("OwnerSessionSecurity.authorizeRequest")(function* (request, secrets) {
66
+ if (request.credential !== Redacted.value(secrets.ownerToken)) {
67
+ return yield* new UnauthorizedApiError({ message: "Missing or invalid owner session" });
68
+ }
69
+ const sameOrigin = request.host !== undefined && request.origin === `http://${request.host}`;
70
+ if (request.origin !== undefined && !sameOrigin) {
71
+ return yield* new ForbiddenApiError({ message: "Request origin does not match the CodeCommit server" });
72
+ }
73
+ // Safe reads intentionally allow non-browser callers without Origin or CSRF
74
+ // headers; every read still requires the process-scoped owner credential.
75
+ if (safeMethods.has(request.method.toUpperCase()))
76
+ return;
77
+ if (!sameOrigin) {
78
+ return yield* new ForbiddenApiError({ message: "Mutation origin does not match the CodeCommit server" });
79
+ }
80
+ if (request.csrfToken !== Redacted.value(secrets.csrfToken)) {
81
+ return yield* new ForbiddenApiError({ message: "Missing or invalid CSRF token" });
82
+ }
83
+ });
84
+ export const authorizeBootstrapRequest = Effect.fn("OwnerSessionSecurity.authorizeBootstrap")(function* (request, secrets) {
85
+ if (request.authorization !== `Bearer ${Redacted.value(secrets.bootstrapToken)}`) {
86
+ return yield* new UnauthorizedApiError({ message: "Missing or invalid bootstrap token" });
87
+ }
88
+ if (request.host === undefined || request.origin !== `http://${request.host}`) {
89
+ return yield* new ForbiddenApiError({ message: "Bootstrap origin does not match the CodeCommit server" });
90
+ }
91
+ const expiresAt = yield* Ref.get(secrets.bootstrapExpiresAtMillis);
92
+ if (expiresAt === undefined) {
93
+ return yield* new UnauthorizedApiError({ message: "Bootstrap token is not active" });
94
+ }
95
+ const now = yield* Clock.currentTimeMillis;
96
+ if (now >= expiresAt) {
97
+ return yield* new UnauthorizedApiError({ message: "Bootstrap token has expired" });
98
+ }
99
+ const available = yield* Ref.getAndSet(secrets.bootstrapAvailable, false);
100
+ if (!available) {
101
+ return yield* new UnauthorizedApiError({ message: "Bootstrap token has already been used" });
102
+ }
103
+ });
104
+ export const ownerSessionAuthLayer = Layer.effect(OwnerSessionAuth, Effect.gen(function* () {
105
+ const secrets = yield* OwnerSessionSecrets;
106
+ return OwnerSessionAuth.of({
107
+ ownerCookie: Effect.fn("OwnerSessionSecurity.ownerCookie")(function* (httpEffect, { credential }) {
108
+ const request = yield* HttpServerRequest.HttpServerRequest;
109
+ yield* authorizeOwnerRequest({
110
+ credential: Redacted.value(credential),
111
+ csrfToken: request.headers["x-csrf-token"],
112
+ host: request.headers.host,
113
+ method: request.method,
114
+ origin: request.headers.origin
115
+ }, secrets);
116
+ return yield* httpEffect;
117
+ })
118
+ });
119
+ }));
120
+ export const OwnerSessionBootstrapRouter = HttpRouter.use((router) => router.add("POST", "/auth/bootstrap", Effect.gen(function* () {
121
+ const secrets = yield* OwnerSessionSecrets;
122
+ const request = yield* HttpServerRequest.HttpServerRequest;
123
+ const authorization = authorizeBootstrapRequest({
124
+ authorization: request.headers.authorization,
125
+ host: request.headers.host,
126
+ origin: request.headers.origin
127
+ }, secrets);
128
+ const result = yield* Effect.result(authorization);
129
+ if (result._tag === "Failure") {
130
+ const error = result.failure;
131
+ return HttpServerResponse.text(error.message, {
132
+ status: error._tag === "UnauthorizedApiError" ? 401 : 403
133
+ });
134
+ }
135
+ return yield* HttpServerResponse.json({ csrfToken: Redacted.value(secrets.csrfToken) }, {
136
+ status: 200,
137
+ headers: {
138
+ "cache-control": "no-store",
139
+ "set-cookie": ownerSessionCookie(secrets)
140
+ }
141
+ });
142
+ })));
143
+ //# sourceMappingURL=OwnerSessionSecurity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OwnerSessionSecurity.js","sourceRoot":"","sources":["../../../src/server/internal/OwnerSessionSecurity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACrF,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAUrF,MAAM,OAAO,mBAAoB,SAAQ,OAAO,CAAC,OAAO,EAGrD,CAAC,2CAA2C,CAAC;CAAG;AAEnD,MAAM,OAAO,yBAA0B,SAAQ,MAAM,CAAC,WAAW,EAA6B,CAC5F,2BAA2B,EAC3B,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CACpD;CAAG;AAEJ,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAA;AAEvD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAgB,EAAW,EAAE,CAC9D,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,OAAO,CAAA;AAEpG,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,EAAE,CAAC,8CAA8C,CAAC,CAC9F,QAAQ,CAAC,EAAC,QAAgB;IACxB,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC,CAAC,IAAI,yBAAyB,CAAC;YAC1C,QAAQ;YACR,OAAO,EAAE,uDAAuD;SACjE,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CACF,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAC,QAAQ,CAAC;IAC5F,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAA;IAC1C,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,cAAc,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QAChE,aAAa,CAAC,YAAY;QAC1B,aAAa,CAAC,YAAY;QAC1B,aAAa,CAAC,YAAY;KAC3B,CAAC,CAAA;IACF,MAAM,kBAAkB,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChD,OAAO,mBAAmB,CAAC,EAAE,CAAC;QAC5B,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;QACrC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;QACnC,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC;QAC7C,kBAAkB;QAClB,wBAAwB,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAqB,SAAS,CAAC;KACzE,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAG,MAAM,CAAC,EAAE,CAAC,wCAAwC,CAAC,CAC9F,QAAQ,CAAC,EAAC,OAAoC;IAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAA;IAC1C,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,wBAAwB,EAAE,GAAG,GAAG,MAAM,CAAC,CAAA;AAChE,CAAC,CACF,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAgB,EAAE,IAAY,EAAU,EAAE;IAC3E,MAAM,WAAW,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAA;IAC3D,OAAO,UAAU,WAAW,IAAI,IAAI,GAAG,CAAA;AACzC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,QAAgB,EAChB,IAAY,EACZ,OAAoC,EAC5B,EAAE,CAAC,wBAAwB,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;AAElF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,MAAc,EACd,OAA4D,EACpD,EAAE;IACV,MAAM,cAAc,GAAG,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAA;IACjF,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,cAAc,EAAE,CAAA;AAC5E,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,EAAE,CAAC,4CAA4C,CAAC,CAC1F,QAAQ,CAAC,EAAC,MAAc;IACtB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QAC5B,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC;QAC1B,KAAK,EAAE,GAAG,EAAE,CACV,IAAI,yBAAyB,CAAC;YAC5B,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,+DAA+D;SACzE,CAAC;KACL,CAAC,CAAA;IACF,IACE,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAC/G,CAAC;QACD,OAAO,KAAK,CAAC,CAAC,IAAI,yBAAyB,CAAC;YAC1C,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,6FAA6F;SACvG,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAA;AACnB,CAAC,CACF,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,OAAwD,EAChD,EAAE,CAAC,YAAY,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,wCAAwC,CAAA;AAUnG,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,EAAE,CAAC,uCAAuC,CAAC,CACrF,QAAQ,CAAC,EAAC,OAAkC,EAAE,OAAoC;IAChF,IAAI,OAAO,CAAC,UAAU,KAAK,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAC,CAAC,IAAI,oBAAoB,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAA;IACzF,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,OAAO,CAAC,IAAI,EAAE,CAAA;IAC5F,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,UAAU,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC,CAAC,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,qDAAqD,EAAE,CAAC,CAAA;IACzG,CAAC;IACD,4EAA4E;IAC5E,0EAA0E;IAC1E,IAAI,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAAE,OAAM;IACzD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC,CAAC,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,sDAAsD,EAAE,CAAC,CAAA;IAC1G,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5D,OAAO,KAAK,CAAC,CAAC,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC,CAAA;IACnF,CAAC;AACH,CAAC,CACF,CAAA;AAQD,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC,EAAE,CAAC,yCAAyC,CAAC,CAC3F,QAAQ,CAAC,EAAC,OAA+B,EAAE,OAAoC;IAC7E,IAAI,OAAO,CAAC,aAAa,KAAK,UAAU,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;QACjF,OAAO,KAAK,CAAC,CAAC,IAAI,oBAAoB,CAAC,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC,CAAA;IAC3F,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9E,OAAO,KAAK,CAAC,CAAC,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,uDAAuD,EAAE,CAAC,CAAA;IAC3G,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAA;IAClE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,CAAC,IAAI,oBAAoB,CAAC,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC,CAAA;IACtF,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAA;IAC1C,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC,CAAC,IAAI,oBAAoB,CAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAA;IACpF,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAA;IACzE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,KAAK,CAAC,CAAC,IAAI,oBAAoB,CAAC,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC,CAAA;IAC9F,CAAC;AACH,CAAC,CACF,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC,MAAM,CAC/C,gBAAgB,EAChB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAA;IAC1C,OAAO,gBAAgB,CAAC,EAAE,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC,kCAAkC,CAAC,CACxD,QAAQ,CAAC,EAAC,UAAU,EAAE,EAAE,UAAU,EAAE;YAClC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC,iBAAiB,CAAA;YAC1D,KAAK,CAAC,CAAC,qBAAqB,CAC1B;gBACE,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;gBACtC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC;gBAC1C,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;gBAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;aAC/B,EACD,OAAO,CACR,CAAA;YACD,OAAO,KAAK,CAAC,CAAC,UAAU,CAAA;QAC1B,CAAC,CACF;KACF,CAAC,CAAA;AACJ,CAAC,CAAC,CACH,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACnE,MAAM,CAAC,GAAG,CACR,MAAM,EACN,iBAAiB,EACjB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAA;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC,iBAAiB,CAAA;IAC1D,MAAM,aAAa,GAAG,yBAAyB,CAC7C;QACE,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,aAAa;QAC5C,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;QAC1B,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;KAC/B,EACD,OAAO,CACR,CAAA;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IAClD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAA;QAC5B,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;YAC5C,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;SAC1D,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE;QACtF,MAAM,EAAE,GAAG;QACX,OAAO,EAAE;YACP,eAAe,EAAE,UAAU;YAC3B,YAAY,EAAE,kBAAkB,CAAC,OAAO,CAAC;SAC1C;KACF,CAAC,CAAA;AACJ,CAAC,CAAC,CACH,CACF,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { AuditLogRepo } from "@knpkv/codecommit-core/PermissionService/AuditLog.js";
2
+ import { PermissionService } from "@knpkv/codecommit-core/PermissionService/index.js";
3
+ import { PermissionGate } from "@knpkv/codecommit-core/PermissionService/PermissionGate.js";
4
+ import * as ReadClient from "@knpkv/codecommit-core/ReadClient.js";
5
+ import { Context, Effect, Stream } from "effect";
6
+ declare const InnerCodeCommitReadClient_base: Context.ServiceClass<InnerCodeCommitReadClient, "@knpkv/codecommit-web/InnerCodeCommitReadClient", ReadClient.CodeCommitReadClientService>;
7
+ /** Holds the decoded provider client before permission enforcement. */
8
+ export declare class InnerCodeCommitReadClient extends InnerCodeCommitReadClient_base {
9
+ }
10
+ /** Construct a read client that checks permission and audits before every provider call. */
11
+ export declare const makePermissionedReadClient: (inner: ReadClient.CodeCommitReadClientService) => Effect.Effect<{
12
+ discoverAccount: (request: {
13
+ readonly profile: string & import("effect/Brand").Brand<"AwsProfileName">;
14
+ readonly region: string & import("effect/Brand").Brand<"AwsRegion">;
15
+ }) => Effect.Effect<ReadClient.CodeCommitAccountIdentity, ReadClient.CodeCommitReadError, never>;
16
+ listRepositoriesPage: (request: ReadClient.ListRepositoriesProviderPageRequest) => Effect.Effect<ReadClient.CodeCommitRepositoryPage, ReadClient.CodeCommitReadError, never>;
17
+ getBlob: (request: ReadClient.GetBlobProviderRequest) => Effect.Effect<ReadClient.CodeCommitBlobContent, ReadClient.CodeCommitReadError, never>;
18
+ listPullRequestIdsPage: (request: Omit<ReadClient.ListPullRequestsProviderPageRequest, "maximumResults">) => Effect.Effect<ReadClient.CodeCommitPullRequestIdsPage, ReadClient.CodeCommitReadError, never>;
19
+ listPullRequestsPage: (request: Omit<ReadClient.ListPullRequestsProviderPageRequest, "maximumResults">) => Effect.Effect<ReadClient.CodeCommitPullRequestPage, ReadClient.CodeCommitReadError>;
20
+ streamPullRequests: (request: Omit<ReadClient.ListPullRequestsProviderPageRequest, "maximumResults" | "nextToken">) => Stream.Stream<ReadClient.CodeCommitPullRequestRevision, ReadClient.CodeCommitReadError>;
21
+ getPullRequest: (request: ReadClient.GetPullRequestProviderRequest) => Effect.Effect<ReadClient.CodeCommitPullRequestRevision, ReadClient.CodeCommitReadError, never>;
22
+ getRepositoryIdentity: (request: ReadClient.GetRepositoryProviderRequest) => Effect.Effect<ReadClient.CodeCommitRepositoryIdentity, ReadClient.CodeCommitReadError, never>;
23
+ getChangedFilesPage: (request: Omit<ReadClient.GetDifferencesProviderPageRequest, "maximumResults">) => Effect.Effect<ReadClient.CodeCommitChangedFilesPage, ReadClient.CodeCommitReadError, never>;
24
+ streamChangedFiles: (request: Omit<ReadClient.GetDifferencesProviderPageRequest, "maximumResults" | "nextToken">) => Stream.Stream<ReadClient.CodeCommitChangedFile, ReadClient.CodeCommitReadError>;
25
+ }, never, AuditLogRepo | PermissionGate | PermissionService>;
26
+ export {};
27
+ //# sourceMappingURL=PermissionedReadClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionedReadClient.d.ts","sourceRoot":"","sources":["../../../src/server/internal/PermissionedReadClient.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAyB,MAAM,sDAAsD,CAAA;AAC1G,OAAO,EAAE,iBAAiB,EAAE,MAAM,mDAAmD,CAAA;AAErF,OAAO,EAAE,cAAc,EAAE,MAAM,4DAA4D,CAAA;AAC3F,OAAO,KAAK,UAAU,MAAM,sCAAsC,CAAA;AAClE,OAAO,EAAS,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAE,MAAM,QAAQ,CAAA;;AAiBvE,uEAAuE;AACvE,qBAAa,yBAA0B,SAAQ,8BAGO;CAAG;AAUzD,4FAA4F;AAC5F,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;4DAsMrC,CAAA"}
@@ -0,0 +1,132 @@
1
+ /** Permission and audit boundary for Schema-decoded CodeCommit provider reads. @module */
2
+ import { AwsApiError, PermissionDeniedError } from "@knpkv/codecommit-core/Errors.js";
3
+ import { AuditLogRepo } from "@knpkv/codecommit-core/PermissionService/AuditLog.js";
4
+ import { PermissionService } from "@knpkv/codecommit-core/PermissionService/index.js";
5
+ import { getOperationMeta } from "@knpkv/codecommit-core/PermissionService/operations.js";
6
+ import { PermissionGate } from "@knpkv/codecommit-core/PermissionService/PermissionGate.js";
7
+ import * as ReadClient from "@knpkv/codecommit-core/ReadClient.js";
8
+ import { Clock, Context, Effect, Option, Random, Stream } from "effect";
9
+ const MAXIMUM_CHANGED_FILE_PAGE_REQUESTS = 1_001;
10
+ /** Holds the decoded provider client before permission enforcement. */
11
+ export class InnerCodeCommitReadClient extends Context.Service()("@knpkv/codecommit-web/InnerCodeCommitReadClient") {
12
+ }
13
+ const deniedError = (params, reason) => new AwsApiError({
14
+ operation: params.operation,
15
+ profile: params.account.profile,
16
+ region: params.account.region,
17
+ cause: new PermissionDeniedError({ operation: params.operation, reason })
18
+ });
19
+ /** Construct a read client that checks permission and audits before every provider call. */
20
+ export const makePermissionedReadClient = Effect.fn("PermissionedReadClient.make")(function* (inner) {
21
+ const permissions = yield* PermissionService;
22
+ const permissionGate = yield* PermissionGate;
23
+ const auditLog = yield* AuditLogRepo;
24
+ const audit = (params, permissionState, durationMs) => permissions.isAuditEnabled().pipe(Effect.flatMap((enabled) => enabled
25
+ ? Clock.currentTimeMillis.pipe(Effect.flatMap((now) => auditLog.log({
26
+ timestamp: new Date(now).toISOString(),
27
+ operation: params.operation,
28
+ accountProfile: params.account.profile,
29
+ region: params.account.region,
30
+ permissionState,
31
+ context: params.context,
32
+ durationMs
33
+ })))
34
+ : Effect.void), Effect.ignore);
35
+ const check = (params) => Effect.gen(function* () {
36
+ const state = yield* permissions.check(params.operation);
37
+ if (state === "always_allow")
38
+ return "always_allowed";
39
+ if (state === "deny") {
40
+ yield* audit(params, "denied", null);
41
+ return yield* deniedError(params, "denied");
42
+ }
43
+ const now = yield* Clock.currentTimeMillis;
44
+ const nonce = yield* Random.nextIntBetween(0, 999_999_999);
45
+ const response = yield* permissionGate.request({
46
+ id: `gate-${now}-${nonce}`,
47
+ operation: params.operation,
48
+ category: getOperationMeta(params.operation).category,
49
+ context: params.context
50
+ }).pipe(Effect.catchTag("PermissionDeniedError", (error) => Effect.gen(function* () {
51
+ if (error.reason === "denied") {
52
+ yield* permissions.set(params.operation, "deny");
53
+ yield* audit(params, "denied", null);
54
+ }
55
+ else {
56
+ yield* audit(params, "timed_out", null);
57
+ }
58
+ return yield* deniedError(params, error.reason);
59
+ })));
60
+ if (response === "always_allow") {
61
+ yield* permissions.set(params.operation, "always_allow");
62
+ return "always_allowed";
63
+ }
64
+ if (response === "deny") {
65
+ yield* permissions.set(params.operation, "deny");
66
+ yield* audit(params, "denied", null);
67
+ return yield* deniedError(params, "denied");
68
+ }
69
+ return "allowed";
70
+ });
71
+ const gated = (operation, context, account, method) => (request) => {
72
+ const params = { operation, context: context(request), account: account(request) };
73
+ return Effect.gen(function* () {
74
+ const permissionState = yield* check(params);
75
+ const startedAt = yield* Clock.currentTimeMillis;
76
+ return yield* method(request).pipe(Effect.ensuring(Clock.currentTimeMillis.pipe(Effect.flatMap((completedAt) => audit(params, permissionState, completedAt - startedAt)))));
77
+ });
78
+ };
79
+ const self = (account) => account;
80
+ const nested = (request) => request.account;
81
+ const listPullRequestIdsPage = gated("listPullRequests", (request) => `List pull requests in ${request.repositoryName}`, nested, inner.listPullRequestIdsPage);
82
+ const getPullRequest = gated("getPullRequest", (request) => `Fetch PR #${request.pullRequestId}`, nested, inner.getPullRequest);
83
+ const listPullRequestsPage = (request) => Effect.gen(function* () {
84
+ const page = yield* listPullRequestIdsPage(request);
85
+ const pullRequests = yield* Effect.forEach(page.pullRequestIds, (pullRequestId) => getPullRequest({ account: request.account, pullRequestId }));
86
+ return new ReadClient.CodeCommitPullRequestPage({ pullRequests, nextToken: page.nextToken });
87
+ });
88
+ const getChangedFilesPage = gated("getDifferences", (request) => `Read differences in ${request.repositoryName}`, nested, inner.getChangedFilesPage);
89
+ const initialPageToken = () => null;
90
+ const streamPullRequests = (request) => Stream.paginate(initialPageToken(), (nextToken) => listPullRequestsPage({ ...request, nextToken }).pipe(Effect.map((page) => [
91
+ page.pullRequests,
92
+ page.nextToken === null ? Option.none() : Option.some(page.nextToken)
93
+ ])));
94
+ const streamChangedFiles = (request) => Stream.paginate({ nextToken: null, pageRequests: 0, seenTokens: new Set() }, Effect.fn("PermissionedReadClient.changedFilesPage")(function* (state) {
95
+ if (state.pageRequests >= MAXIMUM_CHANGED_FILE_PAGE_REQUESTS) {
96
+ return yield* new ReadClient.CodeCommitMalformedResponseError({
97
+ operation: "GetDifferences",
98
+ diagnosticCode: "page-request-limit"
99
+ });
100
+ }
101
+ const page = yield* getChangedFilesPage({ ...request, nextToken: state.nextToken });
102
+ if (page.nextToken === null)
103
+ return [page.files, Option.none()];
104
+ if (state.seenTokens.has(page.nextToken)) {
105
+ return yield* new ReadClient.CodeCommitMalformedResponseError({
106
+ operation: "GetDifferences",
107
+ diagnosticCode: "repeated-page-token"
108
+ });
109
+ }
110
+ return [
111
+ page.files,
112
+ Option.some({
113
+ nextToken: page.nextToken,
114
+ pageRequests: state.pageRequests + 1,
115
+ seenTokens: new Set([...state.seenTokens, page.nextToken])
116
+ })
117
+ ];
118
+ }));
119
+ return {
120
+ discoverAccount: gated("getCallerIdentity", (account) => `Discover account for ${account.profile}`, self, inner.discoverAccount),
121
+ listRepositoriesPage: gated("listRepositories", (request) => `List repositories for ${request.account.profile}`, nested, inner.listRepositoriesPage),
122
+ getBlob: gated("getBlob", (request) => `Read immutable blob in ${request.repositoryName}`, nested, inner.getBlob),
123
+ listPullRequestIdsPage,
124
+ listPullRequestsPage,
125
+ streamPullRequests,
126
+ getPullRequest,
127
+ getRepositoryIdentity: gated("getRepository", (request) => `Read repository identity for ${request.repositoryName}`, nested, inner.getRepositoryIdentity),
128
+ getChangedFilesPage,
129
+ streamChangedFiles
130
+ };
131
+ });
132
+ //# sourceMappingURL=PermissionedReadClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionedReadClient.js","sourceRoot":"","sources":["../../../src/server/internal/PermissionedReadClient.ts"],"names":[],"mappings":"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"}