@engjts/nexus 0.1.7 → 0.1.9

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 (259) hide show
  1. package/dist/advanced/playground/generatePlaygroundHTML.d.ts.map +1 -1
  2. package/dist/advanced/playground/generatePlaygroundHTML.js +107 -0
  3. package/dist/advanced/playground/generatePlaygroundHTML.js.map +1 -1
  4. package/dist/advanced/playground/playground.d.ts +19 -0
  5. package/dist/advanced/playground/playground.d.ts.map +1 -1
  6. package/dist/advanced/playground/playground.js +70 -0
  7. package/dist/advanced/playground/playground.js.map +1 -1
  8. package/dist/advanced/playground/types.d.ts +20 -0
  9. package/dist/advanced/playground/types.d.ts.map +1 -1
  10. package/dist/core/application.d.ts +14 -0
  11. package/dist/core/application.d.ts.map +1 -1
  12. package/dist/core/application.js +173 -71
  13. package/dist/core/application.js.map +1 -1
  14. package/dist/core/context-pool.d.ts +2 -13
  15. package/dist/core/context-pool.d.ts.map +1 -1
  16. package/dist/core/context-pool.js +7 -45
  17. package/dist/core/context-pool.js.map +1 -1
  18. package/dist/core/context.d.ts +108 -5
  19. package/dist/core/context.d.ts.map +1 -1
  20. package/dist/core/context.js +449 -53
  21. package/dist/core/context.js.map +1 -1
  22. package/dist/core/index.d.ts +1 -0
  23. package/dist/core/index.d.ts.map +1 -1
  24. package/dist/core/index.js +9 -1
  25. package/dist/core/index.js.map +1 -1
  26. package/dist/core/middleware.d.ts +6 -0
  27. package/dist/core/middleware.d.ts.map +1 -1
  28. package/dist/core/middleware.js +83 -84
  29. package/dist/core/middleware.js.map +1 -1
  30. package/dist/core/performance/fast-json.d.ts +149 -0
  31. package/dist/core/performance/fast-json.d.ts.map +1 -0
  32. package/dist/core/performance/fast-json.js +473 -0
  33. package/dist/core/performance/fast-json.js.map +1 -0
  34. package/dist/core/router/file-router.d.ts +20 -7
  35. package/dist/core/router/file-router.d.ts.map +1 -1
  36. package/dist/core/router/file-router.js +41 -13
  37. package/dist/core/router/file-router.js.map +1 -1
  38. package/dist/core/router/index.d.ts +6 -0
  39. package/dist/core/router/index.d.ts.map +1 -1
  40. package/dist/core/router/index.js +33 -6
  41. package/dist/core/router/index.js.map +1 -1
  42. package/dist/core/router/radix-tree.d.ts +4 -1
  43. package/dist/core/router/radix-tree.d.ts.map +1 -1
  44. package/dist/core/router/radix-tree.js +7 -3
  45. package/dist/core/router/radix-tree.js.map +1 -1
  46. package/dist/core/serializer.d.ts +251 -0
  47. package/dist/core/serializer.d.ts.map +1 -0
  48. package/dist/core/serializer.js +290 -0
  49. package/dist/core/serializer.js.map +1 -0
  50. package/dist/core/types.d.ts +39 -1
  51. package/dist/core/types.d.ts.map +1 -1
  52. package/dist/core/types.js.map +1 -1
  53. package/dist/index.d.ts +1 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +12 -2
  56. package/dist/index.js.map +1 -1
  57. package/package.json +3 -1
  58. package/documentation/01-getting-started.md +0 -240
  59. package/documentation/02-context.md +0 -335
  60. package/documentation/03-routing.md +0 -397
  61. package/documentation/04-middleware.md +0 -483
  62. package/documentation/05-validation.md +0 -514
  63. package/documentation/06-error-handling.md +0 -465
  64. package/documentation/07-performance.md +0 -364
  65. package/documentation/08-adapters.md +0 -470
  66. package/documentation/09-api-reference.md +0 -548
  67. package/documentation/10-examples.md +0 -582
  68. package/documentation/11-deployment.md +0 -477
  69. package/documentation/12-sentry.md +0 -620
  70. package/documentation/13-sentry-data-storage.md +0 -996
  71. package/documentation/14-sentry-data-reference.md +0 -457
  72. package/documentation/15-sentry-summary.md +0 -409
  73. package/documentation/16-alerts-system.md +0 -745
  74. package/documentation/17-alert-adapters.md +0 -696
  75. package/documentation/18-alerts-implementation-summary.md +0 -385
  76. package/documentation/19-class-based-routing.md +0 -840
  77. package/documentation/20-websocket-realtime.md +0 -813
  78. package/documentation/21-cache-system.md +0 -510
  79. package/documentation/22-job-queue.md +0 -772
  80. package/documentation/23-sentry-plugin.md +0 -551
  81. package/documentation/24-testing-utilities.md +0 -1287
  82. package/documentation/25-api-versioning.md +0 -533
  83. package/documentation/26-context-store.md +0 -607
  84. package/documentation/27-dependency-injection.md +0 -329
  85. package/documentation/28-lifecycle-hooks.md +0 -521
  86. package/documentation/29-package-structure.md +0 -196
  87. package/documentation/30-plugin-system.md +0 -414
  88. package/documentation/31-jwt-authentication.md +0 -597
  89. package/documentation/32-cli.md +0 -268
  90. package/documentation/ALERTS-COMPLETE-SUMMARY.md +0 -429
  91. package/documentation/ALERTS-INDEX.md +0 -330
  92. package/documentation/ALERTS-QUICK-REFERENCE.md +0 -286
  93. package/documentation/README.md +0 -178
  94. package/documentation/index.html +0 -34
  95. package/modern_framework_paper.md +0 -1870
  96. package/public/css/style.css +0 -87
  97. package/public/index.html +0 -34
  98. package/public/js/app.js +0 -27
  99. package/src/advanced/cache/InMemoryCacheStore.ts +0 -68
  100. package/src/advanced/cache/MultiTierCache.ts +0 -194
  101. package/src/advanced/cache/RedisCacheStore.ts +0 -341
  102. package/src/advanced/cache/index.ts +0 -5
  103. package/src/advanced/cache/types.ts +0 -40
  104. package/src/advanced/graphql/SimpleDataLoader.ts +0 -42
  105. package/src/advanced/graphql/index.ts +0 -22
  106. package/src/advanced/graphql/server.ts +0 -252
  107. package/src/advanced/graphql/types.ts +0 -42
  108. package/src/advanced/jobs/InMemoryQueueStore.ts +0 -68
  109. package/src/advanced/jobs/JobQueue.ts +0 -556
  110. package/src/advanced/jobs/RedisQueueStore.ts +0 -367
  111. package/src/advanced/jobs/index.ts +0 -5
  112. package/src/advanced/jobs/types.ts +0 -70
  113. package/src/advanced/observability/APMManager.ts +0 -163
  114. package/src/advanced/observability/AlertManager.ts +0 -109
  115. package/src/advanced/observability/MetricRegistry.ts +0 -151
  116. package/src/advanced/observability/ObservabilityCenter.ts +0 -304
  117. package/src/advanced/observability/StructuredLogger.ts +0 -154
  118. package/src/advanced/observability/TracingManager.ts +0 -117
  119. package/src/advanced/observability/adapters.ts +0 -304
  120. package/src/advanced/observability/createObservabilityMiddleware.ts +0 -63
  121. package/src/advanced/observability/index.ts +0 -11
  122. package/src/advanced/observability/types.ts +0 -174
  123. package/src/advanced/playground/extractPathParams.ts +0 -6
  124. package/src/advanced/playground/generateFieldExample.ts +0 -31
  125. package/src/advanced/playground/generatePlaygroundHTML.ts +0 -1849
  126. package/src/advanced/playground/generateSummary.ts +0 -19
  127. package/src/advanced/playground/getTagFromPath.ts +0 -9
  128. package/src/advanced/playground/index.ts +0 -8
  129. package/src/advanced/playground/playground.ts +0 -170
  130. package/src/advanced/playground/types.ts +0 -20
  131. package/src/advanced/playground/zodToExample.ts +0 -16
  132. package/src/advanced/playground/zodToParams.ts +0 -15
  133. package/src/advanced/postman/buildAuth.ts +0 -31
  134. package/src/advanced/postman/buildBody.ts +0 -15
  135. package/src/advanced/postman/buildQueryParams.ts +0 -27
  136. package/src/advanced/postman/buildRequestItem.ts +0 -36
  137. package/src/advanced/postman/buildResponses.ts +0 -11
  138. package/src/advanced/postman/buildUrl.ts +0 -33
  139. package/src/advanced/postman/capitalize.ts +0 -4
  140. package/src/advanced/postman/generateCollection.ts +0 -59
  141. package/src/advanced/postman/generateEnvironment.ts +0 -34
  142. package/src/advanced/postman/generateExampleFromZod.ts +0 -21
  143. package/src/advanced/postman/generateFieldExample.ts +0 -45
  144. package/src/advanced/postman/generateName.ts +0 -20
  145. package/src/advanced/postman/generateUUID.ts +0 -11
  146. package/src/advanced/postman/getTagFromPath.ts +0 -10
  147. package/src/advanced/postman/index.ts +0 -28
  148. package/src/advanced/postman/postman.ts +0 -156
  149. package/src/advanced/postman/slugify.ts +0 -7
  150. package/src/advanced/postman/types.ts +0 -140
  151. package/src/advanced/realtime/index.ts +0 -18
  152. package/src/advanced/realtime/websocket.ts +0 -231
  153. package/src/advanced/sentry/index.ts +0 -1236
  154. package/src/advanced/sentry/types.ts +0 -355
  155. package/src/advanced/static/generateDirectoryListing.ts +0 -47
  156. package/src/advanced/static/generateETag.ts +0 -7
  157. package/src/advanced/static/getMimeType.ts +0 -9
  158. package/src/advanced/static/index.ts +0 -32
  159. package/src/advanced/static/isSafePath.ts +0 -13
  160. package/src/advanced/static/publicDir.ts +0 -21
  161. package/src/advanced/static/serveStatic.ts +0 -225
  162. package/src/advanced/static/spa.ts +0 -24
  163. package/src/advanced/static/types.ts +0 -159
  164. package/src/advanced/swagger/SwaggerGenerator.ts +0 -66
  165. package/src/advanced/swagger/buildOperation.ts +0 -61
  166. package/src/advanced/swagger/buildParameters.ts +0 -61
  167. package/src/advanced/swagger/buildRequestBody.ts +0 -21
  168. package/src/advanced/swagger/buildResponses.ts +0 -54
  169. package/src/advanced/swagger/capitalize.ts +0 -5
  170. package/src/advanced/swagger/convertPath.ts +0 -9
  171. package/src/advanced/swagger/createSwagger.ts +0 -12
  172. package/src/advanced/swagger/generateOperationId.ts +0 -21
  173. package/src/advanced/swagger/generateSpec.ts +0 -105
  174. package/src/advanced/swagger/generateSummary.ts +0 -24
  175. package/src/advanced/swagger/generateSwaggerUI.ts +0 -70
  176. package/src/advanced/swagger/generateThemeCss.ts +0 -53
  177. package/src/advanced/swagger/index.ts +0 -25
  178. package/src/advanced/swagger/swagger.ts +0 -237
  179. package/src/advanced/swagger/types.ts +0 -206
  180. package/src/advanced/swagger/zodFieldToOpenAPI.ts +0 -94
  181. package/src/advanced/swagger/zodSchemaToOpenAPI.ts +0 -50
  182. package/src/advanced/swagger/zodToOpenAPI.ts +0 -22
  183. package/src/advanced/testing/factory.ts +0 -509
  184. package/src/advanced/testing/harness.ts +0 -612
  185. package/src/advanced/testing/index.ts +0 -430
  186. package/src/advanced/testing/load-test.ts +0 -618
  187. package/src/advanced/testing/mock-server.ts +0 -498
  188. package/src/advanced/testing/mock.ts +0 -670
  189. package/src/cli/bin.ts +0 -9
  190. package/src/cli/cli.ts +0 -158
  191. package/src/cli/commands/add.ts +0 -178
  192. package/src/cli/commands/build.ts +0 -73
  193. package/src/cli/commands/create.ts +0 -166
  194. package/src/cli/commands/dev.ts +0 -85
  195. package/src/cli/commands/generate.ts +0 -99
  196. package/src/cli/commands/help.ts +0 -95
  197. package/src/cli/commands/init.ts +0 -91
  198. package/src/cli/commands/version.ts +0 -38
  199. package/src/cli/index.ts +0 -6
  200. package/src/cli/templates/generators.ts +0 -359
  201. package/src/cli/templates/index.ts +0 -680
  202. package/src/cli/utils/exec.ts +0 -52
  203. package/src/cli/utils/file-system.ts +0 -78
  204. package/src/cli/utils/logger.ts +0 -111
  205. package/src/core/adapter.ts +0 -88
  206. package/src/core/application.ts +0 -1335
  207. package/src/core/context-pool.ts +0 -127
  208. package/src/core/context.ts +0 -412
  209. package/src/core/index.ts +0 -80
  210. package/src/core/middleware.ts +0 -262
  211. package/src/core/performance/buffer-pool.ts +0 -108
  212. package/src/core/performance/middleware-optimizer.ts +0 -162
  213. package/src/core/plugin/PluginManager.ts +0 -435
  214. package/src/core/plugin/builder.ts +0 -358
  215. package/src/core/plugin/index.ts +0 -50
  216. package/src/core/plugin/types.ts +0 -214
  217. package/src/core/router/file-router.ts +0 -594
  218. package/src/core/router/index.ts +0 -227
  219. package/src/core/router/radix-tree.ts +0 -226
  220. package/src/core/store/index.ts +0 -30
  221. package/src/core/store/registry.ts +0 -178
  222. package/src/core/store/request-store.ts +0 -240
  223. package/src/core/store/types.ts +0 -233
  224. package/src/core/types.ts +0 -574
  225. package/src/database/adapter.ts +0 -35
  226. package/src/database/adapters/index.ts +0 -1
  227. package/src/database/adapters/mysql.ts +0 -669
  228. package/src/database/database.ts +0 -70
  229. package/src/database/dialect.ts +0 -388
  230. package/src/database/index.ts +0 -12
  231. package/src/database/migrations.ts +0 -86
  232. package/src/database/optimizer.ts +0 -125
  233. package/src/database/query-builder.ts +0 -404
  234. package/src/database/realtime.ts +0 -53
  235. package/src/database/schema.ts +0 -71
  236. package/src/database/transactions.ts +0 -56
  237. package/src/database/types.ts +0 -87
  238. package/src/deployment/cluster.ts +0 -471
  239. package/src/deployment/config.ts +0 -454
  240. package/src/deployment/docker.ts +0 -599
  241. package/src/deployment/graceful-shutdown.ts +0 -373
  242. package/src/deployment/index.ts +0 -56
  243. package/src/index.ts +0 -264
  244. package/src/security/adapter.ts +0 -318
  245. package/src/security/auth/JWTPlugin.ts +0 -234
  246. package/src/security/auth/JWTProvider.ts +0 -316
  247. package/src/security/auth/adapter.ts +0 -12
  248. package/src/security/auth/jwt.ts +0 -234
  249. package/src/security/auth/middleware.ts +0 -188
  250. package/src/security/csrf.ts +0 -220
  251. package/src/security/headers.ts +0 -108
  252. package/src/security/index.ts +0 -60
  253. package/src/security/rate-limit/adapter.ts +0 -7
  254. package/src/security/rate-limit/memory.ts +0 -108
  255. package/src/security/rate-limit/middleware.ts +0 -181
  256. package/src/security/sanitization.ts +0 -75
  257. package/src/security/types.ts +0 -240
  258. package/src/security/utils.ts +0 -52
  259. package/tsconfig.json +0 -39
