@hiliosai/sdk 0.1.12 → 0.1.14

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 (53) hide show
  1. package/dist/index.d.ts +904 -0
  2. package/dist/index.js +1809 -0
  3. package/package.json +11 -2
  4. package/src/configs/constants.ts +0 -135
  5. package/src/configs/index.ts +0 -2
  6. package/src/configs/moleculer/bulkhead.ts +0 -8
  7. package/src/configs/moleculer/channels.ts +0 -102
  8. package/src/configs/moleculer/circuit-breaker.ts +0 -17
  9. package/src/configs/moleculer/index.ts +0 -98
  10. package/src/configs/moleculer/logger.ts +0 -17
  11. package/src/configs/moleculer/metrics.ts +0 -20
  12. package/src/configs/moleculer/registry.ts +0 -7
  13. package/src/configs/moleculer/retry-policy.ts +0 -17
  14. package/src/configs/moleculer/tracing.ts +0 -6
  15. package/src/configs/moleculer/tracking.ts +0 -6
  16. package/src/configs/permissions.ts +0 -109
  17. package/src/datasources/base.datasource.ts +0 -111
  18. package/src/datasources/extensions/index.ts +0 -11
  19. package/src/datasources/extensions/retry.extension.ts +0 -91
  20. package/src/datasources/extensions/soft-delete.extension.ts +0 -114
  21. package/src/datasources/extensions/tenant.extension.ts +0 -105
  22. package/src/datasources/index.ts +0 -3
  23. package/src/datasources/prisma.datasource.ts +0 -317
  24. package/src/env.ts +0 -12
  25. package/src/errors/auth.error.ts +0 -33
  26. package/src/errors/index.ts +0 -2
  27. package/src/errors/permission.error.ts +0 -17
  28. package/src/index.ts +0 -10
  29. package/src/middlewares/context-helpers.middleware.ts +0 -162
  30. package/src/middlewares/datasource.middleware.ts +0 -73
  31. package/src/middlewares/health.middleware.ts +0 -134
  32. package/src/middlewares/index.ts +0 -5
  33. package/src/middlewares/memoize.middleware.ts +0 -33
  34. package/src/middlewares/permissions.middleware.ts +0 -162
  35. package/src/mixins/datasource.mixin.ts +0 -111
  36. package/src/mixins/index.ts +0 -1
  37. package/src/service/define-integration.ts +0 -404
  38. package/src/service/define-service.ts +0 -58
  39. package/src/types/channels.ts +0 -60
  40. package/src/types/context.ts +0 -64
  41. package/src/types/datasource.ts +0 -23
  42. package/src/types/index.ts +0 -9
  43. package/src/types/integration.ts +0 -28
  44. package/src/types/message.ts +0 -128
  45. package/src/types/platform.ts +0 -39
  46. package/src/types/service.ts +0 -209
  47. package/src/types/tenant.ts +0 -4
  48. package/src/types/user.ts +0 -16
  49. package/src/utils/context-cache.ts +0 -70
  50. package/src/utils/index.ts +0 -8
  51. package/src/utils/permission-calculator.ts +0 -62
  52. package/tsconfig.json +0 -13
  53. package/tsup.config.ts +0 -5
