@graphoria/server 0.4.0 → 0.5.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 (150) hide show
  1. package/README.md +4 -0
  2. package/dist/src/analyzeQuery/depthLimit.d.ts +1 -13
  3. package/dist/src/analyzeQuery/depthLimit.d.ts.map +1 -1
  4. package/dist/src/authentication/capabilities.d.ts +1 -1
  5. package/dist/src/authentication/capabilities.d.ts.map +1 -1
  6. package/dist/src/authentication/tokenRepository.d.ts.map +1 -1
  7. package/dist/src/config/types/db.d.ts +25 -0
  8. package/dist/src/config/types/db.d.ts.map +1 -1
  9. package/dist/src/configuration/getSchemas/index.d.ts +40 -0
  10. package/dist/src/configuration/getSchemas/index.d.ts.map +1 -1
  11. package/dist/src/configuration/getSchemas/mergeEntities/index.d.ts +20 -0
  12. package/dist/src/configuration/getSchemas/mergeEntities/index.d.ts.map +1 -1
  13. package/dist/src/configuration/gql/handleGraphQLRequestFactory.d.ts.map +1 -1
  14. package/dist/src/configuration/index.d.ts +30 -0
  15. package/dist/src/configuration/index.d.ts.map +1 -1
  16. package/dist/src/console/api.d.ts.map +1 -1
  17. package/dist/src/cron/index.d.ts.map +1 -1
  18. package/dist/src/databases/common.d.ts +20 -6
  19. package/dist/src/databases/common.d.ts.map +1 -1
  20. package/dist/src/databases/core/executor.d.ts +4 -6
  21. package/dist/src/databases/core/executor.d.ts.map +1 -1
  22. package/dist/src/databases/core/function-mapping.d.ts +1 -2
  23. package/dist/src/databases/core/function-mapping.d.ts.map +1 -1
  24. package/dist/src/databases/core/query-builder.d.ts +5 -0
  25. package/dist/src/databases/core/query-builder.d.ts.map +1 -1
  26. package/dist/src/databases/engines/mssql/getStructure.d.ts +5 -0
  27. package/dist/src/databases/engines/mssql/getStructure.d.ts.map +1 -1
  28. package/dist/src/databases/engines/mssql/query/index.d.ts +2 -2
  29. package/dist/src/databases/engines/mssql/query/index.d.ts.map +1 -1
  30. package/dist/src/databases/engines/mysql/getStructure.d.ts +5 -0
  31. package/dist/src/databases/engines/mysql/getStructure.d.ts.map +1 -1
  32. package/dist/src/databases/engines/mysql/query/index.d.ts +2 -2
  33. package/dist/src/databases/engines/mysql/query/index.d.ts.map +1 -1
  34. package/dist/src/databases/engines/postgresql/getStructure.d.ts +5 -0
  35. package/dist/src/databases/engines/postgresql/getStructure.d.ts.map +1 -1
  36. package/dist/src/databases/engines/postgresql/query/index.d.ts +2 -2
  37. package/dist/src/databases/engines/postgresql/query/index.d.ts.map +1 -1
  38. package/dist/src/databases/high-level-operations.d.ts +5 -0
  39. package/dist/src/databases/high-level-operations.d.ts.map +1 -1
  40. package/dist/src/databases/metadata/structure.d.ts +5 -0
  41. package/dist/src/databases/metadata/structure.d.ts.map +1 -1
  42. package/dist/src/databases/transformers/data-transformers.d.ts +30 -0
  43. package/dist/src/databases/transformers/data-transformers.d.ts.map +1 -1
  44. package/dist/src/index.d.ts +4 -0
  45. package/dist/src/index.d.ts.map +1 -1
  46. package/dist/src/logging/slowQuery.d.ts +29 -0
  47. package/dist/src/logging/slowQuery.d.ts.map +1 -0
  48. package/dist/src/logging/slowQuery.test.d.ts +2 -0
  49. package/dist/src/logging/slowQuery.test.d.ts.map +1 -0
  50. package/dist/src/observability/health.d.ts +23 -0
  51. package/dist/src/observability/health.d.ts.map +1 -0
  52. package/dist/src/observability/health.test.d.ts +2 -0
  53. package/dist/src/observability/health.test.d.ts.map +1 -0
  54. package/dist/src/observability/httpMetrics.d.ts +7 -0
  55. package/dist/src/observability/httpMetrics.d.ts.map +1 -0
  56. package/dist/src/observability/httpMetrics.test.d.ts +2 -0
  57. package/dist/src/observability/httpMetrics.test.d.ts.map +1 -0
  58. package/dist/src/observability/httpTracing.d.ts +11 -0
  59. package/dist/src/observability/httpTracing.d.ts.map +1 -0
  60. package/dist/src/observability/httpTracing.test.d.ts +2 -0
  61. package/dist/src/observability/httpTracing.test.d.ts.map +1 -0
  62. package/dist/src/observability/metrics.d.ts +81 -0
  63. package/dist/src/observability/metrics.d.ts.map +1 -0
  64. package/dist/src/observability/metrics.perf.test.d.ts +2 -0
  65. package/dist/src/observability/metrics.perf.test.d.ts.map +1 -0
  66. package/dist/src/observability/metrics.test.d.ts +2 -0
  67. package/dist/src/observability/metrics.test.d.ts.map +1 -0
  68. package/dist/src/observability/metricsRoute.d.ts +19 -0
  69. package/dist/src/observability/metricsRoute.d.ts.map +1 -0
  70. package/dist/src/observability/metricsRoute.test.d.ts +2 -0
  71. package/dist/src/observability/metricsRoute.test.d.ts.map +1 -0
  72. package/dist/src/observability/tracing.d.ts +92 -0
  73. package/dist/src/observability/tracing.d.ts.map +1 -0
  74. package/dist/src/observability/tracing.perf.test.d.ts +2 -0
  75. package/dist/src/observability/tracing.perf.test.d.ts.map +1 -0
  76. package/dist/src/observability/tracing.test.d.ts +2 -0
  77. package/dist/src/observability/tracing.test.d.ts.map +1 -0
  78. package/dist/src/queues/kafka.d.ts +6 -0
  79. package/dist/src/queues/kafka.d.ts.map +1 -1
  80. package/dist/src/queues/kafka.test.d.ts +2 -0
  81. package/dist/src/queues/kafka.test.d.ts.map +1 -0
  82. package/dist/src/queues/rabbitmq.d.ts.map +1 -1
  83. package/dist/src/remoteREST/proxy.d.ts.map +1 -1
  84. package/dist/src/remoteSchemas/proxy.d.ts.map +1 -1
  85. package/dist/src/singletons/cache/redisClient.d.ts +2 -2
  86. package/dist/src/singletons/cache/redisClient.d.ts.map +1 -1
  87. package/dist/src/singletons/databases.d.ts +1 -0
  88. package/dist/src/singletons/databases.d.ts.map +1 -1
  89. package/dist/src/singletons/env.d.ts +29 -0
  90. package/dist/src/singletons/env.d.ts.map +1 -1
  91. package/dist/src/singletons/queues.d.ts +1 -0
  92. package/dist/src/singletons/queues.d.ts.map +1 -1
  93. package/dist/src/subscriptions/strategies/database.d.ts.map +1 -1
  94. package/dist/src/subscriptions/utils/polling.d.ts +1 -0
  95. package/dist/src/subscriptions/utils/polling.d.ts.map +1 -1
  96. package/dist/src/subscriptions/utils/polling.test.d.ts +2 -0
  97. package/dist/src/subscriptions/utils/polling.test.d.ts.map +1 -0
  98. package/dist/src/types/env.d.ts +89 -0
  99. package/dist/src/types/env.d.ts.map +1 -1
  100. package/dist/src/types/zod/configuration.d.ts +25 -0
  101. package/dist/src/types/zod/configuration.d.ts.map +1 -1
  102. package/dist/src/types/zod/db.d.ts +85 -0
  103. package/dist/src/types/zod/db.d.ts.map +1 -1
  104. package/dist/src/utils/rateLimit.d.ts.map +1 -1
  105. package/dist/src/utils/redis.d.ts +17 -0
  106. package/dist/src/utils/redis.d.ts.map +1 -0
  107. package/dist/src/utils/redis.test.d.ts +2 -0
  108. package/dist/src/utils/redis.test.d.ts.map +1 -0
  109. package/dist/src/utils/responses.d.ts +3 -0
  110. package/dist/src/utils/responses.d.ts.map +1 -1
  111. package/dist/tsconfig.tsbuildinfo +1 -1
  112. package/package.json +4 -1
  113. package/playgrounds/console/index.html +8 -8
  114. package/playgrounds/graphiql/index.html +114 -114
  115. package/playgrounds/scalar/index.html +1 -1
  116. package/src/analyzeQuery/depthLimit.ts +15 -5
  117. package/src/authentication/capabilities.ts +3 -1
  118. package/src/authentication/tokenRepository.ts +2 -3
  119. package/src/config/types/db.ts +16 -2
  120. package/src/configuration/gql/handleGraphQLRequestFactory.ts +233 -152
  121. package/src/console/api.ts +1 -6
  122. package/src/cron/index.ts +59 -36
  123. package/src/databases/common.ts +109 -10
  124. package/src/databases/core/executor.ts +96 -18
  125. package/src/databases/core/function-mapping.ts +1 -1
  126. package/src/databases/engines/mssql/query/index.ts +4 -1
  127. package/src/databases/engines/mysql/query/index.ts +5 -2
  128. package/src/databases/engines/postgresql/query/index.ts +5 -2
  129. package/src/databases/high-level-operations.ts +44 -2
  130. package/src/index.ts +147 -62
  131. package/src/logging/slowQuery.ts +59 -0
  132. package/src/observability/health.ts +67 -0
  133. package/src/observability/httpMetrics.ts +37 -0
  134. package/src/observability/httpTracing.ts +48 -0
  135. package/src/observability/metrics.ts +243 -0
  136. package/src/observability/metricsRoute.ts +33 -0
  137. package/src/observability/tracing.ts +421 -0
  138. package/src/queues/kafka.ts +45 -2
  139. package/src/queues/rabbitmq.ts +37 -1
  140. package/src/remoteREST/proxy.ts +17 -0
  141. package/src/remoteSchemas/proxy.ts +17 -0
  142. package/src/singletons/cache/redisClient.ts +4 -5
  143. package/src/singletons/databases.ts +5 -0
  144. package/src/singletons/queues.ts +9 -3
  145. package/src/subscriptions/strategies/database.ts +2 -0
  146. package/src/subscriptions/utils/polling.ts +80 -21
  147. package/src/types/env.ts +27 -0
  148. package/src/utils/rateLimit.ts +6 -1
  149. package/src/utils/redis.ts +71 -0
  150. package/src/utils/responses.ts +6 -0