@@ -1,457 +0,0 @@
1
- # Sentry Data Storage - Quick Reference
2
-
3
- Referensi cepat tentang data yang dikirim ke Sentry dalam Nexus Framework.
4
-
5
- ## 1. Event Metadata (SELALU DIKIRIM)
6
-
7
- | Data | Nilai Contoh | Scope | Sensitivitas |
8
- |------|-------------|-------|-------------|
9
- | `event_id` | `a1b2c3d4` | Unique per event | ❌ Non-sensitive |
10
- | `timestamp` | `1701619200` | Time of error | ❌ Non-sensitive |
11
- | `platform` | `node` | Always Node.js | ❌ Non-sensitive |
12
- | `level` | `error`, `warning`, `info` | Set by dev | ❌ Non-sensitive |
13
- | `environment` | `production`, `staging` | Configuration | ❌ Non-sensitive |
14
- | `release` | `1.0.0` | App version | ❌ Non-sensitive |
15
-
16
- **Kesimpulan**: ✅ Aman untuk dikirim
17
-
18
- ---
19
-
20
- ## 2. Exception/Error Data (JIKA ADA ERROR)
21
-
22
- | Data | Nilai Contoh | Scope | Sensitivitas |
23
- |------|-------------|-------|-------------|
24
- | `exception.type` | `ValidationError` | Error class name | ❌ Non-sensitive |
25
- | `exception.message` | `Email is invalid` | Error message | ⚠️ Bisa sensitive |
26
- | `stacktrace.filename` | `/app/src/handlers/user.ts` | File path | ❌ Non-sensitive |
27
- | `stacktrace.function` | `createUser` | Function name | ❌ Non-sensitive |
28
- | `stacktrace.lineno` | `42` | Line number | ❌ Non-sensitive |
29
- | `stacktrace.context_line` | `const user = await db.find(id);` | Actual code | ⚠️ Bisa reveal logic |
30
-
31
- **Kesimpulan**: ⚠️ Perlu difilter jika ada data sensitif dalam error message
32
-
33
- **Contoh Filtering**:
34
- ```typescript
35
- beforeSend: (event) => {
36
- if (event.exception?.values?.[0]?.value?.includes('password')) {
37
- event.exception.values[0].value = '[REDACTED]';
38
- }
39
- return event;
40
- }
41
- ```
42
-
43
- ---
44
-
45
- ## 3. Server Context (SELALU DIKIRIM)
46
-
47
- | Data | Nilai Contoh | Scope | Sensitivitas |
48
- |------|-------------|-------|-------------|
49
- | `server_name` | `api-server-1` | Hostname | ⚠️ Bisa reveal infrastructure |
50
- | `contexts.runtime.name` | `node` | Node.js | ❌ Non-sensitive |
51
- | `contexts.runtime.version` | `v20.10.0` | Node version | ❌ Non-sensitive |
52
- | `contexts.os.name` | `linux` | Operating system | ⚠️ Infrastructure info |
53
- | `contexts.os.version` | `x64` | Architecture | ⚠️ Infrastructure info |
54
-
55
- **Kesimpulan**: ⚠️ Reveal infrastructure, tapi biasanya aman untuk production
56
-
57
- **Trik**: Gunakan generic name untuk `server_name`:
58
- ```typescript
59
- app.sentry({
60
- serverName: `api-server-${process.env.REGION || 'unknown'}`
61
- });
62
- ```
63
-
64
- ---
65
-
66
- ## 4. User Context (CONDITIONAL - Dari `extractUser`)
67
-
68
- | Data | Nilai Contoh | Scope | Sensitivitas |
69
- |------|-------------|-------|-------------|
70
- | `user.id` | `user-12345` | User identifier | ✅ Safe for PII |
71
- | `user.email` | `john@example.com` | Email address | ⚠️ PII (Personal Identifiable Info) |
72
- | `user.username` | `john_doe` | Username | ⚠️ PII |
73
- | `user.ip_address` | `192.168.1.1` | IP address | ⚠️ PII |
74
- | `user.custom_field` | Any custom data | Custom context | ⚠️ Tergantung data |
75
-
76
- **Kesimpulan**: ⚠️ SENSITIVE - Hanya kirim jika perlu & user setuju
77
-
78
- **Kontrol Data**:
79
- ```typescript
80
- app.sentry({
81
- sendDefaultPii: false // Default
82
- }, {
83
- extractUser: (ctx) => {
84
- if (!ctx.user) return null;
85
-
86
- return {
87
- id: ctx.user.id,
88
- // email: ctx.user.email, // Jangan kirim tanpa persetujuan
89
- // username: ctx.user.name, // Jangan kirim tanpa persetujuan
90
- subscription_tier: ctx.user.plan // Non-PII, safe
91
- };
92
- }
93
- });
94
- ```
95
-
96
- **GDPR Compliance**:
97
- - Email/username adalah PII
98
- - Perlu user consent
99
- - User bisa request deletion
100
-
101
- ---
102
-
103
- ## 5. HTTP Request Context (DARI MIDDLEWARE)
104
-
105
- | Data | Nilai Contoh | Scope | Sensitivitas |
106
- |------|-------------|-------|-------------|
107
- | `request.url` | `https://api.example.com/api/users` | Full URL | ✅ Safe |
108
- | `request.method` | `POST` | HTTP method | ✅ Safe |
109
- | `request.query_string` | `sort=name&limit=10` | Query params | ⚠️ Bisa contain tokens |
110
- | `request.headers.user-agent` | `Mozilla/5.0...` | Browser info | ✅ Safe |
111
- | `request.headers.authorization` | `Bearer token123` | Auth token | 🔴 SENSITIVE |
112
- | `request.data` | `{name: "John", email: "..."}` | Request body | ⚠️ Bisa contain sensitive |
113
-
114
- **Kesimpulan**: 🔴 SENSITIVE - Perlu exclude headers & filter body
115
-
116
- **Kontrol Data**:
117
- ```typescript
118
- app.sentry({}, {
119
- // Include request body?
120
- includeRequestBody: false, // Default
121
-
122
- // Include headers?
123
- includeHeaders: true,
124
-
125
- // Exclude sensitive headers
126
- excludeHeaders: [
127
- 'authorization',
128
- 'cookie',
129
- 'x-api-key',
130
- 'x-auth-token',
131
- 'x-csrf-token',
132
- 'password'
133
- ]
134
- });
135
- ```
136
-
137
- **Contoh Safe**:
138
- ```json
139
- {
140
- "request": {
141
- "url": "https://api.example.com/api/checkout",
142
- "method": "POST",
143
- "headers": {
144
- "user-agent": "Mozilla/5.0...",
145
- "content-type": "application/json"
146
- }
147
- // authorization DIHAPUS
148
- // data DIHAPUS
149
- }
150
- }
151
- ```
152
-
153
- **Contoh NOT Safe**:
154
- ```json
155
- {
156
- "request": {
157
- "headers": {
158
- "authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." // 🔴
159
- },
160
- "data": {
161
- "credit_card": "4111-1111-1111-1111", // 🔴
162
- "password": "super_secret_123" // 🔴
163
- }
164
- }
165
- }
166
- ```
167
-
168
- ---
169
-
170
- ## 6. Tags (GLOBAL + PER-EVENT)
171
-
172
- | Data | Nilai Contoh | Scope | Sensitivitas |
173
- |------|-------------|-------|-------------|
174
- | `tags.http.method` | `POST` | Auto-added | ✅ Safe |
175
- | `tags.http.status_code` | `500` | Auto-added | ✅ Safe |
176
- | `tags.environment` | `production` | Configuration | ✅ Safe |
177
- | `tags.team` | `backend` | Custom | ✅ Safe |
178
- | `tags.feature` | `payments` | Custom | ✅ Safe |
179
- | `tags.user_id` | `user-123` | Custom | ✅ Safe |
180
-
181
- **Kesimpulan**: ✅ Tags safe untuk dikirim, berguna untuk filtering
182
-
183
- **Penggunaan**:
184
- ```typescript
185
- // Global tags
186
- app.sentry({
187
- tags: {
188
- app: 'my-api',
189
- version: '1.0.0',
190
- team: 'backend',
191
- region: 'us-east-1'
192
- }
193
- });
194
-
195
- // Per-event tags
196
- captureException(error, {
197
- tags: {
198
- module: 'payments',
199
- operation: 'charge',
200
- priority: 'high'
201
- }
202
- });
203
- ```
204
-
205
- ---
206
-
207
- ## 7. Extra Context (GLOBAL + PER-EVENT)
208
-
209
- | Data | Nilai Contoh | Scope | Sensitivitas |
210
- |------|-------------|-------|-------------|
211
- | `extra.order_id` | `order-456` | Custom ID | ✅ Safe |
212
- | `extra.user_id` | `user-123` | Custom ID | ✅ Safe |
213
- | `extra.amount` | `99.99` | Amount | ✅ Safe |
214
- | `extra.payment_method` | `credit_card` | Type | ✅ Safe |
215
- | `extra.db_query_time_ms` | `245` | Performance | ✅ Safe |
216
- | `extra.raw_request_body` | Full body object | Custom | 🔴 SENSITIVE |
217
-
218
- **Kesimpulan**: ⚠️ Extra useful tapi careful dengan sensitive data
219
-
220
- **Safe Extra**:
221
- ```typescript
222
- setExtra('checkout_context', {
223
- order_id: 'order-456',
224
- user_tier: 'premium',
225
- cart_items: 3,
226
- total: 99.99,
227
- payment_method: 'credit_card', // Type only, not details
228
- processing_time_ms: 245
229
- });
230
- ```
231
-
232
- **NOT Safe Extra**:
233
- ```typescript
234
- setExtra('raw_request', {
235
- password: 'user_password', // 🔴
236
- credit_card: '4111-1111-1111-1111', // 🔴
237
- full_body: req.body // 🔴 Might contain sensitive data
238
- });
239
- ```
240
-
241
- ---
242
-
243
- ## 8. Breadcrumbs (PER-REQUEST, MAX 100)
244
-
245
- | Data | Nilai Contoh | Scope | Sensitivitas |
246
- |------|-------------|-------|-------------|
247
- | `type` | `http`, `database`, `error` | Event type | ✅ Safe |
248
- | `category` | `http.request`, `db.query` | Category | ✅ Safe |
249
- | `message` | `GET /api/users` | Short message | ✅ Safe |
250
- | `level` | `info`, `warning`, `error` | Severity | ✅ Safe |
251
- | `data.url` | `/api/users` | URL | ✅ Safe |
252
- | `data.status_code` | `200` | HTTP status | ✅ Safe |
253
- | `data.duration_ms` | `45` | Duration | ✅ Safe |
254
- | `data.query` | Full SQL query | SQL statement | ⚠️ Bisa reveal schema |
255
-
256
- **Kesimpulan**: ✅ Breadcrumbs mostly safe, tapi careful dengan SQL queries
257
-
258
- **Safe Breadcrumbs**:
259
- ```typescript
260
- addBreadcrumb({
261
- type: 'http',
262
- category: 'api.call',
263
- message: 'Fetching user',
264
- data: {
265
- method: 'GET',
266
- url: '/api/users/123',
267
- status_code: 200,
268
- duration_ms: 45
269
- }
270
- });
271
-
272
- addBreadcrumb({
273
- type: 'query',
274
- category: 'database',
275
- message: 'Find user by ID',
276
- data: {
277
- operation: 'SELECT',
278
- table: 'users',
279
- duration_ms: 15
280
- // Jangan: full_query: 'SELECT * FROM users WHERE...'
281
- }
282
- });
283
- ```
284
-
285
- ---
286
-
287
- ## 9. Performance Tracing (CONDITIONAL)
288
-
289
- | Data | Nilai Contoh | Scope | Sensitivitas |
290
- |------|-------------|-------|-------------|
291
- | `trace_id` | `a1b2c3d4e5f6` | Unique trace | ✅ Safe |
292
- | `span_id` | `k1l2m3n4` | Unique span | ✅ Safe |
293
- | `op` | `http.server`, `db.query` | Operation | ✅ Safe |
294
- | `status` | `ok`, `error` | Status | ✅ Safe |
295
- | `duration` | `245ms` | Duration | ✅ Safe |
296
- | `tags` | Various | Custom tags | ✅ Safe if no PII |
297
- | `data` | Various | Performance data | ✅ Safe if no sensitive |
298
-
299
- **Kesimpulan**: ✅ Performance data safe, berguna untuk optimization
300
-
301
- ---
302
-
303
- ## Quick Checklist: Apa Boleh/Tidak Boleh
304
-
305
- ### ✅ AMAN untuk dikirim:
306
- - [x] Error messages (non-sensitive)
307
- - [x] Stack traces
308
- - [x] HTTP method & status codes
309
- - [x] URLs (tanpa sensitive query params)
310
- - [x] Timestamps
311
- - [x] Performance metrics (duration, latency)
312
- - [x] Feature flags
313
- - [x] User IDs (anonymous identifiers)
314
- - [x] Error codes
315
- - [x] Tags & breadcrumbs
316
-
317
- ### 🔴 JANGAN dikirim:
318
- - [ ] Passwords
319
- - [ ] API keys & tokens
320
- - [ ] Credit card numbers
321
- - [ ] Full request bodies (tanpa filtering)
322
- - [ ] Authorization headers (kecuali di-sanitize)
323
- - [ ] Database connection strings
324
- - [ ] Private keys
325
- - [ ] Full SQL queries (bisa reveal schema)
326
- - [ ] PII tanpa consent (email, username, IP)
327
-
328
- ### ⚠️ CAREFUL (Filter dulu):
329
- - [ ] Email addresses
330
- - [ ] Phone numbers
331
- - [ ] URLs dengan sensitive query params
332
- - [ ] Custom user data
333
- - [ ] Full error messages (bisa contain sensitive data)
334
-
335
- ---
336
-
337
- ## Contoh Implementasi Aman
338
-
339
- ```typescript
340
- import { createApp } from 'nexus';
341
-
342
- const app = createApp();
343
-
344
- app.sentry({
345
- dsn: process.env.SENTRY_DSN!,
346
- environment: process.env.NODE_ENV,
347
- release: process.env.npm_package_version,
348
-
349
- // Global tags - safe data only
350
- tags: {
351
- app: 'my-api',
352
- team: 'backend',
353
- region: process.env.AWS_REGION
354
- },
355
-
356
- // Global extra - safe data only
357
- extra: {
358
- database: 'postgres',
359
- cache: 'redis',
360
- version: '1.0.0'
361
- },
362
-
363
- // Send default PII? No!
364
- sendDefaultPii: false,
365
-
366
- // Filter events before sending
367
- beforeSend: (event, hint) => {
368
- const error = hint?.originalException;
369
-
370
- // Remove sensitive from error message
371
- if (error?.message) {
372
- event.exception?.values?.forEach(exc => {
373
- exc.value = exc.value
374
- .replace(/token[:=]\s*\S+/gi, 'token=[REDACTED]')
375
- .replace(/password[:=]\s*\S+/gi, 'password=[REDACTED]')
376
- .replace(/apikey[:=]\s*\S+/gi, 'apikey=[REDACTED]');
377
- });
378
- }
379
-
380
- // Remove request body
381
- if (event.request?.data) {
382
- delete event.request.data;
383
- }
384
-
385
- return event;
386
- }
387
- }, {
388
- // Middleware config
389
- includeRequestBody: false,
390
- includeHeaders: true,
391
-
392
- // Exclude sensitive headers
393
- excludeHeaders: [
394
- 'authorization',
395
- 'cookie',
396
- 'x-api-key',
397
- 'x-auth-token',
398
- 'x-csrf-token',
399
- 'proxy-authorization'
400
- ],
401
-
402
- // Ignore health check paths
403
- ignorePaths: ['/health', '/metrics', '/__nexus/health'],
404
-
405
- // Extract only safe user data
406
- extractUser: (ctx) => {
407
- if (!ctx.user) return null;
408
-
409
- return {
410
- id: ctx.user.id, // Safe: user ID
411
- subscription_tier: ctx.user.plan, // Safe: subscription tier
412
- // email: ctx.user.email, // NOT included without consent
413
- // phone: ctx.user.phone // NOT included without consent
414
- };
415
- }
416
- });
417
-
418
- app.listen(3000);
419
- ```
420
-
421
- ---
422
-
423
- ## Troubleshooting
424
-
425
- ### "Terlalu banyak data dikirim"
426
- ```typescript
427
- // Reduce trace sample rate
428
- app.sentry({
429
- tracesSampleRate: 0.05 // 5% instead of 10%
430
- });
431
- ```
432
-
433
- ### "Data sensitif terlihat di Sentry"
434
- ```typescript
435
- // Use beforeSend to filter
436
- beforeSend: (event) => {
437
- // Scrub sensitive data
438
- return event;
439
- }
440
- ```
441
-
442
- ### "Quota Sentry penuh"
443
- ```typescript
444
- // Reduce error sample rate
445
- app.sentry({
446
- sampleRate: 0.5 // 50% instead of 100%
447
- });
448
-
449
- // Or ignore certain errors
450
- app.sentry({
451
- ignoreErrors: [
452
- 'NetworkError',
453
- '404',
454
- 'timeout'
455
- ]
456
- });
457
- ```