@managesome/knotr-toolkit 0.8.6 → 0.8.8

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 (80) hide show
  1. package/dist/backend/index.d.ts +2 -1
  2. package/dist/backend/index.d.ts.map +1 -1
  3. package/dist/backend/index.js +2 -0
  4. package/dist/backend/index.js.map +1 -1
  5. package/dist/backend/service-auth.d.ts +54 -0
  6. package/dist/backend/service-auth.d.ts.map +1 -0
  7. package/dist/backend/service-auth.js +142 -0
  8. package/dist/backend/service-auth.js.map +1 -0
  9. package/dist/helpers/id-generator.d.ts +15 -5
  10. package/dist/helpers/id-generator.d.ts.map +1 -1
  11. package/dist/helpers/id-generator.js +18 -5
  12. package/dist/helpers/id-generator.js.map +1 -1
  13. package/dist/schemas/account.schema.d.ts +7 -4331
  14. package/dist/schemas/account.schema.d.ts.map +1 -1
  15. package/dist/schemas/chat.schema.d.ts +42 -4662
  16. package/dist/schemas/chat.schema.d.ts.map +1 -1
  17. package/dist/schemas/chat.schema.js +37 -3
  18. package/dist/schemas/chat.schema.js.map +1 -1
  19. package/dist/schemas/collaboration-request.schema.d.ts +8 -3917
  20. package/dist/schemas/collaboration-request.schema.d.ts.map +1 -1
  21. package/dist/schemas/company-review.schema.d.ts +7 -3421
  22. package/dist/schemas/company-review.schema.d.ts.map +1 -1
  23. package/dist/schemas/company.schema.d.ts +8 -6108
  24. package/dist/schemas/company.schema.d.ts.map +1 -1
  25. package/dist/schemas/contract.schema.d.ts +7 -5241
  26. package/dist/schemas/contract.schema.d.ts.map +1 -1
  27. package/dist/schemas/dispute-evidence.schema.d.ts +8 -3747
  28. package/dist/schemas/dispute-evidence.schema.d.ts.map +1 -1
  29. package/dist/schemas/dispute.schema.d.ts +8 -4926
  30. package/dist/schemas/dispute.schema.d.ts.map +1 -1
  31. package/dist/schemas/donation.schema.d.ts +8 -3552
  32. package/dist/schemas/donation.schema.d.ts.map +1 -1
  33. package/dist/schemas/escrow.schema.d.ts +8 -4279
  34. package/dist/schemas/escrow.schema.d.ts.map +1 -1
  35. package/dist/schemas/flag.schema.d.ts +8 -4332
  36. package/dist/schemas/flag.schema.d.ts.map +1 -1
  37. package/dist/schemas/interest.schema.d.ts +7 -3811
  38. package/dist/schemas/interest.schema.d.ts.map +1 -1
  39. package/dist/schemas/match.schema.d.ts +7 -3941
  40. package/dist/schemas/match.schema.d.ts.map +1 -1
  41. package/dist/schemas/message.schema.d.ts +7 -4071
  42. package/dist/schemas/message.schema.d.ts.map +1 -1
  43. package/dist/schemas/milestone.schema.d.ts +8 -4267
  44. package/dist/schemas/milestone.schema.d.ts.map +1 -1
  45. package/dist/schemas/notification.schema.d.ts +8 -4595
  46. package/dist/schemas/notification.schema.d.ts.map +1 -1
  47. package/dist/schemas/profile.schema.d.ts +16 -9241
  48. package/dist/schemas/profile.schema.d.ts.map +1 -1
  49. package/dist/schemas/profit-share-agreement.schema.d.ts +7 -3746
  50. package/dist/schemas/profit-share-agreement.schema.d.ts.map +1 -1
  51. package/dist/schemas/profit-share.schema.d.ts +7 -4006
  52. package/dist/schemas/profit-share.schema.d.ts.map +1 -1
  53. package/dist/schemas/promo-code.schema.d.ts +7 -3876
  54. package/dist/schemas/promo-code.schema.d.ts.map +1 -1
  55. package/dist/schemas/proposal.schema.d.ts +8 -5139
  56. package/dist/schemas/proposal.schema.d.ts.map +1 -1
  57. package/dist/schemas/purchase.schema.d.ts +8 -3682
  58. package/dist/schemas/purchase.schema.d.ts.map +1 -1
  59. package/dist/schemas/requirement-post.schema.d.ts +8 -6272
  60. package/dist/schemas/requirement-post.schema.d.ts.map +1 -1
  61. package/dist/schemas/review.schema.d.ts +8 -4462
  62. package/dist/schemas/review.schema.d.ts.map +1 -1
  63. package/dist/schemas/service-listing.schema.d.ts +8 -5109
  64. package/dist/schemas/service-listing.schema.d.ts.map +1 -1
  65. package/dist/schemas/subscription.schema.d.ts +8 -3942
  66. package/dist/schemas/subscription.schema.d.ts.map +1 -1
  67. package/dist/schemas/tmc-application.schema.d.ts +8 -4316
  68. package/dist/schemas/tmc-application.schema.d.ts.map +1 -1
  69. package/dist/schemas/tmc-membership.schema.d.ts +8 -3942
  70. package/dist/schemas/tmc-membership.schema.d.ts.map +1 -1
  71. package/dist/schemas/trust-badge.schema.d.ts +7 -3876
  72. package/dist/schemas/trust-badge.schema.d.ts.map +1 -1
  73. package/dist/schemas/verification.schema.d.ts +8 -4564
  74. package/dist/schemas/verification.schema.d.ts.map +1 -1
  75. package/dist/schemas/webhook-event.schema.d.ts +7 -3489
  76. package/dist/schemas/webhook-event.schema.d.ts.map +1 -1
  77. package/dist/types/chat.d.ts +6 -1
  78. package/dist/types/chat.d.ts.map +1 -1
  79. package/dist/types/chat.js.map +1 -1
  80. package/package.json +1 -1