@@ -25,6 +25,11 @@ export declare const getDatabaseStructure: (db: Database) => Promise<{
25
25
  target?: string | undefined;
26
26
  operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
27
27
  value?: string | number | boolean | undefined;
28
+ ancestor?: {
29
+ schema: string;
30
+ name: string;
31
+ column: string;
32
+ } | undefined;
28
33
  }[] | undefined;
29
34
  dashedName: string;
30
35
  }[];
@@ -1 +1 @@
1
- {"version":3,"file":"getStructure.d.ts","sourceRoot":"","sources":["../../../../../src/databases/engines/mysql/getStructure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAoB7D,eAAO,MAAM,oBAAoB,OAAc,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+HtD,CAAC"}
1
+ {"version":3,"file":"getStructure.d.ts","sourceRoot":"","sources":["../../../../../src/databases/engines/mysql/getStructure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAoB7D,eAAO,MAAM,oBAAoB,OAAc,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+HtD,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import type { OperationAnalysis, SelectionAnalysis, VariableDefinition } from "../../../../analyzeQuery/types";
2
2
  import type { MergedEntities } from "../../../../configuration/getSchemas/mergeEntities";
3
- import type { PageLimits } from "../../../common";
3
+ import type { PageLimits, QueryPathFrame } from "../../../common";
4
4
  export declare const generateSQL: (entities: MergedEntities, operation: OperationAnalysis, variables?: Record<string, unknown>, forHashMethod?: boolean, pageLimits?: PageLimits | null, timeoutMs?: number) => string;
5
5
  export declare const buildSQLForField: (entities: MergedEntities, variablesDefinition: VariableDefinition[], variables: Record<string, unknown> | undefined, field: SelectionAnalysis, parentTableName: string | null, parentTableAlias: string | null, level: number, aliasMap: {
6
6
  [alias: string]: string;
7
- }, pageLimits: PageLimits | null) => string;
7
+ }, pageLimits: PageLimits | null, ancestors?: readonly QueryPathFrame[]) => string;
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/databases/engines/mysql/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AACzF,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAqJ/D,eAAO,MAAM,WAAW,aACZ,cAAc,aACb,iBAAiB,cACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,kBACnB,OAAO,eACV,UAAU,GAAG,IAAI,cACjB,MAAM,KACjB,MAqFF,CAAC;AAEF,eAAO,MAAM,gBAAgB,aACjB,cAAc,uBACH,kBAAkB,EAAE,aAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,qBAC3B,iBAAiB,mBACP,MAAM,GAAG,IAAI,oBACZ,MAAM,GAAG,IAAI,SACxB,MAAM,YACH;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,cACzB,UAAU,GAAG,IAAI,KAC5B,MA+GF,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/databases/engines/mysql/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AACzF,OAAO,KAAK,EAAe,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAqJ/E,eAAO,MAAM,WAAW,aACZ,cAAc,aACb,iBAAiB,cACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,kBACnB,OAAO,eACV,UAAU,GAAG,IAAI,cACjB,MAAM,KACjB,MAqFF,CAAC;AAEF,eAAO,MAAM,gBAAgB,aACjB,cAAc,uBACH,kBAAkB,EAAE,aAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,qBAC3B,iBAAiB,mBACP,MAAM,GAAG,IAAI,oBACZ,MAAM,GAAG,IAAI,SACxB,MAAM,YACH;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,cACzB,UAAU,GAAG,IAAI,cAClB,SAAS,cAAc,EAAE,KACnC,MAiHF,CAAC"}
@@ -25,6 +25,11 @@ export declare const getDatabaseStructure: (db: Database) => Promise<{
25
25
  target?: string | undefined;
26
26
  operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
27
27
  value?: string | number | boolean | undefined;
28
+ ancestor?: {
29
+ schema: string;
30
+ name: string;
31
+ column: string;
32
+ } | undefined;
28
33
  }[] | undefined;
29
34
  dashedName: string;
30
35
  }[];
