monorise 1.1.0-dev.5 → 1.1.0-dev.6
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monorise-core.d.ts","sourceRoot":"","sources":["../../components/monorise-core.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,KAAK,oBAAoB,GAAG;IAC1B,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;CAC3C,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;CAC3B,CAAC;AAEF,qBAAa,YAAY;IACvB,SAAgB,EAAE,EAAE,MAAM,CAAC;IAC3B,SAAgB,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC;IAC1C,SAAgB,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,SAAgB,KAAK,EAAE,WAAW,CAAC;IACnC,SAAgB,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC7C,SAAgB,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC;gBAE5C,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"monorise-core.d.ts","sourceRoot":"","sources":["../../components/monorise-core.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,KAAK,oBAAoB,GAAG;IAC1B,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;CAC3C,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;CAC3B,CAAC;AAEF,qBAAa,YAAY;IACvB,SAAgB,EAAE,EAAE,MAAM,CAAC;IAC3B,SAAgB,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC;IAC1C,SAAgB,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,SAAgB,KAAK,EAAE,WAAW,CAAC;IACnC,SAAgB,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC7C,SAAgB,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC;gBAE5C,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB;CAyRhD"}
|
package/dist/sst/index.js
CHANGED
|
@@ -454,17 +454,7 @@ var MonoriseCore = class {
|
|
|
454
454
|
CORE_TABLE: this.table.table.name,
|
|
455
455
|
CORE_EVENT_BUS: this.bus.name
|
|
456
456
|
};
|
|
457
|
-
const appHandlerLinks = [this.table.table, this.bus, secretApiKeys];
|
|
458
|
-
this.api.route("ANY /core/{proxy+}", {
|
|
459
|
-
name: appHandlerName,
|
|
460
|
-
handler: `${dotMonorisePath}/handle.appHandler`,
|
|
461
|
-
link: [this.table.table, this.bus, secretApiKeys, ...(_b = args == null ? void 0 : args.link) != null ? _b : []],
|
|
462
|
-
environment: {
|
|
463
|
-
API_KEYS: secretApiKeys.value,
|
|
464
|
-
CORE_TABLE: this.table.table.name,
|
|
465
|
-
CORE_EVENT_BUS: this.bus.name
|
|
466
|
-
}
|
|
467
|
-
});
|
|
457
|
+
const appHandlerLinks = [this.table.table, this.bus, secretApiKeys, ...(_b = args == null ? void 0 : args.link) != null ? _b : []];
|
|
468
458
|
this.alarmTopic = new sst.aws.SnsTopic(`${id}-monorise-dlq-alarm-topic`);
|
|
469
459
|
const environment = {
|
|
470
460
|
CORE_TABLE: this.table.table.name,
|
package/dist/sst/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../components/monorise-core.ts","../constants/event.ts","../components/dashboard.ts","../components/q-function.ts","../components/single-table.ts","../constants/table.ts","../index.ts"],"sourcesContent":["import path from 'node:path';\nimport { EVENT, SOURCE } from '../constants/event';\nimport { createFunctionWidgets } from './dashboard';\nimport { QFunction } from './q-function';\nimport { SingleTable } from './single-table';\n\ntype WebSocketHandlerArgs = {\n memory?: sst.aws.FunctionArgs['memory'];\n timeout?: sst.aws.FunctionArgs['timeout'];\n};\n\ntype WebSocketConfig = {\n enabled: true;\n handler?: WebSocketHandlerArgs;\n};\n\ntype MonoriseCoreArgs = {\n tableTtl?: string;\n slackWebhook?: string;\n allowHeaders?: string[];\n allowOrigins?: string[];\n configRoot?: string;\n webSocket?: WebSocketConfig;\n link?: $util.Input<any[]>;\n};\n\nexport class MonoriseCore {\n public readonly id: string;\n public readonly api: sst.aws.ApiGatewayV2;\n public readonly bus: sst.aws.Bus;\n public readonly table: SingleTable;\n public readonly alarmTopic: sst.aws.SnsTopic;\n public readonly websocket?: sst.aws.ApiGatewayWebSocket;\n\n constructor(id: string, args?: MonoriseCoreArgs) {\n const runtime: sst.aws.FunctionArgs['runtime'] = 'nodejs22.x';\n const configRootCommand = args?.configRoot\n ? `--config-root ${args?.configRoot}`\n : '';\n const dotMonorisePath = path.join(args?.configRoot ?? '', '.monorise');\n\n new sst.x.DevCommand('Monorise', {\n dev: {\n autostart: true,\n command: `npx monorise dev ${configRootCommand}`,\n },\n });\n\n this.id = id;\n\n this.api = new sst.aws.ApiGatewayV2(`${id}-monorise-api`, {\n cors: {\n allowMethods: ['*'],\n allowCredentials: true,\n allowHeaders: [\n ...(args?.allowHeaders ? args.allowHeaders : []),\n 'Content-Type',\n 'Authorization',\n ],\n allowOrigins: args?.allowOrigins,\n },\n });\n\n this.bus = new sst.aws.Bus(`${id}-monorise-bus`);\n this.table = new SingleTable(id, {\n ttl: args?.tableTtl,\n runtime,\n configRoot: args?.configRoot,\n });\n\n const secretApiKeys = new sst.Secret('API_KEYS', '[\"secret1\", \"secret2\"]');\n\n const appHandlerName = `${$app.stage}-${$app.name}-${id}-app-handler`;\n const appHandlerEnvironment: Record<string, any> = {\n API_KEYS: secretApiKeys.value,\n CORE_TABLE: this.table.table.name,\n CORE_EVENT_BUS: this.bus.name,\n };\n const appHandlerLinks: any[] = [this.table.table, this.bus, secretApiKeys];\n this.api.route('ANY /core/{proxy+}', {\n name: appHandlerName,\n handler: `${dotMonorisePath}/handle.appHandler`,\n link: [this.table.table, this.bus, secretApiKeys, ...(args?.link ?? [])],\n environment: {\n API_KEYS: secretApiKeys.value,\n CORE_TABLE: this.table.table.name,\n CORE_EVENT_BUS: this.bus.name,\n },\n });\n\n this.alarmTopic = new sst.aws.SnsTopic(`${id}-monorise-dlq-alarm-topic`);\n\n const environment = {\n CORE_TABLE: this.table.table.name,\n CORE_EVENT_BUS: this.bus.name,\n };\n\n /**\n * Event Processors\n */\n const mutualProcessorName = `${$app.stage}-${$app.name}-${id}-mutual-processor`;\n const tagProcessorName = `${$app.stage}-${$app.name}-${id}-tag-processor`;\n const treeProcessorName = `${$app.stage}-${$app.name}-${id}-tree-processor`;\n\n const mutualProcessor = new QFunction('mutual', {\n name: mutualProcessorName,\n handler: `${dotMonorisePath}/handle.mutualHandler`,\n memory: '512 MB',\n timeout: '30 seconds',\n visibilityTimeout: '30 seconds',\n alarmTopic: this.alarmTopic,\n runtime,\n environment,\n link: [this.table.table, this.bus],\n });\n\n const tagProcessor = new QFunction('tag', {\n name: tagProcessorName,\n handler: `${dotMonorisePath}/handle.tagHandler`,\n memory: '512 MB',\n timeout: '30 seconds',\n visibilityTimeout: '30 seconds',\n alarmTopic: this.alarmTopic,\n runtime,\n environment,\n link: [this.table.table],\n });\n\n const treeProcessor = new QFunction('tree', {\n name: treeProcessorName,\n handler: `${dotMonorisePath}/handle.treeHandler`,\n memory: '512 MB',\n timeout: '30 seconds',\n visibilityTimeout: '30 seconds',\n alarmTopic: this.alarmTopic,\n runtime,\n environment,\n link: [this.table.table],\n });\n\n this.bus.subscribeQueue(`${id}-mutual-queue-rule`, mutualProcessor.queue, {\n pattern: {\n source: [SOURCE.CORE],\n detailType: [\n EVENT.CORE.ENTITY_MUTUAL_TO_CREATE.DetailType,\n EVENT.CORE.ENTITY_MUTUAL_TO_UPDATE.DetailType,\n ],\n },\n });\n\n this.bus.subscribeQueue(`${id}-tag-queue-rule`, tagProcessor.queue, {\n pattern: {\n source: [SOURCE.CORE],\n detailType: [\n EVENT.CORE.ENTITY_CREATED.DetailType,\n EVENT.CORE.ENTITY_UPDATED.DetailType,\n ],\n },\n });\n\n this.bus.subscribeQueue(`${id}-tree-queue-rule`, treeProcessor.queue, {\n pattern: {\n source: [SOURCE.CORE],\n detailType: [\n EVENT.CORE.ENTITY_MUTUAL_PROCESSED.DetailType,\n EVENT.CORE.PREJOIN_RELATIONSHIP_SYNC.DetailType,\n ],\n },\n });\n\n /**\n * Optional WebSocket Setup\n */\n if (args?.webSocket?.enabled) {\n const memory = args.webSocket.handler?.memory ?? '512 MB';\n const timeout = args.webSocket.handler?.timeout ?? '30 seconds';\n\n // WebSocket API Gateway\n this.websocket = new sst.aws.ApiGatewayWebSocket(`${id}-websocket`, {});\n\n const wsEnvironment = {\n CORE_TABLE: this.table.table.name,\n WEBSOCKET_MANAGEMENT_ENDPOINT: this.websocket.managementEndpoint,\n };\n\n // $connect handler\n const connectHandler = new sst.aws.Function(`${id}-ws-connect`, {\n handler: `${dotMonorisePath}/handle.wsConnect`,\n runtime,\n memory,\n timeout,\n environment: wsEnvironment,\n link: [this.table.table, this.websocket],\n });\n\n // $disconnect handler\n const disconnectHandler = new sst.aws.Function(`${id}-ws-disconnect`, {\n handler: `${dotMonorisePath}/handle.wsDisconnect`,\n runtime,\n memory,\n timeout,\n environment: wsEnvironment,\n link: [this.table.table],\n });\n\n // $default handler\n const defaultHandler = new sst.aws.Function(`${id}-ws-default`, {\n handler: `${dotMonorisePath}/handle.wsDefault`,\n runtime,\n memory,\n timeout,\n environment: wsEnvironment,\n link: [this.table.table, this.websocket],\n });\n\n // Set WebSocket routes\n this.websocket.route('$connect', connectHandler.arn);\n this.websocket.route('$disconnect', disconnectHandler.arn);\n this.websocket.route('$default', defaultHandler.arn);\n\n // Subscribe broadcast handler to DynamoDB Stream\n this.table.table.subscribe(\n `${id}-ws-broadcast`,\n {\n name: `${$app.stage}-${$app.name}-${id}-ws-broadcast`,\n handler: `${dotMonorisePath}/handle.wsBroadcast`,\n runtime,\n memory: '1024 MB',\n timeout: '60 seconds',\n environment: wsEnvironment,\n link: [this.table.table, this.websocket],\n },\n {\n transform: {\n eventSourceMapping: {\n startingPosition: 'LATEST',\n bisectBatchOnFunctionError: true,\n maximumRetryAttempts: 1,\n },\n },\n },\n );\n }\n\n // Add WebSocket URL to app handler if WebSocket is enabled\n if (this.websocket) {\n appHandlerEnvironment.WEBSOCKET_URL = this.websocket.url;\n appHandlerLinks.push(this.websocket);\n }\n\n this.api.route('ANY /core/{proxy+}', {\n name: appHandlerName,\n handler: `${dotMonorisePath}/handle.appHandler`,\n link: appHandlerLinks,\n environment: appHandlerEnvironment,\n });\n\n /**\n * CloudWatch Dashboard\n */\n new aws.cloudwatch.Dashboard(`${id}-monorise-dashboard`, {\n dashboardName: `${$app.stage}-${$app.name}-${id}-monorise`,\n dashboardBody: $resolve([\n aws.getRegionOutput().name,\n this.table.table.name,\n mutualProcessor.dlq.nodes.queue.name,\n tagProcessor.dlq.nodes.queue.name,\n treeProcessor.dlq.nodes.queue.name,\n this.table.dlq.nodes.queue.name,\n ]).apply(\n ([region, tableName, mutualDlq, tagDlq, treeDlq, replicatorDlq]) => {\n const dynamoDbUrl = `https://${region}.console.aws.amazon.com/dynamodbv2/home?region=${region}#table?name=${tableName}&tab=monitoring`;\n\n return JSON.stringify({\n widgets: [\n {\n type: 'text',\n x: 0,\n y: 0,\n width: 24,\n height: 2,\n properties: {\n markdown: `### Related Resources\\n[View DynamoDB Table Metrics](${dynamoDbUrl})`,\n },\n },\n ...createFunctionWidgets(\n 'API Handler',\n appHandlerName,\n 2,\n region,\n ),\n ...createFunctionWidgets(\n 'Replicator',\n this.table.replicatorFunctionName,\n 9,\n region,\n replicatorDlq,\n ),\n ...createFunctionWidgets(\n 'Mutual Processor',\n mutualProcessorName,\n 16,\n region,\n mutualDlq,\n ),\n ...createFunctionWidgets(\n 'Tag Processor',\n tagProcessorName,\n 23,\n region,\n tagDlq,\n ),\n ...createFunctionWidgets(\n 'Tree Processor',\n treeProcessorName,\n 30,\n region,\n treeDlq,\n ),\n ],\n });\n },\n ),\n });\n }\n}\n","import type { Entity as EntityType } from '@monorise/base';\n\nconst SOURCE = {\n CORE: 'core-service',\n GENERAL: 'general',\n};\n\nexport type EventDetail = {\n Source: string;\n DetailType: string;\n};\n\nconst EVENT = {\n CORE: {\n LOGIN_EMAIL_REQUESTED: {\n Source: SOURCE.CORE,\n DetailType: 'login-email-requested',\n },\n\n /*\n * Entity\n */\n ENTITY_CREATED: {\n Source: SOURCE.CORE,\n DetailType: 'entity-created',\n },\n ENTITY_UPSERTED: {\n Source: SOURCE.CORE,\n DetailType: 'entity-upserted',\n },\n ENTITY_UPDATED: {\n Source: SOURCE.CORE,\n DetailType: 'entity-updated',\n },\n ENTITY_DELETED: {\n Source: SOURCE.CORE,\n DetailType: 'entity-deleted',\n },\n ENTITY_MUTUAL_TO_CREATE: {\n Source: SOURCE.CORE,\n DetailType: 'entity-mutual-to-create',\n },\n ENTITY_MUTUAL_TO_UPDATE: {\n Source: SOURCE.CORE,\n DetailType: 'entity-mutual-to-update',\n },\n ENTITY_MUTUAL_PROCESSED: {\n Source: SOURCE.CORE,\n DetailType: 'entity-mutual-processed',\n },\n\n CREATE_ENTITY: {\n Source: SOURCE.CORE,\n DetailType: 'create-entity',\n },\n\n /*\n * Mutual\n */\n MUTUAL_CREATED: (byEntityType: EntityType, entityType: EntityType) => ({\n Source: SOURCE.CORE,\n DetailType: `mutual-created:${byEntityType}:${entityType}`,\n }),\n MUTUAL_UPDATED: (byEntityType: EntityType, entityType: EntityType) => ({\n Source: SOURCE.CORE,\n DetailType: `mutual-updated:${byEntityType}:${entityType}`,\n }),\n MUTUAL_DELETED: (byEntityType: EntityType, entityType: EntityType) => ({\n Source: SOURCE.CORE,\n DetailType: `mutual-deleted:${byEntityType}:${entityType}`,\n }),\n PREJOIN_RELATIONSHIP_SYNC: {\n Source: SOURCE.CORE,\n DetailType: 'prejoin-relationship-sync',\n },\n },\n\n GENERAL: {\n ENDPOINT_ERROR: {\n Source: SOURCE.GENERAL,\n DetailType: 'endpoint-error',\n },\n },\n};\n\nexport { SOURCE, EVENT };\n","export function createFunctionWidgets(\n title: string,\n functionName: string,\n y: number,\n region: string,\n dlqName?: string,\n) {\n const hasDlq = !!dlqName;\n const w = hasDlq ? 4 : 5;\n const widgets: object[] = [];\n let x = 0;\n\n // Section header\n widgets.push({\n type: 'text',\n x: 0,\n y,\n width: 24,\n height: 1,\n properties: {\n markdown: `## ${title}`,\n },\n });\n\n const metricY = y + 1;\n\n widgets.push({\n type: 'metric',\n x,\n y: metricY,\n width: w,\n height: 6,\n properties: {\n metrics: [\n ['AWS/Lambda', 'Invocations', 'FunctionName', functionName],\n ],\n title: 'Invocations',\n stat: 'Sum',\n period: 300,\n region,\n },\n });\n x += w;\n\n widgets.push({\n type: 'metric',\n x,\n y: metricY,\n width: w,\n height: 6,\n properties: {\n metrics: [\n [\n 'AWS/Lambda',\n 'Duration',\n 'FunctionName',\n functionName,\n { label: 'Avg' },\n ],\n ['...', { stat: 'p99', label: 'p99' }],\n ],\n title: 'Duration (ms)',\n stat: 'Average',\n period: 300,\n region,\n },\n });\n x += w;\n\n widgets.push({\n type: 'metric',\n x,\n y: metricY,\n width: w,\n height: 6,\n properties: {\n metrics: [\n ['AWS/Lambda', 'Errors', 'FunctionName', functionName],\n ],\n title: 'Errors',\n stat: 'Sum',\n period: 300,\n region,\n },\n });\n x += w;\n\n widgets.push({\n type: 'metric',\n x,\n y: metricY,\n width: w,\n height: 6,\n properties: {\n metrics: [\n [\n {\n expression: '100 - 100 * errors / invocations',\n label: 'Success Rate (%)',\n id: 'successRate',\n },\n ],\n [\n 'AWS/Lambda',\n 'Invocations',\n 'FunctionName',\n functionName,\n { id: 'invocations', visible: false },\n ],\n [\n 'AWS/Lambda',\n 'Errors',\n 'FunctionName',\n functionName,\n { id: 'errors', visible: false },\n ],\n ],\n title: 'Success Rate (%)',\n stat: 'Sum',\n period: 300,\n region,\n yAxis: { left: { min: 0, max: 100 } },\n },\n });\n x += w;\n\n const concurrentW = hasDlq ? w : 24 - x;\n widgets.push({\n type: 'metric',\n x,\n y: metricY,\n width: concurrentW,\n height: 6,\n properties: {\n metrics: [\n [\n 'AWS/Lambda',\n 'ConcurrentExecutions',\n 'FunctionName',\n functionName,\n ],\n ],\n title: 'Concurrent Executions',\n stat: 'Maximum',\n period: 300,\n region,\n },\n });\n x += concurrentW;\n\n if (dlqName) {\n widgets.push({\n type: 'metric',\n x,\n y: metricY,\n width: 24 - x,\n height: 6,\n properties: {\n metrics: [\n [\n 'AWS/SQS',\n 'ApproximateNumberOfMessagesVisible',\n 'QueueName',\n dlqName,\n ],\n ],\n title: 'DLQ Messages',\n stat: 'Maximum',\n period: 300,\n region,\n },\n });\n }\n\n return widgets;\n}\n","type DurationMinutes =\n | `${number} second`\n | `${number} seconds`\n | `${number} minute`\n | `${number} minutes`;\n\ninterface QFunctionArgs extends sst.aws.FunctionArgs {\n visibilityTimeout?: sst.aws.QueueArgs['visibilityTimeout'];\n maxBatchingWindow?: DurationMinutes;\n batchSize?: number;\n alarmTopic?: sst.aws.SnsTopic;\n}\n\nexport class QFunction {\n public readonly id: string;\n public readonly queue: sst.aws.Queue;\n public readonly dlq: sst.aws.Queue;\n private function: sst.aws.Function;\n\n constructor(id: string, args: QFunctionArgs) {\n this.id = id;\n\n const {\n visibilityTimeout,\n maxBatchingWindow,\n batchSize,\n alarmTopic,\n link,\n ...functionArgs\n } = args;\n\n this.dlq = new sst.aws.Queue(`${id}-queue-dlq`);\n\n this.queue = new sst.aws.Queue(`${id}-queue`, {\n visibilityTimeout,\n dlq: this.dlq.arn,\n });\n\n this.function = new sst.aws.Function(`${id}-processor`, {\n ...functionArgs,\n link: (link as any[])?.length\n ? [this.queue, ...(link as any[])]\n : [this.queue],\n });\n\n this.queue.subscribe(this.function.arn, {\n batch: {\n partialResponses: true,\n window: maxBatchingWindow,\n size: batchSize,\n },\n });\n\n if (alarmTopic) {\n const dlqMessageAlarm = new aws.cloudwatch.MetricAlarm(\n `${id}-dlq-message-alarm`,\n {\n name: `${$app.stage}-${$app.name}-${id}-dlq-alarm`,\n comparisonOperator: 'GreaterThanOrEqualToThreshold',\n evaluationPeriods: 1,\n metricName: 'ApproximateNumberOfMessagesVisible',\n namespace: 'AWS/SQS',\n period: 60,\n statistic: 'Sum',\n threshold: 1,\n dimensions: {\n QueueName: this.dlq.nodes.queue.name,\n },\n alarmDescription:\n 'Alarm when there is at least one message in the DLQ.',\n // Actions to take when the alarm changes to ALARM state.\n alarmActions: [alarmTopic.arn],\n // Actions to take when the alarm changes to OK state.\n // okActions: [alarmSnsTopic.arn],\n },\n );\n }\n }\n}\n","import path from 'node:path';\nimport {\n ENTITY_REPLICATION_INDEX,\n MUTUAL_REPLICATION_INDEX,\n} from '../constants/table';\n\ntype SingleTableArgs = {\n ttl?: string;\n runtime?: sst.aws.FunctionArgs['runtime'];\n configRoot?: string;\n};\n\nexport class SingleTable {\n public readonly id: string;\n public readonly table: sst.aws.Dynamo;\n public readonly dlq: sst.aws.Queue;\n public readonly replicatorFunctionName: string;\n\n constructor(id: string, args?: SingleTableArgs) {\n this.id = id;\n this.replicatorFunctionName = `${$app.stage}-${$app.name}-${id}-core-replicator`;\n this.dlq = new sst.aws.Queue(`${id}-core-replicator-dlq`);\n this.table = new sst.aws.Dynamo(`${id}-core-table`, {\n fields: {\n PK: 'string',\n SK: 'string',\n R1PK: 'string',\n R1SK: 'string',\n R2PK: 'string',\n R2SK: 'string',\n },\n primaryIndex: { hashKey: 'PK', rangeKey: 'SK' },\n globalIndexes: {\n [ENTITY_REPLICATION_INDEX]: {\n hashKey: 'R1PK',\n rangeKey: 'R1SK',\n projection: [\n 'PK',\n 'SK',\n 'R2PK',\n 'R2SK',\n 'updatedAt',\n 'mutualUpdatedAt',\n ],\n },\n [MUTUAL_REPLICATION_INDEX]: {\n hashKey: 'R2PK',\n rangeKey: 'R2SK',\n projection: [\n 'PK',\n 'SK',\n 'R2PK',\n 'R2SK',\n 'updatedAt',\n 'mutualUpdatedAt',\n ],\n },\n },\n stream: 'new-and-old-images',\n ttl: args?.ttl,\n });\n\n const environment = {\n CORE_TABLE: this.table.name,\n };\n\n this.table.subscribe(\n `${id}-core-replicator`,\n {\n name: this.replicatorFunctionName,\n handler: path.join(\n args?.configRoot ?? '',\n '.monorise/handle.replicationHandler',\n ),\n timeout: '60 seconds',\n memory: '512 MB',\n runtime: args?.runtime,\n environment,\n link: [this.table, this.dlq],\n },\n {\n transform: {\n eventSourceMapping: {\n startingPosition: 'LATEST',\n bisectBatchOnFunctionError: true,\n maximumRetryAttempts: 1,\n destinationConfig: {\n onFailure: {\n destinationArn: this.dlq.arn,\n },\n },\n },\n },\n },\n );\n }\n}\n","export const ENTITY_REPLICATION_INDEX = 'ENTITY_REPLICATION_INDEX';\nexport const MUTUAL_REPLICATION_INDEX = 'MUTUAL_REPLICATION_INDEX';\n","import { MonoriseCore } from './components/monorise-core';\nimport { QFunction } from './components/q-function';\n\nexport const monorise = {\n module: {\n Core: MonoriseCore,\n },\n block: {\n QFunction,\n },\n};\n\n\n\n"],"mappings":"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","names":["path","path"]}
|
|
1
|
+
{"version":3,"sources":["../components/monorise-core.ts","../constants/event.ts","../components/dashboard.ts","../components/q-function.ts","../components/single-table.ts","../constants/table.ts","../index.ts"],"sourcesContent":["import path from 'node:path';\nimport { EVENT, SOURCE } from '../constants/event';\nimport { createFunctionWidgets } from './dashboard';\nimport { QFunction } from './q-function';\nimport { SingleTable } from './single-table';\n\ntype WebSocketHandlerArgs = {\n memory?: sst.aws.FunctionArgs['memory'];\n timeout?: sst.aws.FunctionArgs['timeout'];\n};\n\ntype WebSocketConfig = {\n enabled: true;\n handler?: WebSocketHandlerArgs;\n};\n\ntype MonoriseCoreArgs = {\n tableTtl?: string;\n slackWebhook?: string;\n allowHeaders?: string[];\n allowOrigins?: string[];\n configRoot?: string;\n webSocket?: WebSocketConfig;\n link?: $util.Input<any[]>;\n};\n\nexport class MonoriseCore {\n public readonly id: string;\n public readonly api: sst.aws.ApiGatewayV2;\n public readonly bus: sst.aws.Bus;\n public readonly table: SingleTable;\n public readonly alarmTopic: sst.aws.SnsTopic;\n public readonly websocket?: sst.aws.ApiGatewayWebSocket;\n\n constructor(id: string, args?: MonoriseCoreArgs) {\n const runtime: sst.aws.FunctionArgs['runtime'] = 'nodejs22.x';\n const configRootCommand = args?.configRoot\n ? `--config-root ${args?.configRoot}`\n : '';\n const dotMonorisePath = path.join(args?.configRoot ?? '', '.monorise');\n\n new sst.x.DevCommand('Monorise', {\n dev: {\n autostart: true,\n command: `npx monorise dev ${configRootCommand}`,\n },\n });\n\n this.id = id;\n\n this.api = new sst.aws.ApiGatewayV2(`${id}-monorise-api`, {\n cors: {\n allowMethods: ['*'],\n allowCredentials: true,\n allowHeaders: [\n ...(args?.allowHeaders ? args.allowHeaders : []),\n 'Content-Type',\n 'Authorization',\n ],\n allowOrigins: args?.allowOrigins,\n },\n });\n\n this.bus = new sst.aws.Bus(`${id}-monorise-bus`);\n this.table = new SingleTable(id, {\n ttl: args?.tableTtl,\n runtime,\n configRoot: args?.configRoot,\n });\n\n const secretApiKeys = new sst.Secret('API_KEYS', '[\"secret1\", \"secret2\"]');\n\n const appHandlerName = `${$app.stage}-${$app.name}-${id}-app-handler`;\n const appHandlerEnvironment: Record<string, any> = {\n API_KEYS: secretApiKeys.value,\n CORE_TABLE: this.table.table.name,\n CORE_EVENT_BUS: this.bus.name,\n };\n const appHandlerLinks: any[] = [this.table.table, this.bus, secretApiKeys, ...(args?.link ?? [])];\n\n this.alarmTopic = new sst.aws.SnsTopic(`${id}-monorise-dlq-alarm-topic`);\n\n const environment = {\n CORE_TABLE: this.table.table.name,\n CORE_EVENT_BUS: this.bus.name,\n };\n\n /**\n * Event Processors\n */\n const mutualProcessorName = `${$app.stage}-${$app.name}-${id}-mutual-processor`;\n const tagProcessorName = `${$app.stage}-${$app.name}-${id}-tag-processor`;\n const treeProcessorName = `${$app.stage}-${$app.name}-${id}-tree-processor`;\n\n const mutualProcessor = new QFunction('mutual', {\n name: mutualProcessorName,\n handler: `${dotMonorisePath}/handle.mutualHandler`,\n memory: '512 MB',\n timeout: '30 seconds',\n visibilityTimeout: '30 seconds',\n alarmTopic: this.alarmTopic,\n runtime,\n environment,\n link: [this.table.table, this.bus],\n });\n\n const tagProcessor = new QFunction('tag', {\n name: tagProcessorName,\n handler: `${dotMonorisePath}/handle.tagHandler`,\n memory: '512 MB',\n timeout: '30 seconds',\n visibilityTimeout: '30 seconds',\n alarmTopic: this.alarmTopic,\n runtime,\n environment,\n link: [this.table.table],\n });\n\n const treeProcessor = new QFunction('tree', {\n name: treeProcessorName,\n handler: `${dotMonorisePath}/handle.treeHandler`,\n memory: '512 MB',\n timeout: '30 seconds',\n visibilityTimeout: '30 seconds',\n alarmTopic: this.alarmTopic,\n runtime,\n environment,\n link: [this.table.table],\n });\n\n this.bus.subscribeQueue(`${id}-mutual-queue-rule`, mutualProcessor.queue, {\n pattern: {\n source: [SOURCE.CORE],\n detailType: [\n EVENT.CORE.ENTITY_MUTUAL_TO_CREATE.DetailType,\n EVENT.CORE.ENTITY_MUTUAL_TO_UPDATE.DetailType,\n ],\n },\n });\n\n this.bus.subscribeQueue(`${id}-tag-queue-rule`, tagProcessor.queue, {\n pattern: {\n source: [SOURCE.CORE],\n detailType: [\n EVENT.CORE.ENTITY_CREATED.DetailType,\n EVENT.CORE.ENTITY_UPDATED.DetailType,\n ],\n },\n });\n\n this.bus.subscribeQueue(`${id}-tree-queue-rule`, treeProcessor.queue, {\n pattern: {\n source: [SOURCE.CORE],\n detailType: [\n EVENT.CORE.ENTITY_MUTUAL_PROCESSED.DetailType,\n EVENT.CORE.PREJOIN_RELATIONSHIP_SYNC.DetailType,\n ],\n },\n });\n\n /**\n * Optional WebSocket Setup\n */\n if (args?.webSocket?.enabled) {\n const memory = args.webSocket.handler?.memory ?? '512 MB';\n const timeout = args.webSocket.handler?.timeout ?? '30 seconds';\n\n // WebSocket API Gateway\n this.websocket = new sst.aws.ApiGatewayWebSocket(`${id}-websocket`, {});\n\n const wsEnvironment = {\n CORE_TABLE: this.table.table.name,\n WEBSOCKET_MANAGEMENT_ENDPOINT: this.websocket.managementEndpoint,\n };\n\n // $connect handler\n const connectHandler = new sst.aws.Function(`${id}-ws-connect`, {\n handler: `${dotMonorisePath}/handle.wsConnect`,\n runtime,\n memory,\n timeout,\n environment: wsEnvironment,\n link: [this.table.table, this.websocket],\n });\n\n // $disconnect handler\n const disconnectHandler = new sst.aws.Function(`${id}-ws-disconnect`, {\n handler: `${dotMonorisePath}/handle.wsDisconnect`,\n runtime,\n memory,\n timeout,\n environment: wsEnvironment,\n link: [this.table.table],\n });\n\n // $default handler\n const defaultHandler = new sst.aws.Function(`${id}-ws-default`, {\n handler: `${dotMonorisePath}/handle.wsDefault`,\n runtime,\n memory,\n timeout,\n environment: wsEnvironment,\n link: [this.table.table, this.websocket],\n });\n\n // Set WebSocket routes\n this.websocket.route('$connect', connectHandler.arn);\n this.websocket.route('$disconnect', disconnectHandler.arn);\n this.websocket.route('$default', defaultHandler.arn);\n\n // Subscribe broadcast handler to DynamoDB Stream\n this.table.table.subscribe(\n `${id}-ws-broadcast`,\n {\n name: `${$app.stage}-${$app.name}-${id}-ws-broadcast`,\n handler: `${dotMonorisePath}/handle.wsBroadcast`,\n runtime,\n memory: '1024 MB',\n timeout: '60 seconds',\n environment: wsEnvironment,\n link: [this.table.table, this.websocket],\n },\n {\n transform: {\n eventSourceMapping: {\n startingPosition: 'LATEST',\n bisectBatchOnFunctionError: true,\n maximumRetryAttempts: 1,\n },\n },\n },\n );\n }\n\n // Add WebSocket URL to app handler if WebSocket is enabled\n if (this.websocket) {\n appHandlerEnvironment.WEBSOCKET_URL = this.websocket.url;\n appHandlerLinks.push(this.websocket);\n }\n\n this.api.route('ANY /core/{proxy+}', {\n name: appHandlerName,\n handler: `${dotMonorisePath}/handle.appHandler`,\n link: appHandlerLinks,\n environment: appHandlerEnvironment,\n });\n\n /**\n * CloudWatch Dashboard\n */\n new aws.cloudwatch.Dashboard(`${id}-monorise-dashboard`, {\n dashboardName: `${$app.stage}-${$app.name}-${id}-monorise`,\n dashboardBody: $resolve([\n aws.getRegionOutput().name,\n this.table.table.name,\n mutualProcessor.dlq.nodes.queue.name,\n tagProcessor.dlq.nodes.queue.name,\n treeProcessor.dlq.nodes.queue.name,\n this.table.dlq.nodes.queue.name,\n ]).apply(\n ([region, tableName, mutualDlq, tagDlq, treeDlq, replicatorDlq]) => {\n const dynamoDbUrl = `https://${region}.console.aws.amazon.com/dynamodbv2/home?region=${region}#table?name=${tableName}&tab=monitoring`;\n\n return JSON.stringify({\n widgets: [\n {\n type: 'text',\n x: 0,\n y: 0,\n width: 24,\n height: 2,\n properties: {\n markdown: `### Related Resources\\n[View DynamoDB Table Metrics](${dynamoDbUrl})`,\n },\n },\n ...createFunctionWidgets(\n 'API Handler',\n appHandlerName,\n 2,\n region,\n ),\n ...createFunctionWidgets(\n 'Replicator',\n this.table.replicatorFunctionName,\n 9,\n region,\n replicatorDlq,\n ),\n ...createFunctionWidgets(\n 'Mutual Processor',\n mutualProcessorName,\n 16,\n region,\n mutualDlq,\n ),\n ...createFunctionWidgets(\n 'Tag Processor',\n tagProcessorName,\n 23,\n region,\n tagDlq,\n ),\n ...createFunctionWidgets(\n 'Tree Processor',\n treeProcessorName,\n 30,\n region,\n treeDlq,\n ),\n ],\n });\n },\n ),\n });\n }\n}\n","import type { Entity as EntityType } from '@monorise/base';\n\nconst SOURCE = {\n CORE: 'core-service',\n GENERAL: 'general',\n};\n\nexport type EventDetail = {\n Source: string;\n DetailType: string;\n};\n\nconst EVENT = {\n CORE: {\n LOGIN_EMAIL_REQUESTED: {\n Source: SOURCE.CORE,\n DetailType: 'login-email-requested',\n },\n\n /*\n * Entity\n */\n ENTITY_CREATED: {\n Source: SOURCE.CORE,\n DetailType: 'entity-created',\n },\n ENTITY_UPSERTED: {\n Source: SOURCE.CORE,\n DetailType: 'entity-upserted',\n },\n ENTITY_UPDATED: {\n Source: SOURCE.CORE,\n DetailType: 'entity-updated',\n },\n ENTITY_DELETED: {\n Source: SOURCE.CORE,\n DetailType: 'entity-deleted',\n },\n ENTITY_MUTUAL_TO_CREATE: {\n Source: SOURCE.CORE,\n DetailType: 'entity-mutual-to-create',\n },\n ENTITY_MUTUAL_TO_UPDATE: {\n Source: SOURCE.CORE,\n DetailType: 'entity-mutual-to-update',\n },\n ENTITY_MUTUAL_PROCESSED: {\n Source: SOURCE.CORE,\n DetailType: 'entity-mutual-processed',\n },\n\n CREATE_ENTITY: {\n Source: SOURCE.CORE,\n DetailType: 'create-entity',\n },\n\n /*\n * Mutual\n */\n MUTUAL_CREATED: (byEntityType: EntityType, entityType: EntityType) => ({\n Source: SOURCE.CORE,\n DetailType: `mutual-created:${byEntityType}:${entityType}`,\n }),\n MUTUAL_UPDATED: (byEntityType: EntityType, entityType: EntityType) => ({\n Source: SOURCE.CORE,\n DetailType: `mutual-updated:${byEntityType}:${entityType}`,\n }),\n MUTUAL_DELETED: (byEntityType: EntityType, entityType: EntityType) => ({\n Source: SOURCE.CORE,\n DetailType: `mutual-deleted:${byEntityType}:${entityType}`,\n }),\n PREJOIN_RELATIONSHIP_SYNC: {\n Source: SOURCE.CORE,\n DetailType: 'prejoin-relationship-sync',\n },\n },\n\n GENERAL: {\n ENDPOINT_ERROR: {\n Source: SOURCE.GENERAL,\n DetailType: 'endpoint-error',\n },\n },\n};\n\nexport { SOURCE, EVENT };\n","export function createFunctionWidgets(\n title: string,\n functionName: string,\n y: number,\n region: string,\n dlqName?: string,\n) {\n const hasDlq = !!dlqName;\n const w = hasDlq ? 4 : 5;\n const widgets: object[] = [];\n let x = 0;\n\n // Section header\n widgets.push({\n type: 'text',\n x: 0,\n y,\n width: 24,\n height: 1,\n properties: {\n markdown: `## ${title}`,\n },\n });\n\n const metricY = y + 1;\n\n widgets.push({\n type: 'metric',\n x,\n y: metricY,\n width: w,\n height: 6,\n properties: {\n metrics: [\n ['AWS/Lambda', 'Invocations', 'FunctionName', functionName],\n ],\n title: 'Invocations',\n stat: 'Sum',\n period: 300,\n region,\n },\n });\n x += w;\n\n widgets.push({\n type: 'metric',\n x,\n y: metricY,\n width: w,\n height: 6,\n properties: {\n metrics: [\n [\n 'AWS/Lambda',\n 'Duration',\n 'FunctionName',\n functionName,\n { label: 'Avg' },\n ],\n ['...', { stat: 'p99', label: 'p99' }],\n ],\n title: 'Duration (ms)',\n stat: 'Average',\n period: 300,\n region,\n },\n });\n x += w;\n\n widgets.push({\n type: 'metric',\n x,\n y: metricY,\n width: w,\n height: 6,\n properties: {\n metrics: [\n ['AWS/Lambda', 'Errors', 'FunctionName', functionName],\n ],\n title: 'Errors',\n stat: 'Sum',\n period: 300,\n region,\n },\n });\n x += w;\n\n widgets.push({\n type: 'metric',\n x,\n y: metricY,\n width: w,\n height: 6,\n properties: {\n metrics: [\n [\n {\n expression: '100 - 100 * errors / invocations',\n label: 'Success Rate (%)',\n id: 'successRate',\n },\n ],\n [\n 'AWS/Lambda',\n 'Invocations',\n 'FunctionName',\n functionName,\n { id: 'invocations', visible: false },\n ],\n [\n 'AWS/Lambda',\n 'Errors',\n 'FunctionName',\n functionName,\n { id: 'errors', visible: false },\n ],\n ],\n title: 'Success Rate (%)',\n stat: 'Sum',\n period: 300,\n region,\n yAxis: { left: { min: 0, max: 100 } },\n },\n });\n x += w;\n\n const concurrentW = hasDlq ? w : 24 - x;\n widgets.push({\n type: 'metric',\n x,\n y: metricY,\n width: concurrentW,\n height: 6,\n properties: {\n metrics: [\n [\n 'AWS/Lambda',\n 'ConcurrentExecutions',\n 'FunctionName',\n functionName,\n ],\n ],\n title: 'Concurrent Executions',\n stat: 'Maximum',\n period: 300,\n region,\n },\n });\n x += concurrentW;\n\n if (dlqName) {\n widgets.push({\n type: 'metric',\n x,\n y: metricY,\n width: 24 - x,\n height: 6,\n properties: {\n metrics: [\n [\n 'AWS/SQS',\n 'ApproximateNumberOfMessagesVisible',\n 'QueueName',\n dlqName,\n ],\n ],\n title: 'DLQ Messages',\n stat: 'Maximum',\n period: 300,\n region,\n },\n });\n }\n\n return widgets;\n}\n","type DurationMinutes =\n | `${number} second`\n | `${number} seconds`\n | `${number} minute`\n | `${number} minutes`;\n\ninterface QFunctionArgs extends sst.aws.FunctionArgs {\n visibilityTimeout?: sst.aws.QueueArgs['visibilityTimeout'];\n maxBatchingWindow?: DurationMinutes;\n batchSize?: number;\n alarmTopic?: sst.aws.SnsTopic;\n}\n\nexport class QFunction {\n public readonly id: string;\n public readonly queue: sst.aws.Queue;\n public readonly dlq: sst.aws.Queue;\n private function: sst.aws.Function;\n\n constructor(id: string, args: QFunctionArgs) {\n this.id = id;\n\n const {\n visibilityTimeout,\n maxBatchingWindow,\n batchSize,\n alarmTopic,\n link,\n ...functionArgs\n } = args;\n\n this.dlq = new sst.aws.Queue(`${id}-queue-dlq`);\n\n this.queue = new sst.aws.Queue(`${id}-queue`, {\n visibilityTimeout,\n dlq: this.dlq.arn,\n });\n\n this.function = new sst.aws.Function(`${id}-processor`, {\n ...functionArgs,\n link: (link as any[])?.length\n ? [this.queue, ...(link as any[])]\n : [this.queue],\n });\n\n this.queue.subscribe(this.function.arn, {\n batch: {\n partialResponses: true,\n window: maxBatchingWindow,\n size: batchSize,\n },\n });\n\n if (alarmTopic) {\n const dlqMessageAlarm = new aws.cloudwatch.MetricAlarm(\n `${id}-dlq-message-alarm`,\n {\n name: `${$app.stage}-${$app.name}-${id}-dlq-alarm`,\n comparisonOperator: 'GreaterThanOrEqualToThreshold',\n evaluationPeriods: 1,\n metricName: 'ApproximateNumberOfMessagesVisible',\n namespace: 'AWS/SQS',\n period: 60,\n statistic: 'Sum',\n threshold: 1,\n dimensions: {\n QueueName: this.dlq.nodes.queue.name,\n },\n alarmDescription:\n 'Alarm when there is at least one message in the DLQ.',\n // Actions to take when the alarm changes to ALARM state.\n alarmActions: [alarmTopic.arn],\n // Actions to take when the alarm changes to OK state.\n // okActions: [alarmSnsTopic.arn],\n },\n );\n }\n }\n}\n","import path from 'node:path';\nimport {\n ENTITY_REPLICATION_INDEX,\n MUTUAL_REPLICATION_INDEX,\n} from '../constants/table';\n\ntype SingleTableArgs = {\n ttl?: string;\n runtime?: sst.aws.FunctionArgs['runtime'];\n configRoot?: string;\n};\n\nexport class SingleTable {\n public readonly id: string;\n public readonly table: sst.aws.Dynamo;\n public readonly dlq: sst.aws.Queue;\n public readonly replicatorFunctionName: string;\n\n constructor(id: string, args?: SingleTableArgs) {\n this.id = id;\n this.replicatorFunctionName = `${$app.stage}-${$app.name}-${id}-core-replicator`;\n this.dlq = new sst.aws.Queue(`${id}-core-replicator-dlq`);\n this.table = new sst.aws.Dynamo(`${id}-core-table`, {\n fields: {\n PK: 'string',\n SK: 'string',\n R1PK: 'string',\n R1SK: 'string',\n R2PK: 'string',\n R2SK: 'string',\n },\n primaryIndex: { hashKey: 'PK', rangeKey: 'SK' },\n globalIndexes: {\n [ENTITY_REPLICATION_INDEX]: {\n hashKey: 'R1PK',\n rangeKey: 'R1SK',\n projection: [\n 'PK',\n 'SK',\n 'R2PK',\n 'R2SK',\n 'updatedAt',\n 'mutualUpdatedAt',\n ],\n },\n [MUTUAL_REPLICATION_INDEX]: {\n hashKey: 'R2PK',\n rangeKey: 'R2SK',\n projection: [\n 'PK',\n 'SK',\n 'R2PK',\n 'R2SK',\n 'updatedAt',\n 'mutualUpdatedAt',\n ],\n },\n },\n stream: 'new-and-old-images',\n ttl: args?.ttl,\n });\n\n const environment = {\n CORE_TABLE: this.table.name,\n };\n\n this.table.subscribe(\n `${id}-core-replicator`,\n {\n name: this.replicatorFunctionName,\n handler: path.join(\n args?.configRoot ?? '',\n '.monorise/handle.replicationHandler',\n ),\n timeout: '60 seconds',\n memory: '512 MB',\n runtime: args?.runtime,\n environment,\n link: [this.table, this.dlq],\n },\n {\n transform: {\n eventSourceMapping: {\n startingPosition: 'LATEST',\n bisectBatchOnFunctionError: true,\n maximumRetryAttempts: 1,\n destinationConfig: {\n onFailure: {\n destinationArn: this.dlq.arn,\n },\n },\n },\n },\n },\n );\n }\n}\n","export const ENTITY_REPLICATION_INDEX = 'ENTITY_REPLICATION_INDEX';\nexport const MUTUAL_REPLICATION_INDEX = 'MUTUAL_REPLICATION_INDEX';\n","import { MonoriseCore } from './components/monorise-core';\nimport { QFunction } from './components/q-function';\n\nexport const monorise = {\n module: {\n Core: MonoriseCore,\n },\n block: {\n QFunction,\n },\n};\n\n\n\n"],"mappings":"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","names":["path","path"]}
|