@@ -1,8 +1,9 @@
1
1
  export { getConfig, getConfigValue, initConfig, isConfigInitialized, type ServiceConfig } from './config.js';
2
- export { createLogger, logger, type LogEntry, type LogLevel, type Logger } from './logger.js';
2
+ export { createLogger, logger, type LogEntry, type Logger, type LogLevel } from './logger.js';
3
3
  export { connectDatabase, disconnectDatabase, getDatabaseConnection, getMongoose, isDatabaseConnected, setMongoose, } from './database.js';
4
4
  export { emitNotification, getFirebaseAdmin, getFirebaseAuth, getFirebaseMessaging, getFirebaseStorage, getFirestore, getRealtimeDatabase, initFirebase, isFirebaseInitialized, sendMulticastNotification, sendPushNotification, setFirebaseAdmin, type PushNotificationData, } from './firebase.js';
5
5
  export { postWorkerRequest, scheduleWorkerRequest, scheduleWorkerRequestAt, setCloudTasksClient, type WorkerRequestOptions, type WorkerRequestPayload, } from './worker-queue.js';
6
6
  export { closeRedisConnections, createRedisClients, getRedisClient, getRedisPubClient, getRedisSubClient, redisDel, redisGet, redisPublish, redisSet, redisSubscribe, setRedisClients, } from './redis.js';
7
7
  export { emitChatMessage, emitNewMatch, emitReadReceipt, emitTypingIndicator, getSocketServer, hasSocketServer, ioEmitToAccount, ioEmitToChat, ioEmitToMatch, ioEmitToUser, setSocketServer, subscribeToSocketEvents, type ChatMessagePayload, type NewMatchPayload, } from './socket.js';