@@ -1 +1 @@
1
- {"version":3,"file":"getStructure.d.ts","sourceRoot":"","sources":["../../../../../src/databases/engines/postgresql/getStructure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAK7D,eAAO,MAAM,oBAAoB,OAAc,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgJtD,CAAC"}
1
+ {"version":3,"file":"getStructure.d.ts","sourceRoot":"","sources":["../../../../../src/databases/engines/postgresql/getStructure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAK7D,eAAO,MAAM,oBAAoB,OAAc,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgJtD,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import type { OperationAnalysis, SelectionAnalysis, VariableDefinition } from "../../../../analyzeQuery/types";
2
2
  import type { MergedEntities } from "../../../../configuration/getSchemas/mergeEntities";
3
- import type { PageLimits } from "../../../common";
3
+ import type { PageLimits, QueryPathFrame } from "../../../common";
4
4
  export declare const generateSQL: (entities: MergedEntities, operation: OperationAnalysis, variables?: Record<string, unknown>, forHashMethod?: boolean, pageLimits?: PageLimits | null) => string;
5
5
  export declare const buildSQLForField: (entities: MergedEntities, variablesDefinition: VariableDefinition[], variables: Record<string, unknown> | undefined, field: SelectionAnalysis, parentTableName: string | null, parentTableAlias: string | null, level: number, aliasMap: {
6
6
  [alias: string]: string;
7
- }, pageLimits: PageLimits | null) => string;
7
+ }, pageLimits: PageLimits | null, ancestors?: readonly QueryPathFrame[]) => string;
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/databases/engines/postgresql/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AACzF,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAiJ/D,eAAO,MAAM,WAAW,aACZ,cAAc,aACb,iBAAiB,cACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,kBACnB,OAAO,eACV,UAAU,GAAG,IAAI,KAC5B,MA2EF,CAAC;AAEF,eAAO,MAAM,gBAAgB,aACjB,cAAc,uBACH,kBAAkB,EAAE,aAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,qBAC3B,iBAAiB,mBACP,MAAM,GAAG,IAAI,oBACZ,MAAM,GAAG,IAAI,SACxB,MAAM,YACH;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,cACzB,UAAU,GAAG,IAAI,KAC5B,MAwGF,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/databases/engines/postgresql/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AACzF,OAAO,KAAK,EAAe,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAiJ/E,eAAO,MAAM,WAAW,aACZ,cAAc,aACb,iBAAiB,cACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,kBACnB,OAAO,eACV,UAAU,GAAG,IAAI,KAC5B,MA2EF,CAAC;AAEF,eAAO,MAAM,gBAAgB,aACjB,cAAc,uBACH,kBAAkB,EAAE,aAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,qBAC3B,iBAAiB,mBACP,MAAM,GAAG,IAAI,oBACZ,MAAM,GAAG,IAAI,SACxB,MAAM,YACH;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,cACzB,UAAU,GAAG,IAAI,cAClB,SAAS,cAAc,EAAE,KACnC,MA0GF,CAAC"}
@@ -47,6 +47,11 @@ export declare const getDatabasesStructure: (databases: Database[], auth?: Auth,
47
47
  target?: string | undefined;
48
48
  operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
49
49
  value?: string | number | boolean | undefined;
50
+ ancestor?: {
51
+ schema: string;
52
+ name: string;
53
+ column: string;
54
+ } | undefined;
50
55
  }[] | undefined;
51
56
  }[];
