@squidcloud/local-backend 1.0.61 → 1.0.63
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.
- package/dist/common/src/application.schemas.d.ts +562 -418
- package/dist/common/src/application.schemas.js +218 -99
- package/dist/common/src/application.schemas.js.map +1 -1
- package/dist/common/src/application.types.d.ts +40 -82
- package/dist/common/src/application.types.js.map +1 -1
- package/dist/common/src/index.d.ts +2 -0
- package/dist/common/src/index.js +2 -0
- package/dist/common/src/index.js.map +1 -1
- package/dist/common/src/integrations/ai_assistant.types.d.ts +5 -11
- package/dist/common/src/integrations/api.types.d.ts +5 -5
- package/dist/common/src/integrations/database.types.d.ts +3 -8
- package/dist/common/src/integrations/index.d.ts +27 -4
- package/dist/common/src/integrations/index.js +7 -1
- package/dist/common/src/integrations/index.js.map +1 -1
- package/dist/common/src/query/base-query-builder.d.ts +1 -30
- package/dist/common/src/query/base-query-builder.js +1 -259
- package/dist/common/src/query/base-query-builder.js.map +1 -1
- package/dist/common/src/query/index.d.ts +1 -0
- package/dist/common/src/query/index.js +1 -0
- package/dist/common/src/query/index.js.map +1 -1
- package/dist/common/src/query/pagination.d.ts +42 -0
- package/dist/common/src/query/pagination.js +165 -0
- package/dist/common/src/query/pagination.js.map +1 -0
- package/dist/common/src/query.types.d.ts +5 -0
- package/dist/common/src/query.types.js.map +1 -1
- package/dist/common/src/socket.types.d.ts +7 -3
- package/dist/common/src/utils/global.utils.d.ts +10 -0
- package/dist/common/src/utils/global.utils.js +47 -0
- package/dist/common/src/utils/global.utils.js.map +1 -0
- package/dist/common/src/utils/http.js +1 -1
- package/dist/common/src/utils/http.js.map +1 -1
- package/dist/common/src/websocket.impl.d.ts +21 -0
- package/dist/common/src/websocket.impl.js +75 -0
- package/dist/common/src/websocket.impl.js.map +1 -0
- package/dist/internal-common/src/dao.types.d.ts +46 -0
- package/dist/internal-common/src/dao.types.js +3 -0
- package/dist/internal-common/src/dao.types.js.map +1 -0
- package/dist/internal-common/src/index.d.ts +4 -4
- package/dist/internal-common/src/index.js +5 -5
- package/dist/internal-common/src/index.js.map +1 -1
- package/dist/internal-common/src/local-dev.types.d.ts +5 -1
- package/dist/local-backend/src/local-backend-socket.service.d.ts +2 -1
- package/dist/local-backend/src/local-backend-socket.service.js +45 -42
- package/dist/local-backend/src/local-backend-socket.service.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DebugLogger = exports.enableDebugLogs = exports.isDebugEnabled = exports.getGlobal = void 0;
|
|
4
|
+
function getGlobal() {
|
|
5
|
+
if (typeof window !== 'undefined') {
|
|
6
|
+
return window;
|
|
7
|
+
}
|
|
8
|
+
if (typeof global !== 'undefined') {
|
|
9
|
+
return global;
|
|
10
|
+
}
|
|
11
|
+
if (typeof self !== 'undefined') {
|
|
12
|
+
return self;
|
|
13
|
+
}
|
|
14
|
+
throw new Error('Unable to locate global object');
|
|
15
|
+
}
|
|
16
|
+
exports.getGlobal = getGlobal;
|
|
17
|
+
function isDebugEnabled() {
|
|
18
|
+
const global = getGlobal();
|
|
19
|
+
return global && global['SQUID_DEBUG_ENABLED'];
|
|
20
|
+
}
|
|
21
|
+
exports.isDebugEnabled = isDebugEnabled;
|
|
22
|
+
function enableDebugLogs() {
|
|
23
|
+
const global = getGlobal();
|
|
24
|
+
global['SQUID_DEBUG_ENABLED'] = true;
|
|
25
|
+
}
|
|
26
|
+
exports.enableDebugLogs = enableDebugLogs;
|
|
27
|
+
class DebugLogger {
|
|
28
|
+
static log(...args) {
|
|
29
|
+
DebugLogger.info(...args);
|
|
30
|
+
}
|
|
31
|
+
static info(...args) {
|
|
32
|
+
console.log(`%c[${new Date().toLocaleTimeString()}] INFO`, 'color:green', ...args);
|
|
33
|
+
}
|
|
34
|
+
static warn(...args) {
|
|
35
|
+
console.warn(`%c[${new Date().toLocaleTimeString()}] WARN`, 'color:yellow', ...args);
|
|
36
|
+
}
|
|
37
|
+
static error(...args) {
|
|
38
|
+
console.error(`%c[${new Date().toLocaleTimeString()}] ERROR`, 'color:red', ...args);
|
|
39
|
+
}
|
|
40
|
+
static debug(...args) {
|
|
41
|
+
if (!isDebugEnabled())
|
|
42
|
+
return;
|
|
43
|
+
console.log(`%c[${new Date().toLocaleTimeString()}] DEBUG`, 'color:cyan', ...args);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.DebugLogger = DebugLogger;
|
|
47
|
+
//# sourceMappingURL=global.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global.utils.js","sourceRoot":"","sources":["../../../../../common/src/utils/global.utils.ts"],"names":[],"mappings":";;;AAKA,SAAgB,SAAS;IACvB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,OAAO,MAAM,CAAC;KACf;IACD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,OAAO,MAAM,CAAC;KACf;IACD,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE;QAC/B,OAAO,IAAI,CAAC;KACb;IACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;AACpD,CAAC;AAXD,8BAWC;AAGD,SAAgB,cAAc;IAC5B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,OAAO,MAAM,IAAI,MAAM,CAAC,qBAAqB,CAAC,CAAC;AACjD,CAAC;AAHD,wCAGC;AAGD,SAAgB,eAAe;IAC7B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC;AACvC,CAAC;AAHD,0CAGC;AAGD,MAAa,WAAW;IACtB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAW;QACvB,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAG,IAAW;QACxB,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAG,IAAW;QACxB,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,GAAG,IAAW;QACzB,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,GAAG,IAAW;QACzB,IAAI,CAAC,cAAc,EAAE;YAAE,OAAO;QAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,CAAC;IACrF,CAAC;CACF;AArBD,kCAqBC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getApplicationHttpHeaders = exports.getApplicationUrl = void 0;
|
|
4
|
-
const kotlinControllers = ['query', 'aiData', 'api', 'backend-function', 'webhooks'];
|
|
4
|
+
const kotlinControllers = ['query', 'aiData', 'api', 'backend-function', 'webhooks', 'ws'];
|
|
5
5
|
function getApplicationUrl(regionPrefix, appId, path) {
|
|
6
6
|
const baseUrl = 'https://squid.cloud';
|
|
7
7
|
const parsedBaseUrl = new URL(baseUrl);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../../../common/src/utils/http.ts"],"names":[],"mappings":";;;AAAA,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../../../common/src/utils/http.ts"],"names":[],"mappings":";;;AAAA,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;AAE3F,SAAgB,iBAAiB,CAAC,YAAoB,EAAE,KAAa,EAAE,IAAY;IACjF,MAAM,OAAO,GAAG,qBAAqB,CAAC;IACtC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACvC,aAAa,CAAC,IAAI,GAAG,GAAG,KAAK,IAAI,YAAY,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;IACtE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5C,IAAI,OAAO,CAAC,YAAY,CAAC,EAAE;QACzB,aAAa,CAAC,QAAQ,GAAG,MAAM,CAAC;QAChC,aAAa,CAAC,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9E,IAAI,SAAS,CAAC,YAAY,CAAC,EAAE;YAC3B,aAAa,CAAC,IAAI,GAAG,UAAU,CAAC;SACjC;aAAM,IAAI,KAAK,CAAC,YAAY,CAAC,EAAE;YAC9B,aAAa,CAAC,IAAI,GAAG,WAAW,CAAC;SAClC;KACF;IACD,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;AACtD,CAAC;AAjBD,8CAiBC;AAED,SAAgB,yBAAyB,CAAC,YAAoB,EAAE,KAAa;IAC3E,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,IAAI,OAAO,CAAC,YAAY,CAAC,EAAE;QACzB,OAAO,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC;KAClC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAPD,8DAOC;AAED,SAAS,OAAO,CAAC,YAAoB;IACnC,OAAO,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,SAAS,CAAC,YAAoB;IACrC,OAAO,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,KAAK,CAAC,YAAoB;IACjC,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
interface Options {
|
|
2
|
+
maxAttempts?: number;
|
|
3
|
+
protocols?: string[];
|
|
4
|
+
onmessage?: (event: any) => void;
|
|
5
|
+
onopen?: (event: any) => void;
|
|
6
|
+
onclose?: (event: any) => void;
|
|
7
|
+
onerror?: (event: any) => void;
|
|
8
|
+
onreconnect?: (event: any) => void;
|
|
9
|
+
onmaximum?: (event: any) => void;
|
|
10
|
+
timeout?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface WebSocketWrapper {
|
|
13
|
+
open: () => void;
|
|
14
|
+
reconnect: (e: any) => void;
|
|
15
|
+
json: (x: any) => void;
|
|
16
|
+
send: (x: string) => void;
|
|
17
|
+
close: (x?: number, y?: string) => void;
|
|
18
|
+
connected: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function createWebSocketWrapper(url: string, opts?: Options): WebSocketWrapper;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.createWebSocketWrapper = void 0;
|
|
5
|
+
const global_utils_1 = require("./utils/global.utils");
|
|
6
|
+
function noop() {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const globalObj = (0, global_utils_1.getGlobal)();
|
|
10
|
+
const WebSocketClass = (_a = globalObj['WebSocket']) !== null && _a !== void 0 ? _a : require('ws');
|
|
11
|
+
function createWebSocketWrapper(url, opts = {}) {
|
|
12
|
+
let ws;
|
|
13
|
+
let num = 0;
|
|
14
|
+
let timer = 1;
|
|
15
|
+
const $ = {
|
|
16
|
+
connected: false,
|
|
17
|
+
open() {
|
|
18
|
+
ws = new WebSocketClass(url, opts.protocols || []);
|
|
19
|
+
ws.onmessage = opts.onmessage || noop;
|
|
20
|
+
ws.onopen = function (e) {
|
|
21
|
+
$.connected = true;
|
|
22
|
+
(opts.onopen || noop)(e);
|
|
23
|
+
num = 0;
|
|
24
|
+
};
|
|
25
|
+
ws.onclose = function (e) {
|
|
26
|
+
$.connected = false;
|
|
27
|
+
if (e.code !== 4999) {
|
|
28
|
+
global_utils_1.DebugLogger.debug('WebSocket closed. Reconnecting. Close code: ', e.code);
|
|
29
|
+
(opts.onclose || noop)(e);
|
|
30
|
+
$.reconnect(e);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
(opts.onclose || noop)(e);
|
|
34
|
+
};
|
|
35
|
+
ws.onerror = function (e) {
|
|
36
|
+
$.connected = false;
|
|
37
|
+
if (e && 'ECONNREFUSED' === e.code) {
|
|
38
|
+
$.reconnect(e);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
(opts.onerror || noop)(e);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
reconnect(e) {
|
|
46
|
+
const maxAttempts = opts.maxAttempts !== undefined ? opts.maxAttempts : Infinity;
|
|
47
|
+
if (timer && num++ < maxAttempts) {
|
|
48
|
+
timer = setTimeout(function () {
|
|
49
|
+
(opts.onreconnect || noop)(e);
|
|
50
|
+
global_utils_1.DebugLogger.debug('WebSocket trying to reconnect...');
|
|
51
|
+
$.open();
|
|
52
|
+
}, opts.timeout || 1000);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
(opts.onmaximum || noop)(e);
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
json(x) {
|
|
59
|
+
ws.send(JSON.stringify(x));
|
|
60
|
+
},
|
|
61
|
+
send(x) {
|
|
62
|
+
ws.send(x);
|
|
63
|
+
},
|
|
64
|
+
close(code = 4999, message) {
|
|
65
|
+
$.connected = false;
|
|
66
|
+
clearTimeout(timer);
|
|
67
|
+
timer = undefined;
|
|
68
|
+
ws.close(code, message);
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
$.open();
|
|
72
|
+
return $;
|
|
73
|
+
}
|
|
74
|
+
exports.createWebSocketWrapper = createWebSocketWrapper;
|
|
75
|
+
//# sourceMappingURL=websocket.impl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.impl.js","sourceRoot":"","sources":["../../../../common/src/websocket.impl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { AiAssistantContextMetadata, AiAssistantProfileMetadata, AppId, ApplicationBundleData, ClientId, CodeUrl, IntegrationConfig, IntegrationId, IntegrationSchema, MessageToClient, OpenIdProvider, SchedulerId } from '@squidcloud/common';
|
|
2
|
+
export interface ApplicationBo {
|
|
3
|
+
appId: AppId;
|
|
4
|
+
codeUrl?: CodeUrl;
|
|
5
|
+
allowedHosts: string[];
|
|
6
|
+
createdAt: Date;
|
|
7
|
+
updatedAt: Date;
|
|
8
|
+
openIdProvider?: OpenIdProvider;
|
|
9
|
+
integrations: Record<IntegrationId, IntegrationConfig>;
|
|
10
|
+
bundleData?: ApplicationBundleData;
|
|
11
|
+
}
|
|
12
|
+
export interface ScheduledJobBo {
|
|
13
|
+
appId: AppId;
|
|
14
|
+
schedulerId: SchedulerId;
|
|
15
|
+
nextRunTime: number;
|
|
16
|
+
}
|
|
17
|
+
export interface MessageToClientBo {
|
|
18
|
+
message: MessageToClient;
|
|
19
|
+
appId: AppId;
|
|
20
|
+
clientId: ClientId;
|
|
21
|
+
createdAt: Date;
|
|
22
|
+
}
|
|
23
|
+
export interface SchemaBo {
|
|
24
|
+
appId: AppId;
|
|
25
|
+
integrationId: IntegrationId;
|
|
26
|
+
schema: IntegrationSchema;
|
|
27
|
+
createdAt: Date;
|
|
28
|
+
updatedAt: Date;
|
|
29
|
+
}
|
|
30
|
+
export interface AiProfileBo {
|
|
31
|
+
appId: AppId;
|
|
32
|
+
integrationId: IntegrationId;
|
|
33
|
+
id: string;
|
|
34
|
+
profile: AiAssistantProfileMetadata;
|
|
35
|
+
createdAt: Date;
|
|
36
|
+
updatedAt: Date;
|
|
37
|
+
}
|
|
38
|
+
export interface AiContextBo {
|
|
39
|
+
appId: AppId;
|
|
40
|
+
integrationId: IntegrationId;
|
|
41
|
+
profileId: string;
|
|
42
|
+
id: string;
|
|
43
|
+
context: AiAssistantContextMetadata;
|
|
44
|
+
createdAt: Date;
|
|
45
|
+
updatedAt: Date;
|
|
46
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dao.types.js","sourceRoot":"","sources":["../../../../internal-common/src/dao.types.ts"],"names":[],"mappings":""}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
export * from './async-queue';
|
|
2
2
|
export * from './code-executor.types';
|
|
3
|
+
export * from './dao.types';
|
|
3
4
|
export * from './environment';
|
|
5
|
+
export * from './filters/custom-exception.filter';
|
|
6
|
+
export * from './interceptors/body.interceptor';
|
|
4
7
|
export * from './kafka-observability-publisher';
|
|
5
8
|
export * from './kafka/kafka.manager';
|
|
6
9
|
export * from './kafka/kafka.types';
|
|
7
10
|
export * from './local-dev.types';
|
|
11
|
+
export { ObservabilityPublisher } from './observability-publisher';
|
|
8
12
|
export * from './observability.types';
|
|
9
13
|
export * from './shutdown.manager';
|
|
10
14
|
export * from './utils';
|
|
11
|
-
export * from './code-executor.types';
|
|
12
|
-
export * from './interceptors/body.interceptor';
|
|
13
|
-
export * from './filters/custom-exception.filter';
|
|
14
|
-
export { ObservabilityPublisher } from './observability-publisher';
|
|
@@ -17,17 +17,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
exports.ObservabilityPublisher = void 0;
|
|
18
18
|
__exportStar(require("./async-queue"), exports);
|
|
19
19
|
__exportStar(require("./code-executor.types"), exports);
|
|
20
|
+
__exportStar(require("./dao.types"), exports);
|
|
20
21
|
__exportStar(require("./environment"), exports);
|
|
22
|
+
__exportStar(require("./filters/custom-exception.filter"), exports);
|
|
23
|
+
__exportStar(require("./interceptors/body.interceptor"), exports);
|
|
21
24
|
__exportStar(require("./kafka-observability-publisher"), exports);
|
|
22
25
|
__exportStar(require("./kafka/kafka.manager"), exports);
|
|
23
26
|
__exportStar(require("./kafka/kafka.types"), exports);
|
|
24
27
|
__exportStar(require("./local-dev.types"), exports);
|
|
28
|
+
var observability_publisher_1 = require("./observability-publisher");
|
|
29
|
+
Object.defineProperty(exports, "ObservabilityPublisher", { enumerable: true, get: function () { return observability_publisher_1.ObservabilityPublisher; } });
|
|
25
30
|
__exportStar(require("./observability.types"), exports);
|
|
26
31
|
__exportStar(require("./shutdown.manager"), exports);
|
|
27
32
|
__exportStar(require("./utils"), exports);
|
|
28
|
-
__exportStar(require("./code-executor.types"), exports);
|
|
29
|
-
__exportStar(require("./interceptors/body.interceptor"), exports);
|
|
30
|
-
__exportStar(require("./filters/custom-exception.filter"), exports);
|
|
31
|
-
var observability_publisher_1 = require("./observability-publisher");
|
|
32
|
-
Object.defineProperty(exports, "ObservabilityPublisher", { enumerable: true, get: function () { return observability_publisher_1.ObservabilityPublisher; } });
|
|
33
33
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../internal-common/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,wDAAsC;AACtC,gDAA8B;AAC9B,kEAAgD;AAChD,wDAAsC;AACtC,sDAAoC;AACpC,oDAAkC;AAClC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../internal-common/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,wDAAsC;AACtC,8CAA4B;AAC5B,gDAA8B;AAC9B,oEAAkD;AAClD,kEAAgD;AAChD,kEAAgD;AAChD,wDAAsC;AACtC,sDAAoC;AACpC,oDAAkC;AAClC,qEAAmE;AAA1D,iIAAA,sBAAsB,OAAA;AAC/B,wDAAsC;AACtC,qDAAmC;AACnC,0CAAwB"}
|
|
@@ -6,11 +6,15 @@ interface BaseMessageFromDeveloper {
|
|
|
6
6
|
payload?: unknown;
|
|
7
7
|
requestId: string;
|
|
8
8
|
}
|
|
9
|
-
export type MessageFromDeveloper = ResponseMessageFromDeveloper;
|
|
9
|
+
export type MessageFromDeveloper = ResponseMessageFromDeveloper | BundleDataMessageFromDeveloper;
|
|
10
10
|
export interface ResponseMessageFromDeveloper extends BaseMessageFromDeveloper {
|
|
11
11
|
type: 'response';
|
|
12
12
|
payload: any;
|
|
13
13
|
}
|
|
14
|
+
export interface BundleDataMessageFromDeveloper extends BaseMessageFromDeveloper {
|
|
15
|
+
type: 'bundleData';
|
|
16
|
+
payload: any;
|
|
17
|
+
}
|
|
14
18
|
export type MessageToDeveloperType = 'executeFunction' | 'localBackendData';
|
|
15
19
|
interface BaseMessageToDeveloper {
|
|
16
20
|
type: MessageToDeveloperType;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { LocalBackendService } from './local-backend.service';
|
|
2
2
|
export declare class LocalBackendSocketService {
|
|
3
3
|
private readonly localBackendService;
|
|
4
|
-
private readonly
|
|
4
|
+
private readonly socketEndpoint;
|
|
5
5
|
private socket;
|
|
6
6
|
private readonly appId;
|
|
7
7
|
private readonly region;
|
|
@@ -12,6 +12,7 @@ export declare class LocalBackendSocketService {
|
|
|
12
12
|
private readonly fullAppId;
|
|
13
13
|
constructor(localBackendService: LocalBackendService);
|
|
14
14
|
private connectToSocket;
|
|
15
|
+
private onMessage;
|
|
15
16
|
private handleExecuteFunctionMessage;
|
|
16
17
|
private sendMessageThroughSocket;
|
|
17
18
|
private printInfoAboutBundleData;
|
|
@@ -10,7 +10,6 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.LocalBackendSocketService = void 0;
|
|
13
|
-
const socket_io_client_1 = require("socket.io-client");
|
|
14
13
|
const common_1 = require("@squidcloud/common");
|
|
15
14
|
const common_2 = require("@nestjs/common");
|
|
16
15
|
const local_backend_service_1 = require("./local-backend.service");
|
|
@@ -30,52 +29,56 @@ let LocalBackendSocketService = class LocalBackendSocketService {
|
|
|
30
29
|
console.error('The local backend can only be run using the "dev" environment. Please follow the instructions in: https://docs.squid.cloud/docs/development-tools/local-dev-cli');
|
|
31
30
|
process.exit(1);
|
|
32
31
|
}
|
|
33
|
-
this.
|
|
32
|
+
this.socketEndpoint = (0, common_1.getApplicationUrl)(this.region, this.fullAppId, 'ws/localdev')
|
|
33
|
+
.replace('https', 'wss')
|
|
34
|
+
.replace('http', 'ws');
|
|
34
35
|
this.connectToSocket();
|
|
35
36
|
}
|
|
36
37
|
connectToSocket() {
|
|
37
|
-
const socketUri = `${this.socketIoEndpoint}`;
|
|
38
38
|
const query = { apiKey: this.apiKey };
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const message = (0, common_1.deserializeObj)(messageStr);
|
|
58
|
-
switch (message.type) {
|
|
59
|
-
case 'localBackendData':
|
|
60
|
-
this.connectionReady.next(true);
|
|
61
|
-
const bundleData = await this.localBackendService.initializeAndGetBackendData(message.payload.secrets, this.appId);
|
|
62
|
-
const bundleDataMessage = {
|
|
63
|
-
type: 'response',
|
|
64
|
-
requestId: message.requestId,
|
|
65
|
-
payload: bundleData,
|
|
66
|
-
};
|
|
67
|
-
await this.sendMessageThroughSocket(bundleDataMessage);
|
|
68
|
-
this.printInfoAboutBundleData(bundleData);
|
|
69
|
-
break;
|
|
70
|
-
case 'executeFunction':
|
|
71
|
-
await this.handleExecuteFunctionMessage(message);
|
|
72
|
-
break;
|
|
73
|
-
default:
|
|
74
|
-
console.error('Unsupported message type: ', message.type);
|
|
75
|
-
break;
|
|
76
|
-
}
|
|
39
|
+
const queryString = Object.entries(query)
|
|
40
|
+
.map(([key, value]) => `${key}=${value}`)
|
|
41
|
+
.join('&');
|
|
42
|
+
this.socket = (0, common_1.createWebSocketWrapper)(`${this.socketEndpoint}?${queryString}`, {
|
|
43
|
+
timeout: 5000,
|
|
44
|
+
onmessage: (e) => this.onMessage(e.data),
|
|
45
|
+
onopen: (_e) => {
|
|
46
|
+
common_1.DebugLogger.debug(`Connection to socket established. Endpoint: ${this.socketEndpoint}`);
|
|
47
|
+
},
|
|
48
|
+
onreconnect: (_e) => {
|
|
49
|
+
common_1.DebugLogger.debug(`WebSocket reconnect event triggered`);
|
|
50
|
+
this.connectionReady.next(false);
|
|
51
|
+
},
|
|
52
|
+
onclose: (_e) => {
|
|
53
|
+
common_1.DebugLogger.debug(`WebSocket onclose event triggered`);
|
|
54
|
+
this.connectionReady.next(false);
|
|
55
|
+
},
|
|
56
|
+
onerror: (e) => console.error('WebSocket error:', e),
|
|
77
57
|
});
|
|
78
58
|
}
|
|
59
|
+
async onMessage(messageStr) {
|
|
60
|
+
const message = (0, common_1.deserializeObj)(messageStr);
|
|
61
|
+
common_1.DebugLogger.debug('Received message from server: ', messageStr);
|
|
62
|
+
switch (message.type) {
|
|
63
|
+
case 'localBackendData':
|
|
64
|
+
this.connectionReady.next(true);
|
|
65
|
+
const bundleData = await this.localBackendService.initializeAndGetBackendData(message.payload.secrets, this.appId);
|
|
66
|
+
const bundleDataMessage = {
|
|
67
|
+
type: 'bundleData',
|
|
68
|
+
requestId: message.requestId,
|
|
69
|
+
payload: bundleData,
|
|
70
|
+
};
|
|
71
|
+
await this.sendMessageThroughSocket(bundleDataMessage);
|
|
72
|
+
this.printInfoAboutBundleData(bundleData);
|
|
73
|
+
break;
|
|
74
|
+
case 'executeFunction':
|
|
75
|
+
await this.handleExecuteFunctionMessage(message);
|
|
76
|
+
break;
|
|
77
|
+
default:
|
|
78
|
+
console.error('Unsupported message type: ', message.type);
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
79
82
|
async handleExecuteFunctionMessage(message) {
|
|
80
83
|
const { responses } = await this.localBackendService.processRunCode(message.payload);
|
|
81
84
|
const response = {
|
|
@@ -87,7 +90,7 @@ let LocalBackendSocketService = class LocalBackendSocketService {
|
|
|
87
90
|
}
|
|
88
91
|
async sendMessageThroughSocket(message) {
|
|
89
92
|
await (0, rxjs_1.firstValueFrom)(this.connectionReady.pipe((0, rxjs_1.filter)(Boolean)));
|
|
90
|
-
this.socket.
|
|
93
|
+
this.socket.send((0, common_1.serializeObj)(message));
|
|
91
94
|
}
|
|
92
95
|
printInfoAboutBundleData(bundleData) {
|
|
93
96
|
const webhooks = Object.entries(bundleData.webhooks || {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-backend-socket.service.js","sourceRoot":"","sources":["../../../src/local-backend-socket.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA
|
|
1
|
+
{"version":3,"file":"local-backend-socket.service.js","sourceRoot":"","sources":["../../../src/local-backend-socket.service.ts"],"names":[],"mappings":"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"}
|