8
+ export { clearServiceTokenCache, getServiceToken, setGoogleAuth, validateServiceRequest, verifyServiceToken, } from './service-auth.js';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAG7G,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAG9F,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,EACX,mBAAmB,EACnB,WAAW,GACZ,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,oBAAoB,GAC1B,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,eAAe,EACf,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,eAAe,EACf,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,eAAe,EACf,uBAAuB,EACvB,KAAK,kBAAkB,EACvB,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAG7G,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG9F,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,EACX,mBAAmB,EACnB,WAAW,GACZ,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,oBAAoB,GAC1B,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,eAAe,EACf,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,eAAe,EACf,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,eAAe,EACf,uBAAuB,EACvB,KAAK,kBAAkB,EACvB,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,aAAa,EACb,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC"}
@@ -16,4 +16,6 @@ export { postWorkerRequest, scheduleWorkerRequest, scheduleWorkerRequestAt, setC
16
16
  export { closeRedisConnections, createRedisClients, getRedisClient, getRedisPubClient, getRedisSubClient, redisDel, redisGet, redisPublish, redisSet, redisSubscribe, setRedisClients, } from './redis.js';
17
17
  // Socket.IO
18
18
  export { emitChatMessage, emitNewMatch, emitReadReceipt, emitTypingIndicator, getSocketServer, hasSocketServer, ioEmitToAccount, ioEmitToChat, ioEmitToMatch, ioEmitToUser, setSocketServer, subscribeToSocketEvents, } from './socket.js';
19
+ // Service-to-Service Authentication (Google OAuth2)
20
+ export { clearServiceTokenCache, getServiceToken, setGoogleAuth, validateServiceRequest, verifyServiceToken, } from './service-auth.js';
19
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,oCAAoC;AACpC,gDAAgD;AAChD,+CAA+C;AAE/C,gBAAgB;AAChB,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,EAAsB,MAAM,aAAa,CAAC;AAE7G,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,MAAM,EAA6C,MAAM,aAAa,CAAC;AAE9F,WAAW;AACX,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,EACX,mBAAmB,EACnB,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,WAAW;AACX,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,gBAAgB,GAEjB,MAAM,eAAe,CAAC;AAEvB,6BAA6B;AAC7B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,GAGpB,MAAM,mBAAmB,CAAC;AAE3B,QAAQ;AACR,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,YAAY;AACZ,OAAO,EACL,eAAe,EACf,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,eAAe,EACf,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,eAAe,EACf,uBAAuB,GAGxB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,oCAAoC;AACpC,gDAAgD;AAChD,+CAA+C;AAE/C,gBAAgB;AAChB,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,EAAsB,MAAM,aAAa,CAAC;AAE7G,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,MAAM,EAA6C,MAAM,aAAa,CAAC;AAE9F,WAAW;AACX,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,EACX,mBAAmB,EACnB,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,WAAW;AACX,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,gBAAgB,GAEjB,MAAM,eAAe,CAAC;AAEvB,6BAA6B;AAC7B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,GAGpB,MAAM,mBAAmB,CAAC;AAE3B,QAAQ;AACR,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,YAAY;AACZ,OAAO,EACL,eAAe,EACf,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,eAAe,EACf,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,eAAe,EACf,uBAAuB,GAGxB,MAAM,aAAa,CAAC;AAErB,oDAAoD;AACpD,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,aAAa,EACb,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Set the google-auth-library module instance
3
+ * This should be called before using service auth functions
4
+ *
5
+ * @example
6
+ * import * as googleAuth from 'google-auth-library';
7
+ * setGoogleAuth(googleAuth);
8
+ */
9
+ export declare function setGoogleAuth(googleAuth: any): void;
10
+ /**
11
+ * Get a Google OAuth2 ID token for service-to-service authentication
12
+ * Uses Application Default Credentials (works on Google Cloud and locally with GOOGLE_APPLICATION_CREDENTIALS)
13
+ *
14
+ * @param targetAudience - The audience (typically the receiving service URL)
15
+ * @returns The ID token string
16
+ *
17
+ * @example
18
+ * const token = await getServiceToken('https://my-service-abc123.run.app');
19
+ * fetch(url, { headers: { Authorization: `Bearer ${token}` } });
20
+ */
21
+ export declare function getServiceToken(targetAudience: string): Promise<string>;
22
+ /**
23
+ * Verify a Google OAuth2 ID token from another service
24
+ * Used by the receiving service to validate incoming service-to-service calls
25
+ *
26
+ * @param token - The ID token to verify
27
+ * @param expectedAudience - The expected audience (this service's URL)
28
+ * @returns The decoded token payload if valid
29
+ */
30
+ export declare function verifyServiceToken(token: string, expectedAudience: string): Promise<{
31
+ iss: string;
32
+ sub: string;
33
+ aud: string;
34
+ exp: number;
35
+ iat: number;
36
+ email?: string;
37
+ email_verified?: boolean;
38
+ }>;
39
+ /**
40
+ * Clear the token cache (useful for testing)
41
+ */
42
+ export declare function clearServiceTokenCache(): void;
43
+ /**
44
+ * Check if a request has valid service-to-service authentication
45
+ * Returns the verified payload or null if not a service request
46
+ *
47
+ * @param authHeader - The Authorization header value
48
+ * @param expectedAudience - The expected audience
49
+ */
50
+ export declare function validateServiceRequest(authHeader: string | undefined, expectedAudience: string): Promise<{
51
+ isServiceRequest: boolean;
52
+ payload?: Awaited<ReturnType<typeof verifyServiceToken>>;
53
+ }>;
54
+ //# sourceMappingURL=service-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-auth.d.ts","sourceRoot":"","sources":["../../src/backend/service-auth.ts"],"names":[],"mappings":"AAiBA;;;;;;;GAOG;AAEH,wBAAgB,aAAa,CAAC,UAAU,EAAE,GAAG,GAAG,IAAI,CAEnD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8C7E;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC;IACT,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC,CA+BD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC;IAAE,gBAAgB,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAA;CAAE,CAAC,CAqBlG"}
@@ -0,0 +1,142 @@
1
+ // ============================================
2
+ // Service-to-Service Authentication
3
+ // Google OAuth2 ID Token generation for internal service calls
4
+ // ============================================
5
+ import { logger } from './logger.js';
6
+ // Store google-auth-library instance to avoid hard dependency
7
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
+ let googleAuthInstance = null;
9
+ // Cache for ID tokens (keyed by audience)
10
+ const tokenCache = new Map();
11
+ // Buffer time before expiry to refresh token (5 minutes)
12
+ const TOKEN_REFRESH_BUFFER_MS = 5 * 60 * 1000;
13
+ /**
14
+ * Set the google-auth-library module instance
15
+ * This should be called before using service auth functions
16
+ *
17
+ * @example
18
+ * import * as googleAuth from 'google-auth-library';
19
+ * setGoogleAuth(googleAuth);
20
+ */
21
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
+ export function setGoogleAuth(googleAuth) {
23
+ googleAuthInstance = googleAuth;
24
+ }
25
+ /**
26
+ * Get a Google OAuth2 ID token for service-to-service authentication
27
+ * Uses Application Default Credentials (works on Google Cloud and locally with GOOGLE_APPLICATION_CREDENTIALS)
28
+ *
29
+ * @param targetAudience - The audience (typically the receiving service URL)
30
+ * @returns The ID token string
31
+ *
32
+ * @example
33
+ * const token = await getServiceToken('https://my-service-abc123.run.app');
34
+ * fetch(url, { headers: { Authorization: `Bearer ${token}` } });
35
+ */
36
+ export async function getServiceToken(targetAudience) {
37
+ if (!googleAuthInstance) {
38
+ throw new Error('Google Auth not initialized. Call setGoogleAuth() first.');
39
+ }
40
+ // Check cache
41
+ const cached = tokenCache.get(targetAudience);
42
+ if (cached && cached.expiresAt > Date.now() + TOKEN_REFRESH_BUFFER_MS) {
43
+ return cached.token;
44
+ }
45
+ try {
46
+ // Create an IAM-based ID token client
47
+ const auth = new googleAuthInstance.GoogleAuth();
48
+ const client = await auth.getIdTokenClient(targetAudience);
49
+ // Get the ID token
50
+ const tokenResponse = await client.getRequestHeaders();
51
+ const authHeader = tokenResponse.Authorization;
52
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
53
+ throw new Error('Invalid token response from Google Auth');
54
+ }
55
+ const token = authHeader.replace('Bearer ', '');
56
+ // Parse token to get expiry (JWT format: header.payload.signature)
57
+ const payload = JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString());
58
+ const expiresAt = (payload.exp || 0) * 1000; // Convert to milliseconds
59
+ // Cache the token
60
+ tokenCache.set(targetAudience, { token, expiresAt });
61
+ logger.debug('Service token generated', {
62
+ audience: targetAudience,
63
+ expiresIn: Math.round((expiresAt - Date.now()) / 1000) + 's',
64
+ });
65
+ return token;
66
+ }
67
+ catch (error) {
68
+ logger.error('Failed to get service token', {
69
+ audience: targetAudience,
70
+ error: error instanceof Error ? error.message : String(error),
71
+ });
72
+ throw error;
73
+ }
74
+ }
75
+ /**
76
+ * Verify a Google OAuth2 ID token from another service
77
+ * Used by the receiving service to validate incoming service-to-service calls
78
+ *
79
+ * @param token - The ID token to verify
80
+ * @param expectedAudience - The expected audience (this service's URL)
81
+ * @returns The decoded token payload if valid
82
+ */
83
+ export async function verifyServiceToken(token, expectedAudience) {
84
+ if (!googleAuthInstance) {
85
+ throw new Error('Google Auth not initialized. Call setGoogleAuth() first.');
86
+ }
87
+ try {
88
+ const client = new googleAuthInstance.OAuth2Client();
89
+ const ticket = await client.verifyIdToken({
90
+ idToken: token,
91
+ audience: expectedAudience,
92
+ });
93
+ const payload = ticket.getPayload();
94
+ if (!payload) {
95
+ throw new Error('Token payload is empty');
96
+ }
97
+ logger.debug('Service token verified', {
98
+ email: payload.email,
99
+ audience: payload.aud,
100
+ });
101
+ return payload;
102
+ }
103
+ catch (error) {
104
+ logger.error('Failed to verify service token', {
105
+ error: error instanceof Error ? error.message : String(error),
106
+ });
107
+ throw error;
108
+ }
109
+ }
110
+ /**
111
+ * Clear the token cache (useful for testing)
112
+ */
113
+ export function clearServiceTokenCache() {
114
+ tokenCache.clear();
115
+ }
116
+ /**
117
+ * Check if a request has valid service-to-service authentication
118
+ * Returns the verified payload or null if not a service request
119
+ *
120
+ * @param authHeader - The Authorization header value
121
+ * @param expectedAudience - The expected audience
122
+ */
123
+ export async function validateServiceRequest(authHeader, expectedAudience) {
124
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
125
+ return { isServiceRequest: false };
126
+ }
127
+ const token = authHeader.replace('Bearer ', '');
128
+ try {
129
+ const payload = await verifyServiceToken(token, expectedAudience);
130
+ // Service tokens have specific characteristics
131
+ // They come from service accounts (email ends with .iam.gserviceaccount.com)
132
+ if (payload.email && payload.email.endsWith('.iam.gserviceaccount.com')) {
133
+ return { isServiceRequest: true, payload };
134
+ }
135
+ return { isServiceRequest: false };
136
+ }
137
+ catch {
138
+ // If verification fails, it's not a valid service request
139
+ return { isServiceRequest: false };
140
+ }
141
+ }
142
+ //# sourceMappingURL=service-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-auth.js","sourceRoot":"","sources":["../../src/backend/service-auth.ts"],"names":[],"mappings":"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"}
@@ -87,12 +87,22 @@ export declare const ID_PREFIXES: {
87
87
  readonly VERIFICATION: "vrf";
88
88
  readonly FLAG: "flg";
89
89
  readonly ADMIN: "adm";
90
- readonly LISTING: "lst";
91
- readonly PROPOSAL: "prp";
92
- readonly CONTRACT: "ctr";
93
- readonly MILESTONE: "mls";
94
- readonly DISPUTE: "dsp";
95
90
  readonly NOTIFICATION: "ntf";
91
+ readonly REQUIREMENT: "req";
92
+ readonly LISTING: "lst";
93
+ readonly PROPOSAL: "prop";
94
+ readonly CONTRACT: "con";
95
+ readonly MILESTONE: "mil";
96
+ readonly ESCROW: "esc";
97
+ readonly DISPUTE: "disp";
98
+ readonly DISPUTE_EVIDENCE: "evid";
99
+ readonly REVIEW: "rev";
100
+ readonly TMC_APPLICATION: "tapp";
101
+ readonly TMC_MEMBERSHIP: "tmem";
102
+ readonly TRUST_BADGE: "badge";
103
+ readonly PROFIT_SHARE: "pshare";
104
+ readonly PROFIT_SHARE_AGREEMENT: "psagr";
105
+ readonly COLLABORATION_REQUEST: "collab";
96
106
  };