52
57
  description?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"high-level-operations.d.ts","sourceRoot":"","sources":["../../../src/databases/high-level-operations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EACV,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,WAAW,EAGZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,iBAAiB,EAAe,aAAa,EAAU,MAAM,aAAa,CAAC;AAEzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAI5D;;GAEG;AAEH,eAAO,MAAM,qBAAqB,cACrB,QAAQ,EAAE,SACd,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2IZ,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,gBAAgB,EAAE,iBAAiB,EAAE,CAAC;IACtC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,oBAAoB,EAAE,CAAC;IACtC,UAAU,EAAE,kBAAkB,EAAE,CAAC;CAClC,CAAC;AAmCF,eAAO,MAAM,kBAAkB,WACrB,aAAa,EAAE,oBACL,iBAAiB,EAAE,UAC7B,YAAY,EAAE,cACV,UAAU,uBACF,WAAW,kBAChB,oBAAoB,EAAE,eACzB,kBAAkB,EAAE,mCA4F/B,CAAC"}
1
+ {"version":3,"file":"high-level-operations.d.ts","sourceRoot":"","sources":["../../../src/databases/high-level-operations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EACV,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,WAAW,EAGZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,iBAAiB,EAAe,aAAa,EAAU,MAAM,aAAa,CAAC;AAEzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAI5D;;GAEG;AAEH,eAAO,MAAM,qBAAqB,cACrB,QAAQ,EAAE,SACd,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqLZ,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,gBAAgB,EAAE,iBAAiB,EAAE,CAAC;IACtC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,oBAAoB,EAAE,CAAC;IACtC,UAAU,EAAE,kBAAkB,EAAE,CAAC;CAClC,CAAC;AAmCF,eAAO,MAAM,kBAAkB,WACrB,aAAa,EAAE,oBACL,iBAAiB,EAAE,UAC7B,YAAY,EAAE,cACV,UAAU,uBACF,WAAW,kBAChB,oBAAoB,EAAE,eACzB,kBAAkB,EAAE,mCA4F/B,CAAC"}
@@ -28,6 +28,11 @@ export declare const getDatabaseStructure: (db: Database) => Promise<{
28
28
  target?: string | undefined;
29
29
  operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
30
30
  value?: string | number | boolean | undefined;
31
+ ancestor?: {
32
+ schema: string;
33
+ name: string;
34
+ column: string;
35
+ } | undefined;
31
36
  }[] | undefined;
32
37
  dashedName: string;
33
38
  }[];
@@ -1 +1 @@
1
- {"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../../../src/databases/metadata/structure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAI1D;;GAEG;AAEH,eAAO,MAAM,oBAAoB,OAAc,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACH,CAAC;AAErD,eAAO,MAAM,cAAc,OAAc,QAAQ;;;;IAA2C,CAAC"}
1
+ {"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../../../src/databases/metadata/structure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAI1D;;GAEG;AAEH,eAAO,MAAM,oBAAoB,OAAc,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACH,CAAC;AAErD,eAAO,MAAM,cAAc,OAAc,QAAQ;;;;IAA2C,CAAC"}
@@ -15,6 +15,11 @@ export declare const buildRelationshipResolver: (table: Table, foreignKey: Relat
15
15
  target?: string | undefined;
16
16
  operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
17
17
  value?: string | number | boolean | undefined;
18
+ ancestor?: {
19
+ schema: string;
20
+ name: string;
21
+ column: string;
22
+ } | undefined;
18
23
  }[] | undefined;
19
24
  internalName: string;
20
25
  fromInternalName: string;
@@ -61,6 +66,11 @@ export declare const buildTableResolver: (tables: Tables, table: Table, db: Data
61
66
  target?: string | undefined;
62
67
  operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
63
68
  value?: string | number | boolean | undefined;
69
+ ancestor?: {
70
+ schema: string;
71
+ name: string;
72
+ column: string;
73
+ } | undefined;
64
74
  }[] | undefined;
65
75
  }[];
66
76
  description?: string | undefined;
@@ -107,6 +117,11 @@ export declare const buildTableResolver: (tables: Tables, table: Table, db: Data
107
117
  target?: string | undefined;
108
118
  operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
109
119
  value?: string | number | boolean | undefined;
120
+ ancestor?: {
121
+ schema: string;
122
+ name: string;
123
+ column: string;
124
+ } | undefined;
110
125
  }[] | undefined;
111
126
  internalName: string;
112
127
  fromInternalName: string;
@@ -126,6 +141,11 @@ export declare const buildTableResolver: (tables: Tables, table: Table, db: Data
126
141
  target?: string | undefined;
127
142
  operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
128
143
  value?: string | number | boolean | undefined;
144
+ ancestor?: {
145
+ schema: string;
146
+ name: string;
147
+ column: string;
148
+ } | undefined;
129
149
  }[] | undefined;
130
150
  internalName: string;
131
151
  fromInternalName: string;
@@ -157,6 +177,11 @@ export declare const buildTableResolver: (tables: Tables, table: Table, db: Data
157
177
  target?: string | undefined;
158
178
  operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
159
179
  value?: string | number | boolean | undefined;
180
+ ancestor?: {
181
+ schema: string;
182
+ name: string;
183
+ column: string;
184
+ } | undefined;
160
185
  }[] | undefined;