@@ -1,111 +0,0 @@
1
- import type {ServiceBroker} from 'moleculer';
2
-
3
- import type {AppContext} from '../types/context';
4
-
5
- /**
6
- * Base datasource interface that all datasources should implement
7
- * Provides common structure and optional lifecycle methods
8
- */
9
- export interface BaseDatasource<TContext = AppContext> {
10
- /**
11
- * Datasource name for identification and logging
12
- */
13
- readonly name: string;
14
-
15
- /**
16
- * Service broker instance for logging, events, and service calls
17
- * Always available after datasource initialization
18
- */
19
- broker: ServiceBroker;
20
-
21
- /**
22
- * Current service context (only available during action execution)
23
- * Will be undefined in lifecycle hooks or background tasks
24
- */
25
- context?: TContext;
26
-
27
- /**
28
- * Optional initialization method
29
- * Called when datasource is instantiated
30
- */
31
- init?(): Promise<void> | void;
32
-
33
- /**
34
- * Optional connection method
35
- * Called when service starts if implemented
36
- */
37
- connect?(): Promise<void> | void;
38
-
39
- /**
40
- * Optional disconnection method
41
- * Called when service stops if implemented
42
- */
43
- disconnect?(): Promise<void> | void;
44
-
45
- /**
46
- * Optional health check method
47
- * Can be used to verify datasource is working correctly
48
- */
49
- healthCheck?(): Promise<boolean> | boolean;
50
-
51
- /**
52
- * Optional method to clear/reset the datasource
53
- */
54
- clear?(): Promise<void> | void;
55
- }
56
-
57
- /**
58
- * Abstract base class for datasources that provides default implementations
59
- * @example
60
- * ```typescript
61
- * export class UserDatasource extends AbstractDatasource {
62
- * readonly name = 'users';
63
- *
64
- * private users: User[] = [];
65
- *
66
- * async findById(id: string): Promise<User | undefined> {
67
- * this.broker?.logger.info('Finding user by ID:', id);
68
- * return this.users.find(u => u.id === id);
69
- * }
70
- *
71
- * async healthCheck(): Promise<boolean> {
72
- * this.broker?.logger.info('Health check for datasource', this.name);
73
- * return true;
74
- * }
75
- * }
76
- * ```
77
- */
78
- export abstract class AbstractDatasource<TContext = AppContext>
79
- implements BaseDatasource<TContext>
80
- {
81
- abstract readonly name: string;
82
-
83
- /**
84
- * Service broker instance - injected by mixin
85
- * Always available after initialization
86
- */
87
- broker!: ServiceBroker; // Using definite assignment assertion since it's injected
88
-
89
- /**
90
- * Current service context - injected per action
91
- * Only available during action execution
92
- */
93
- context?: TContext;
94
-
95
- /**
96
- * Default health check - always returns true
97
- * Override for custom health check logic
98
- */
99
- async healthCheck(): Promise<boolean> {
100
- this.broker.logger.info(`Health check for datasource - ${this.name}`);
101
- return true;
102
- }
103
-
104
- /**
105
- * Default clear method - does nothing
106
- * Override to implement clearing logic
107
- */
108
- async clear(): Promise<void> {
109
- // Default implementation - does nothing
110
- }
111
- }
@@ -1,11 +0,0 @@
1
- // Export all Prisma extensions for easy importing
2
- export { softDeleteExtension } from './soft-delete.extension';
3
- export { createTenantExtension } from './tenant.extension';
4
- export { retryExtension } from './retry.extension';
5
-
6
- // Re-export extension interfaces
7
- export type {
8
- SoftDeleteExtension,
9
- AuditTrailExtension,
10
- TenantExtension,
11
- } from '../prisma.datasource';
@@ -1,91 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- /**
3
- * Retry Extension for Prisma Transactions
4
- * Automatically retries failed transactions with exponential backoff
5
- *
6
- * Usage:
7
- * ```typescript
8
- * import { retryExtension } from './extensions/retry.extension';
9
- *
10
- * class MyPrismaDS extends PrismaDatasource<PrismaClient> {
11
- * protected applyExtensions(client: PrismaClient) {
12
- * return client.$extends(retryExtension);
13
- * }
14
- * }
15
- * ```
16
- */
17
-
18
- export const retryExtension = {
19
- name: 'Retry',
20
-
21
- client: {
22
- async $retryTransaction<T>(
23
- fn: (tx: any) => Promise<T>,
24
- options: {
25
- maxRetries?: number;
26
- baseDelay?: number;
27
- maxDelay?: number;
28
- retryableErrors?: string[];
29
- } = {}
30
- ): Promise<T> {
31
- const {
32
- maxRetries = 3,
33
- baseDelay = 100,
34
- maxDelay = 5000,
35
- retryableErrors = [
36
- 'P2034', // Transaction failed due to a write conflict
37
- 'P2002', // Unique constraint failed
38
- 'P5000', // Raw query failed
39
- ],
40
- } = options;
41
-
42
- let lastError: Error | undefined;
43
-
44
- for (let attempt = 0; attempt <= maxRetries; attempt++) {
45
- try {
46
- return await (this as any).$transaction(fn, {
47
- timeout: 10000,
48
- maxWait: 5000,
49
- });
50
- } catch (error: any) {
51
- lastError = error;
52
-
53
- // Check if error is retryable
54
- const isRetryable = retryableErrors.some(
55
- (code) => error.code === code || error.message?.includes(code)
56
- );
57
-
58
- if (!isRetryable || attempt === maxRetries) {
59
- throw error;
60
- }
61
-
62
- // Calculate delay with exponential backoff and jitter
63
- const delay = Math.min(
64
- baseDelay * Math.pow(2, attempt) + Math.random() * 100,
65
- maxDelay
66
- );
67
-
68
- // Log retry attempt (in production, use proper logger)
69
- if (
70
- typeof globalThis !== 'undefined' &&
71
- (globalThis as any).console
72
- ) {
73
- (globalThis as any).console.warn(
74
- `Transaction retry ${
75
- attempt + 1
76
- }/${maxRetries} after ${delay}ms:`,
77
- {
78
- error: error.message,
79
- code: error.code,
80
- }
81
- );
82
- }
83
-
84
- await new Promise((resolve) => setTimeout(resolve, delay));
85
- }
86
- }
87
-
88
- throw lastError ?? new Error('Transaction failed after maximum retries');
89
- },
90
- },
91
- };
@@ -1,114 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- /**
3
- * Soft Delete Extension for Prisma
4
- * Automatically handles soft deletes by setting deletedAt instead of removing records
5
- *
6
- * Usage:
7
- * ```typescript
8
- * import { softDeleteExtension } from './extensions/soft-delete.extension';
9
- *
10
- * class MyPrismaDS extends PrismaDatasource<PrismaClient> {
11
- * protected applyExtensions(client: PrismaClient) {
12
- * return client.$extends(softDeleteExtension);
13
- * }
14
- * }
15
- * ```
16
- *
17
- * Requires models to have `deletedAt DateTime?` field
18
- */
19
-
20
- export const softDeleteExtension = {
21
- name: 'SoftDelete',
22
-
23
- query: {
24
- // Apply to all models
25
- $allModels: {
26
- // Override findMany to exclude soft deleted records
27
- async findMany({args, query}: any) {
28
- // Add deletedAt: null filter if not already specified
29
- args.where ??= {};
30
- if (args.where.deletedAt === undefined) {
31
- args.where.deletedAt = null;
32
- }
33
- return query(args);
34
- },
35
-
36
- // Override findUnique to exclude soft deleted records
37
- async findUnique({args, query}: any) {
38
- args.where ??= {};
39
- if (args.where.deletedAt === undefined) {
40
- args.where.deletedAt = null;
41
- }
42
- return query(args);
43
- },
44
-
45
- // Override findFirst to exclude soft deleted records
46
- async findFirst({args, query}: any) {
47
- args.where ??= {};
48
- if (args.where.deletedAt === undefined) {
49
- args.where.deletedAt = null;
50
- }
51
- return query(args);
52
- },
53
-
54
- // Override delete to set deletedAt instead
55
- async delete({args, query}: any) {
56
- return query({
57
- ...args,
58
- data: {deletedAt: new Date()},
59
- });
60
- },
61
-
62
- // Override deleteMany to set deletedAt instead
63
- async deleteMany({args, query}: any) {
64
- return query({
65
- ...args,
66
- data: {deletedAt: new Date()},
67
- });
68
- },
69
- },
70
- },
71
-
72
- model: {
73
- $allModels: {
74
- // Add restore method to all models
75
- async restore<T>(this: T, where: any): Promise<any> {
76
- const context =
77
- (globalThis as any).Prisma?.getExtensionContext?.(this) ?? this;
78
-
79
- return (context as any).update({
80
- where,
81
- data: {deletedAt: null},
82
- });
83
- },
84
-
85
- // Add findWithDeleted method to include soft deleted records
86
- async findWithDeleted<T>(this: T, args: any): Promise<any> {
87
- const context =
88
- (globalThis as any).Prisma?.getExtensionContext?.(this) ?? this;
89
-
90
- return (context as any).findMany({
91
- ...args,
92
- where: {
93
- ...args.where,
94
- // Don't filter by deletedAt
95
- },
96
- });
97
- },
98
-
99
- // Add findDeleted method to find only soft deleted records
100
- async findDeleted<T>(this: T, args: any): Promise<any> {
101
- const context =
102
- (globalThis as any).Prisma?.getExtensionContext?.(this) ?? this;
103
-
104
- return (context as any).findMany({
105
- ...args,
106
- where: {
107
- ...args.where,
108
- deletedAt: {not: null},
109
- },
110
- });
111
- },
112
- },
113
- },
114
- };
@@ -1,105 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- /**
3
- * Multi-Tenant Extension for Prisma
4
- * Automatically filters queries by tenant context for multi-tenant applications
5
- *
6
- * Usage:
7
- * ```typescript
8
- * import { createTenantExtension } from './extensions/tenant.extension';
9
- *
10
- * class MyPrismaDS extends PrismaDatasource<PrismaClient> {
11
- * protected applyExtensions(client: PrismaClient) {
12
- * return client.$extends(createTenantExtension());
13
- * }
14
- * }
15
- * ```
16
- *
17
- * Requires models to have `tenantId String` field
18
- */
19
-
20
- interface TenantContext {
21
- currentTenantId: string | null;
22
- }
23
-
24
- export function createTenantExtension() {
25
- const tenantContext: TenantContext = {
26
- currentTenantId: null,
27
- };
28
-
29
- return {
30
- name: 'Tenant',
31
-
32
- client: {
33
- // Set tenant context
34
- $setTenant(tenantId: string) {
35
- tenantContext.currentTenantId = tenantId;
36
- },
37
-
38
- // Get current tenant
39
- $getCurrentTenant() {
40
- return tenantContext.currentTenantId;
41
- },
42
-
43
- // Clear tenant context
44
- $clearTenant() {
45
- tenantContext.currentTenantId = null;
46
- },
47
- },
48
-
49
- query: {
50
- $allModels: {
51
- // Automatically add tenantId filter to all read operations
52
- async findMany({args, query}: any) {
53
- if (tenantContext.currentTenantId) {
54
- args.where ??= {};
55
- args.where.tenantId ??= tenantContext.currentTenantId;
56
- }
57
- return query(args);
58
- },
59
-
60
- async findUnique({args, query}: any) {
61
- if (tenantContext.currentTenantId) {
62
- args.where ??= {};
63
- args.where.tenantId ??= tenantContext.currentTenantId;
64
- }
65
- return query(args);
66
- },
67
-
68
- async findFirst({args, query}: any) {
69
- if (tenantContext.currentTenantId) {
70
- args.where ??= {};
71
- args.where.tenantId ??= tenantContext.currentTenantId;
72
- }
73
- return query(args);
74
- },
75
-
76
- // Automatically add tenantId to create operations
77
- async create({args, query}: any) {
78
- if (tenantContext.currentTenantId) {
79
- args.data ??= {};
80
- args.data.tenantId ??= tenantContext.currentTenantId;
81
- }
82
- return query(args);
83
- },
84
-
85
- // Add tenantId filter to update operations
86
- async update({args, query}: any) {
87
- if (tenantContext.currentTenantId) {
88
- args.where ??= {};
89
- args.where.tenantId ??= tenantContext.currentTenantId;
90
- }
91
- return query(args);
92
- },
93
-
94
- // Add tenantId filter to delete operations
95
- async delete({args, query}: any) {
96
- if (tenantContext.currentTenantId) {
97
- args.where ??= {};
98
- args.where.tenantId ??= tenantContext.currentTenantId;
99
- }
100
- return query(args);
101
- },
102
- },
103
- },
104
- };
105
- }
@@ -1,3 +0,0 @@
1
- export * from './base.datasource';
2
- export * from './prisma.datasource';
3
- export * from './extensions';