97
107
  export type IdPrefix = (typeof ID_PREFIXES)[keyof typeof ID_PREFIXES];
98
108
  //# sourceMappingURL=id-generator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"id-generator.d.ts","sourceRoot":"","sources":["../../src/helpers/id-generator.ts"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM,CAEpD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM,CAEzD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,MAAU,GAAG,MAAM,CAE9D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,GAAE,MAAU,GAAG,MAAM,CAEnE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;CAmBd,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,CAAC"}
1
+ {"version":3,"file":"id-generator.d.ts","sourceRoot":"","sources":["../../src/helpers/id-generator.ts"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM,CAEpD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM,CAEzD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,MAAU,GAAG,MAAM,CAE9D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,GAAE,MAAU,GAAG,MAAM,CAEnE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCd,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,CAAC"}
@@ -106,6 +106,7 @@ export function generatePrefixedId(prefix, size = 16) {
106
106
  * ID prefixes for different entity types
107
107
  */
108
108
  export const ID_PREFIXES = {
109
+ // Core entities
109
110
  ACCOUNT: 'acc',
110
111
  PROFILE: 'prf',
111
112
  MATCH: 'mtc',
@@ -118,11 +119,23 @@ export const ID_PREFIXES = {
118
119
  VERIFICATION: 'vrf',
119
120
  FLAG: 'flg',
120
121
  ADMIN: 'adm',
121
- LISTING: 'lst',
122
- PROPOSAL: 'prp',
123
- CONTRACT: 'ctr',
124
- MILESTONE: 'mls',
125
- DISPUTE: 'dsp',
126
122
  NOTIFICATION: 'ntf',
123
+ // Marketplace entities
124
+ REQUIREMENT: 'req',
125
+ LISTING: 'lst',
126
+ PROPOSAL: 'prop',
127
+ CONTRACT: 'con',
128
+ MILESTONE: 'mil',
129
+ ESCROW: 'esc',
130
+ DISPUTE: 'disp',
131
+ DISPUTE_EVIDENCE: 'evid',
132
+ REVIEW: 'rev',
133
+ // TMC entities
134
+ TMC_APPLICATION: 'tapp',
135
+ TMC_MEMBERSHIP: 'tmem',
136
+ TRUST_BADGE: 'badge',
137
+ PROFIT_SHARE: 'pshare',
138
+ PROFIT_SHARE_AGREEMENT: 'psagr',
139
+ COLLABORATION_REQUEST: 'collab',
127
140
  };
128
141
  //# sourceMappingURL=id-generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"id-generator.js","sourceRoot":"","sources":["../../src/helpers/id-generator.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,gDAAgD;AAChD,+CAA+C;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhD;;;GAGG;AACH,MAAM,iBAAiB,GAAG,yDAAyD,CAAC;AAEpF;;GAEG;AACH,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAEtC;;GAEG;AACH,MAAM,qBAAqB,GAAG,kCAAkC,CAAC;AAEjE,+CAA+C;AAC/C,MAAM,gBAAgB,GAAG,cAAc,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC/D,MAAM,gBAAgB,GAAG,cAAc,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;AAC7D,MAAM,aAAa,GAAG,cAAc,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;AAE/D;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE;IAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE;IAC/C,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB,CAAC;IACpD,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,wBAAwB,CAAC,SAAiB,CAAC;IACzD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,OAAe,EAAE;IAClE,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,KAAK;IACZ,QAAQ,EAAE,KAAK;IACf,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,KAAK;IACd,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,KAAK;IACd,YAAY,EAAE,KAAK;IACnB,IAAI,EAAE,KAAK;IACX,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,KAAK;IAChB,OAAO,EAAE,KAAK;IACd,YAAY,EAAE,KAAK;CACX,CAAC"}
1
+ {"version":3,"file":"id-generator.js","sourceRoot":"","sources":["../../src/helpers/id-generator.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,gDAAgD;AAChD,+CAA+C;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhD;;;GAGG;AACH,MAAM,iBAAiB,GAAG,yDAAyD,CAAC;AAEpF;;GAEG;AACH,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAEtC;;GAEG;AACH,MAAM,qBAAqB,GAAG,kCAAkC,CAAC;AAEjE,+CAA+C;AAC/C,MAAM,gBAAgB,GAAG,cAAc,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC/D,MAAM,gBAAgB,GAAG,cAAc,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;AAC7D,MAAM,aAAa,GAAG,cAAc,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;AAE/D;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE;IAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE;IAC/C,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB,CAAC;IACpD,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,wBAAwB,CAAC,SAAiB,CAAC;IACzD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,OAAe,EAAE;IAClE,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,gBAAgB;IAChB,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,KAAK;IACZ,QAAQ,EAAE,KAAK;IACf,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,KAAK;IACd,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,KAAK;IACd,YAAY,EAAE,KAAK;IACnB,IAAI,EAAE,KAAK;IACX,KAAK,EAAE,KAAK;IACZ,YAAY,EAAE,KAAK;IAEnB,uBAAuB;IACvB,WAAW,EAAE,KAAK;IAClB,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,MAAM;IACf,gBAAgB,EAAE,MAAM;IACxB,MAAM,EAAE,KAAK;IAEb,eAAe;IACf,eAAe,EAAE,MAAM;IACvB,cAAc,EAAE,MAAM;IACtB,WAAW,EAAE,OAAO;IACpB,YAAY,EAAE,QAAQ;IACtB,sBAAsB,EAAE,OAAO;IAC/B,qBAAqB,EAAE,QAAQ;CACvB,CAAC"}