161
186
  dashedName: string;
162
187
  }[];
@@ -204,6 +229,11 @@ export declare const buildProcedureResolver: (sp: StoredProcedure, db: Database)
204
229
  target?: string | undefined;
205
230
  operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
206
231
  value?: string | number | boolean | undefined;
232
+ ancestor?: {
233
+ schema: string;
234
+ name: string;
235
+ column: string;
236
+ } | undefined;
207
237
  }[] | undefined;
208
238
  }[];
209
239
  description?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"data-transformers.d.ts","sourceRoot":"","sources":["../../../../src/databases/transformers/data-transformers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,KAAK,EAAwB,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAK3F;;GAEG;AAEH,eAAO,MAAM,yBAAyB,UAC7B,KAAK,cACA,aAAa,CAAC,MAAM,CAAC,MAC7B,QAAQ;;;;;;;;;;;;;;;;;;CAiEb,CAAC;AAEF,eAAO,MAAM,kBAAkB,WAAY,MAAM,SAAS,KAAK,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC5E,CAAC;AAEF,eAAO,MAAM,sBAAsB,OAAQ,eAAe,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgBvE,CAAC"}
1
+ {"version":3,"file":"data-transformers.d.ts","sourceRoot":"","sources":["../../../../src/databases/transformers/data-transformers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,KAAK,EAAwB,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAK3F;;GAEG;AAEH,eAAO,MAAM,yBAAyB,UAC7B,KAAK,cACA,aAAa,CAAC,MAAM,CAAC,MAC7B,QAAQ;;;;;;;;;;;;;;;;;;;;;;;CAiEb,CAAC;AAEF,eAAO,MAAM,kBAAkB,WAAY,MAAM,SAAS,KAAK,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC5E,CAAC;AAEF,eAAO,MAAM,sBAAsB,OAAQ,eAAe,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgBvE,CAAC"}
@@ -85,6 +85,8 @@ export declare function createHandlers(options?: Partial<Env>): Promise<{
85
85
  rest: string;
86
86
  openapi: string;
87
87
  console: string;
88
+ health: string;
89
+ metrics: string;
88
90
  };
89
91
  logger: typeof logger;
90
92
  execute: (query: string, variables?: Record<string, unknown>, opts?: import("./configuration/gql/buildExecute").ExecuteOptions) => Promise<{
@@ -126,6 +128,8 @@ export declare function createBunServer(options?: Partial<Env>): Promise<{
126
128
  rest: string;
127
129
  openapi: string;
128
130
  console: string;
131
+ health: string;
132
+ metrics: string;
129
133
  };
130
134
  logger: typeof logger;
131
135
  execute: (query: string, variables?: Record<string, unknown>, opts?: import("./configuration/gql/buildExecute").ExecuteOptions) => Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAGtC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAcvC,OAAO,EAAE,mBAAmB,EAAmC,MAAM,wBAAwB,CAAC;AAc9F,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAIrD,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B,KAAK,YAAY,GACb,QAAQ,GACR,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC;AAEjG,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AAqF7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,mBAAmB,aAAoB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;EAc/D,CAAC;AA0TF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;GAoB1D;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;GAW3D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAGtC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAcvC,OAAO,EAEL,mBAAmB,EAGpB,MAAM,wBAAwB,CAAC;AAehC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAUrD,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B,KAAK,YAAY,GACb,QAAQ,GACR,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC;AAEjG,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AAqG7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,mBAAmB,aAAoB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;EAc/D,CAAC;AAmXF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;GAoB1D;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;GAW3D"}
@@ -0,0 +1,29 @@
1
+ import type { Logger } from "pino";
2
+ /** The GraphQL operation a statement was generated for. Names only, never values. */
3
+ export type QuerySource = {
4
+ operation: {
5
+ type: "query" | "mutation" | "subscription";
6
+ name: string | null;
7
+ fields: string[];
8
+ };
9
+ role?: string | undefined;
10
+ };
11
+ export type SlowQueryRecord = {
12
+ durationMs: number;
13
+ dbType: string;
14
+ dbName: string;
15
+ sql?: string;
16
+ procedure?: string;
17
+ outcome: "success" | "error";
18
+ } & Partial<QuerySource>;
19
+ export type SlowQueryLog = {
20
+ emit(record: SlowQueryRecord & {
21
+ thresholdMs: number;
22
+ }): void;
23
+ };
24
+ export declare const setSlowQueryMs: (ms: number) => void;
25
+ export declare const createSlowQueryLog: (base: Logger) => SlowQueryLog;
26
+ /** Test seam: pass `null` to restore the default log. */
27
+ export declare const setSlowQueryLog: (log: SlowQueryLog | null) => void;
28
+ export declare const reportQueryDuration: (record: SlowQueryRecord) => void;
29
+ //# sourceMappingURL=slowQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slowQuery.d.ts","sourceRoot":"","sources":["../../../src/logging/slowQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,qFAAqF;AACrF,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE;QACT,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;QAC5C,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;CAC9B,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAEzB,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,MAAM,EAAE,eAAe,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC/D,CAAC;AAQF,eAAO,MAAM,cAAc,OAAQ,MAAM,KAAG,IAE3C,CAAC;AAEF,eAAO,MAAM,kBAAkB,SAAU,MAAM,KAAG,YAEhD,CAAC;AAKH,yDAAyD;AACzD,eAAO,MAAM,eAAe,QAAS,YAAY,GAAG,IAAI,KAAG,IAE1D,CAAC;AAQF,eAAO,MAAM,mBAAmB,WAAY,eAAe,KAAG,IAG7D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=slowQuery.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slowQuery.test.d.ts","sourceRoot":"","sources":["../../../src/logging/slowQuery.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import { S200, S503 } from "../utils/responses";
2
+ export type HealthCheck = {
3
+ kind: string;
4
+ name?: string;
5
+ probe: () => Promise<boolean> | boolean;
6
+ };
7
+ export type HealthRoutesOptions = {
8
+ basePath: string;
9
+ /** Read on every readiness request, so a check can follow state that changes after boot. */
10
+ checks: () => HealthCheck[];
11
+ timeoutMs: number;
12
+ };
13
+ /**
14
+ * Unauthenticated probes for an orchestrator. Liveness touches nothing, so a
15
+ * dependency outage never gets the process restarted; readiness pings every
16
+ * dependency and answers 503 while one is down. The body names each check and
17
+ * whether it passed — the reason stays in the log, because a driver error can
18
+ * carry a host and port.
19
+ */
20
+ export declare const createHealthRoutes: ({ basePath, checks, timeoutMs }: HealthRoutesOptions) => {
21
+ [x: string]: (() => S200) | (() => Promise<S200 | S503>);
22
+ };
23
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/observability/health.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,4FAA4F;IAC5F,MAAM,EAAE,MAAM,WAAW,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAgBF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,oCAAqC,mBAAmB;;CA6BtF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=health.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.test.d.ts","sourceRoot":"","sources":["../../../src/observability/health.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Wraps a route handler so the request is counted and timed. The route label is
3
+ * the name of the mounted route, never the URL: a path carries identifiers, and
4
+ * one series per identifier is a cardinality leak.
5
+ */
6
+ export declare const withHttpMetrics: <Req extends Request, Args extends unknown[]>(route: string, handler: (req: Req, ...args: Args) => Response | undefined | Promise<Response | undefined>) => (req: Req, ...args: Args) => Promise<Response | undefined>;
7
+ //# sourceMappingURL=httpMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpMetrics.d.ts","sourceRoot":"","sources":["../../../src/observability/httpMetrics.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,eAAe,GACzB,GAAG,SAAS,OAAO,EAAE,IAAI,SAAS,OAAO,EAAE,SACnC,MAAM,WACJ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,WAEhF,GAAG,WAAW,IAAI,KAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAwB5D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=httpMetrics.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpMetrics.test.d.ts","sourceRoot":"","sources":["../../../src/observability/httpMetrics.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Wraps a route handler so the request roots a trace. The span is named for the
3
+ * mounted route, never the URL: a path carries identifiers and a query string
4
+ * carries caller data, and a span name is exported verbatim.
5
+ *
6
+ * An inbound `traceparent` is continued, so a gateway's span and this one join
7
+ * up. `parent: null` is deliberate — a request is a root, never a child of
8
+ * whatever context the server happened to be in.
9
+ */
10
+ export declare const withHttpTracing: <Req extends Request, Args extends unknown[]>(route: string, handler: (req: Req, ...args: Args) => Response | undefined | Promise<Response | undefined>) => (req: Req, ...args: Args) => Promise<Response | undefined>;
11
+ //# sourceMappingURL=httpTracing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpTracing.d.ts","sourceRoot":"","sources":["../../../src/observability/httpTracing.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,GACzB,GAAG,SAAS,OAAO,EAAE,IAAI,SAAS,OAAO,EAAE,SACnC,MAAM,WACJ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,WAEhF,GAAG,WAAW,IAAI,KAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CA+B5D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=httpTracing.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpTracing.test.d.ts","sourceRoot":"","sources":["../../../src/observability/httpTracing.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,81 @@
1
+ declare const METRICS: {
2
+ readonly graphoria_graphql_operations_total: {
3
+ readonly type: "counter";
4
+ readonly help: "GraphQL operations executed, by outcome.";
5
+ readonly labelNames: readonly ["operation", "outcome", "role", "type"];
6
+ };
7
+ readonly graphoria_graphql_operation_duration_seconds: {
8
+ readonly type: "histogram";
9
+ readonly help: "Time spent handling a GraphQL operation, in seconds.";
10
+ readonly labelNames: readonly ["operation", "role", "type"];
11
+ };
12
+ readonly graphoria_http_requests_total: {
13
+ readonly type: "counter";
14
+ readonly help: "HTTP requests answered by the GraphQL and REST routes, by status.";
15
+ readonly labelNames: readonly ["method", "route", "status"];
16
+ };
17
+ readonly graphoria_http_request_duration_seconds: {
18
+ readonly type: "histogram";
19
+ readonly help: "Time spent answering an HTTP request, in seconds.";
20
+ readonly labelNames: readonly ["method", "route"];
21
+ };
22
+ readonly graphoria_cron_runs_total: {
23
+ readonly type: "counter";
24
+ readonly help: "Cron ticks that ran to completion or threw, by job.";
25
+ readonly labelNames: readonly ["job", "outcome"];
26
+ };
27
+ readonly graphoria_cron_run_duration_seconds: {
28
+ readonly type: "histogram";
29
+ readonly help: "Time spent in a cron tick, in seconds.";
30
+ readonly labelNames: readonly ["job"];
31
+ };
32
+ readonly graphoria_queue_messages_published_total: {
33
+ readonly type: "counter";
34
+ readonly help: "Messages handed to a broker, by publisher and outcome.";
35
+ readonly labelNames: readonly ["broker", "outcome", "publisher"];
36
+ };
37
+ readonly graphoria_queue_messages_consumed_total: {
38
+ readonly type: "counter";
39
+ readonly help: "Messages taken from a broker, by consumer and outcome.";
40
+ readonly labelNames: readonly ["broker", "consumer", "outcome", "queue"];
41
+ };
42
+ readonly graphoria_rate_limit_rejections_total: {
43
+ readonly type: "counter";
44
+ readonly help: "Requests refused by the rate limiter, by the role the ceiling was read from.";
45
+ readonly labelNames: readonly ["role"];
46
+ };
47
+ readonly graphoria_graphql_rejections_total: {
48
+ readonly type: "counter";
49
+ readonly help: "GraphQL operations rejected before execution.";
50
+ readonly labelNames: readonly ["reason"];
51
+ };
52
+ };
53
+ export type MetricName = keyof typeof METRICS;
54
+ export type Labels = Record<string, string>;
55
+ export type Registry = {
56
+ inc(metric: MetricName, labels: Labels, value?: number): void;
57
+ observe(metric: MetricName, labels: Labels, seconds: number): void;
58
+ render(): string;
59
+ };
60
+ export type RegistryOptions = {
61
+ /** Distinct values the caller-supplied `operation` label may take, per metric. */
62
+ maxOperationLabels?: number;
63
+ };
64
+ /**
65
+ * A metric store with no dependencies. The `operation` label is the only one a
66
+ * caller controls, so it is the only one capped: past the cap every new name
67
+ * collapses into `other` rather than minting a series the scrape has to carry
68
+ * forever.
69
+ */
70
+ export declare const createRegistry: ({ maxOperationLabels, }?: RegistryOptions) => Registry;
71
+ export declare const configureMetrics: (settings: {
72
+ enabled: boolean;
73
+ } & RegistryOptions) => void;
74
+ /** Test seam: pass `null` to drop the process registry and its recorded series. */
75
+ export declare const setMetricsRegistry: (registry: Registry | null) => void;
76
+ export declare const isMetricsEnabled: () => boolean;
77
+ export declare const incMetric: (metric: MetricName, labels: Labels, value?: number) => void;
78
+ export declare const observeMetric: (metric: MetricName, labels: Labels, seconds: number) => void;
79
+ export declare const renderMetrics: () => string;
80
+ export {};
81
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/observability/metrics.ts"],"names":[],"mappings":"AAOA,QAAA,MAAM,OAAO;;iBAET,IAAI,EAAE,SAAS;iBACf,IAAI,EAAE,0CAA0C;iBAChD,UAAU;;;iBAGV,IAAI,EAAE,WAAW;iBACjB,IAAI,EAAE,sDAAsD;iBAC5D,UAAU;;;iBAGV,IAAI,EAAE,SAAS;iBACf,IAAI,EAAE,mEAAmE;iBACzE,UAAU;;;iBAGV,IAAI,EAAE,WAAW;iBACjB,IAAI,EAAE,mDAAmD;iBACzD,UAAU;;;iBAGV,IAAI,EAAE,SAAS;iBACf,IAAI,EAAE,qDAAqD;iBAC3D,UAAU;;;iBAGV,IAAI,EAAE,WAAW;iBACjB,IAAI,EAAE,wCAAwC;iBAC9C,UAAU;;;iBAGV,IAAI,EAAE,SAAS;iBACf,IAAI,EAAE,wDAAwD;iBAC9D,UAAU;;;iBAGV,IAAI,EAAE,SAAS;iBACf,IAAI,EAAE,wDAAwD;iBAC9D,UAAU;;;iBAGV,IAAI,EAAE,SAAS;iBACf,IAAI,EAAE,8EAA8E;iBACpF,UAAU;;;iBAGV,IAAI,EAAE,SAAS;iBACf,IAAI,EAAE,+CAA+C;iBACrD,UAAU;;CAEuC,CAAC;AAEtD,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,OAAO,CAAC;AAE9C,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE5C,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9D,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACnE,MAAM,IAAI,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAeF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,6BAExB,eAAe,KAAQ,QAqGzB,CAAC;AAeF,eAAO,MAAM,gBAAgB,aAAc;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,eAAe,KAAG,IAInF,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,kBAAkB,aAAc,QAAQ,GAAG,IAAI,KAAG,IAG9D,CAAC;AAQF,eAAO,MAAM,gBAAgB,QAAO,OAAkB,CAAC;AAEvD,eAAO,MAAM,SAAS,WAAY,UAAU,UAAU,MAAM,qBAAc,IAGzE,CAAC;AAEF,eAAO,MAAM,aAAa,WAAY,UAAU,UAAU,MAAM,WAAW,MAAM,KAAG,IAGnF,CAAC;AAEF,eAAO,MAAM,aAAa,QAAO,MAA6B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=metrics.perf.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.perf.test.d.ts","sourceRoot":"","sources":["../../../src/observability/metrics.perf.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=metrics.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.test.d.ts","sourceRoot":"","sources":["../../../src/observability/metrics.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import type { CapabilityGrant } from "../authentication/capabilities";
2
+ export type MetricsRouteOptions = {
3
+ path: string;
4
+ /** The header a scoped credential rides in — the admin-secret header. */
5
+ secretHeader: string;
6
+ authorize: (candidate: string | null) => CapabilityGrant | null;
7
+ render: () => string;
8
+ };
9
+ /**
10
+ * A scrape is gated because the exposition names operations, roles and
11
+ * databases. It is deliberately not rate limited: a scrape interval is fixed
12
+ * and counting it against a caller ceiling would drop samples.
13
+ */
14
+ export declare const createMetricsRoute: ({ path, secretHeader, authorize, render, }: MetricsRouteOptions) => {
15
+ [x: string]: {
16
+ GET: (req: Request) => Response;
17
+ };
18
+ };
19
+ //# sourceMappingURL=metricsRoute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metricsRoute.d.ts","sourceRoot":"","sources":["../../../src/observability/metricsRoute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAItE,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,KAAK,eAAe,GAAG,IAAI,CAAC;IAChE,MAAM,EAAE,MAAM,MAAM,CAAC;CACtB,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,+CAK5B,mBAAmB;;mBAEP,OAAO;;CAMpB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=metricsRoute.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metricsRoute.test.d.ts","sourceRoot":"","sources":["../../../src/observability/metricsRoute.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,92 @@
1
+ import type { Logger } from "pino";
2
+ export type SpanKind = "internal" | "server" | "client" | "producer" | "consumer";
3
+ export type SpanStatus = "unset" | "ok" | "error";
4
+ export type AttributeValue = string | number | boolean;
5
+ export type Attributes = Record<string, AttributeValue | undefined>;
6
+ /** What rides in the async context: three scalars, never the span itself. */
7
+ export type SpanContext = {
8
+ traceId: string;
9
+ spanId: string;
10
+ sampled: boolean;
11
+ };
12
+ export type SpanOptions = {
13
+ kind?: SpanKind;
14
+ attributes?: Attributes;
15
+ /** Overrides the active context — the inbound `traceparent`, or a deliberate root. */
16
+ parent?: SpanContext | null;
17
+ };
18
+ export type Span = {
19
+ readonly context: SpanContext;
20
+ setAttribute(key: string, value: AttributeValue | undefined): void;
21
+ setStatus(status: SpanStatus, message?: string): void;
22
+ recordError(error: unknown): void;
23
+ end(): void;
24
+ };
25
+ export type FinishedSpan = {
26
+ traceId: string;
27
+ spanId: string;
28
+ parentSpanId?: string;
29
+ name: string;
30
+ kind: SpanKind;
31
+ startTimeUnixNano: string;
32
+ endTimeUnixNano: string;
33
+ attributes: Attributes;
34
+ status: SpanStatus;
35
+ statusMessage?: string;
36
+ };
37
+ export type Tracer = {
38
+ startSpan(name: string, options?: SpanOptions): Span;
39
+ /** Runs `fn` with `span` active, ends it, and marks it errored if `fn` throws. */
40
+ withSpan<T>(name: string, options: SpanOptions, fn: (span: Span) => T | Promise<T>): Promise<T>;
41
+ active(): SpanContext | undefined;
42
+ flush(): Promise<void>;
43
+ };
44
+ export type TracerOptions = {
45
+ endpoint: string;
46
+ /** `k=v,k2=v2`, sent on every export — an API key for a hosted collector. */
47
+ headers?: string;
48
+ serviceName: string;
49
+ serviceVersion: string;
50
+ sampleRatio?: number;
51
+ maxBatch?: number;
52
+ maxQueue?: number;
53
+ /** `0` starts no timer, which is how a test drives the exporter by hand. */
54
+ exportIntervalMs?: number;
55
+ /** Test seam: where an export failure and a queue overflow are reported. */
56
+ log?: Pick<Logger, "warn">;
57
+ /** Test seam: the transport. Production POSTs with `fetch`. */
58
+ send?: (url: string, init: {
59
+ method: string;
60
+ headers: Record<string, string>;
61
+ body: string;
62
+ }) => Promise<void>;
63
+ };
64
+ export declare const parseTraceparent: (header: string | null | undefined) => SpanContext | undefined;
65
+ export declare const formatTraceparent: (context: SpanContext) => string;
66
+ /**
67
+ * A tracer with no dependencies: W3C ids, OTLP/HTTP JSON, and a bounded export
68
+ * queue. Nothing here reads process state — everything it needs is closed over,
69
+ * so it is unit-testable without booting a server.
70
+ */
71
+ export declare const createTracer: ({ endpoint, headers, serviceName, serviceVersion, sampleRatio, maxBatch, maxQueue, exportIntervalMs, send, log, }: TracerOptions) => Tracer;
72
+ export declare const configureTracing: (next: {
73
+ enabled: boolean;
74
+ endpoint: string;
75
+ headers: string;
76
+ serviceName: string;
77
+ sampleRatio: number;
78
+ }) => void;
79
+ /** Test seam: pass `null` to drop the process tracer and its queued spans. */
80
+ export declare const setTracer: (tracer: Tracer | null) => void;
81
+ export declare const isTracingEnabled: () => boolean;
82
+ export declare const startSpan: (name: string, options?: SpanOptions) => Span | undefined;
83
+ export declare const withSpan: <T>(name: string, options: SpanOptions, fn: (span: Span | undefined) => T | Promise<T>) => Promise<T>;
84
+ /**
85
+ * Runs `fn` with `span` active, leaving its lifetime to the caller. A span that
86
+ * is never ended is never exported, which is how a websocket upgrade — a
87
+ * request that is never answered — produces no span at all.
88
+ */
89
+ export declare const withActiveSpan: <T>(span: Span | undefined, fn: () => T) => T;
90
+ export declare const activeSpanContext: () => SpanContext | undefined;
91
+ export declare const flushSpans: () => Promise<void>;
92
+ //# sourceMappingURL=tracing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../../src/observability/tracing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tracing.perf.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracing.perf.test.d.ts","sourceRoot":"","sources":["../../../src/observability/tracing.perf.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tracing.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracing.test.d.ts","sourceRoot":"","sources":["../../../src/observability/tracing.test.ts"],"names":[],"mappings":""}
@@ -1,3 +1,4 @@
1
+ import { Kafka } from "kafkajs";
1
2
  import type { Consumer } from "kafkajs";
2
3
  import type { KafkaConfig } from "../types/zod/queue";
3
4
  export declare const startConsumer: (connectionName: string, name: string, topic: string, consumer: Consumer, _consumerGroup: string) => Promise<void>;
@@ -13,6 +14,11 @@ export type KafkaConnectionManager = {
13
14
  cleanup: () => Promise<void>;
14
15
  onPublishersChanged: (callback: () => void) => void;
15
16
  };
17
+ export type KafkaDependencies = {
18
+ /** Test seam: the manager builds its client through this. */
19
+ createKafka?: (config: ConstructorParameters<typeof Kafka>[0]) => Kafka;
20
+ };
21
+ export declare const createKafkaConnectionManager: (queueConfig: KafkaConfig, { createKafka }?: KafkaDependencies) => KafkaConnectionManager;
16
22
  export declare const startKafkaConnections: (queues: KafkaConfig[]) => Promise<{
17
23
  managers: KafkaConnectionManager[];
18
24
  publisherMap: () => Record<string, KafkaPublisher>;