prostgles-server 4.2.570 → 4.2.572

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 (77) hide show
  1. package/dist/DboBuilder/uploadFile.d.ts +1 -1
  2. package/dist/DboBuilder/uploadFile.d.ts.map +1 -1
  3. package/dist/DboBuilder/uploadFile.js +10 -4
  4. package/dist/DboBuilder/uploadFile.js.map +1 -1
  5. package/dist/Logging.d.ts.map +1 -1
  6. package/dist/Prostgles.d.ts.map +1 -1
  7. package/dist/Prostgles.js +3 -8
  8. package/dist/Prostgles.js.map +1 -1
  9. package/dist/ProstglesTypes.d.ts +1 -1
  10. package/dist/ProstglesTypes.d.ts.map +1 -1
  11. package/dist/PubSubManager/SyncReplication/getSyncUtilFunctions.d.ts +39 -4
  12. package/dist/PubSubManager/SyncReplication/getSyncUtilFunctions.d.ts.map +1 -1
  13. package/dist/PubSubManager/SyncReplication/getSyncUtilFunctions.js +28 -40
  14. package/dist/PubSubManager/SyncReplication/getSyncUtilFunctions.js.map +1 -1
  15. package/dist/PubSubManager/SyncReplication/syncData.d.ts.map +1 -1
  16. package/dist/PubSubManager/SyncReplication/syncData.js +8 -1
  17. package/dist/PubSubManager/SyncReplication/syncData.js.map +1 -1
  18. package/dist/PubSubManager/notifListener.d.ts.map +1 -1
  19. package/dist/PubSubManager/notifListener.js +14 -3
  20. package/dist/PubSubManager/notifListener.js.map +1 -1
  21. package/dist/StorageClient/StorageClientTypes.d.ts +37 -0
  22. package/dist/StorageClient/StorageClientTypes.d.ts.map +1 -0
  23. package/dist/StorageClient/StorageClientTypes.js +3 -0
  24. package/dist/StorageClient/StorageClientTypes.js.map +1 -0
  25. package/dist/{FileManager → StorageClient}/getFileTableConfig.d.ts +1 -1
  26. package/dist/StorageClient/getFileTableConfig.d.ts.map +1 -0
  27. package/dist/{FileManager → StorageClient}/getFileTableConfig.js +2 -2
  28. package/dist/StorageClient/getFileTableConfig.js.map +1 -0
  29. package/dist/StorageClient/getFileType.d.ts +10 -0
  30. package/dist/StorageClient/getFileType.d.ts.map +1 -0
  31. package/dist/{FileManager/FileManager.js → StorageClient/getFileType.js} +17 -26
  32. package/dist/StorageClient/getFileType.js.map +1 -0
  33. package/dist/StorageClient/getLocalStorageClient.d.ts +15 -0
  34. package/dist/StorageClient/getLocalStorageClient.d.ts.map +1 -0
  35. package/dist/{FileManager → StorageClient}/getLocalStorageClient.js +4 -5
  36. package/dist/StorageClient/getLocalStorageClient.js.map +1 -0
  37. package/dist/StorageClient/getValidatedFileType.d.ts.map +1 -0
  38. package/dist/{FileManager → StorageClient}/getValidatedFileType.js +5 -5
  39. package/dist/StorageClient/getValidatedFileType.js.map +1 -0
  40. package/dist/{FileManager → StorageClient}/setupFileServeHandler.d.ts +2 -1
  41. package/dist/StorageClient/setupFileServeHandler.d.ts.map +1 -0
  42. package/dist/{FileManager → StorageClient}/setupFileServeHandler.js +10 -4
  43. package/dist/StorageClient/setupFileServeHandler.js.map +1 -0
  44. package/dist/index.d.ts +2 -2
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +1 -1
  47. package/dist/index.js.map +1 -1
  48. package/lib/DboBuilder/TableHandler/onDeleteFromFileTable.ts +1 -1
  49. package/lib/DboBuilder/TableHandler/updateFile.ts +1 -1
  50. package/lib/DboBuilder/uploadFile.ts +12 -5
  51. package/lib/Logging.ts +1 -1
  52. package/lib/Prostgles.ts +3 -7
  53. package/lib/ProstglesTypes.ts +1 -1
  54. package/lib/PubSubManager/SyncReplication/getSyncUtilFunctions.ts +31 -44
  55. package/lib/PubSubManager/SyncReplication/syncData.ts +8 -1
  56. package/lib/PubSubManager/notifListener.ts +15 -8
  57. package/lib/StorageClient/StorageClientTypes.ts +37 -0
  58. package/lib/{FileManager → StorageClient}/getFileTableConfig.ts +2 -2
  59. package/lib/{FileManager/FileManager.ts → StorageClient/getFileType.ts} +21 -99
  60. package/lib/{FileManager → StorageClient}/getLocalStorageClient.ts +22 -10
  61. package/lib/{FileManager → StorageClient}/getValidatedFileType.ts +1 -1
  62. package/lib/{FileManager → StorageClient}/setupFileServeHandler.ts +12 -6
  63. package/lib/index.ts +2 -2
  64. package/package.json +1 -1
  65. package/dist/FileManager/FileManager.d.ts +0 -76
  66. package/dist/FileManager/FileManager.d.ts.map +0 -1
  67. package/dist/FileManager/FileManager.js.map +0 -1
  68. package/dist/FileManager/getFileTableConfig.d.ts.map +0 -1
  69. package/dist/FileManager/getFileTableConfig.js.map +0 -1
  70. package/dist/FileManager/getLocalStorageClient.d.ts +0 -3
  71. package/dist/FileManager/getLocalStorageClient.d.ts.map +0 -1
  72. package/dist/FileManager/getLocalStorageClient.js.map +0 -1
  73. package/dist/FileManager/getValidatedFileType.d.ts.map +0 -1
  74. package/dist/FileManager/getValidatedFileType.js.map +0 -1
  75. package/dist/FileManager/setupFileServeHandler.d.ts.map +0 -1
  76. package/dist/FileManager/setupFileServeHandler.js.map +0 -1
  77. /package/dist/{FileManager → StorageClient}/getValidatedFileType.d.ts +0 -0
@@ -19,7 +19,7 @@ const FILE_TABLE_COLUMN_DEFINITIONS = {
19
19
  cloud_url: `TEXT`,
20
20
  signed_url: `TEXT`,
21
21
  signed_url_expires: `BIGINT`,
22
- etag: `TEXT`,
22
+ etag: `TEXT NOT NULL`,
23
23
  deleted: `BIGINT`,
24
24
  deleted_from_storage: `BIGINT`,
25
25
  };
@@ -72,7 +72,7 @@ const getFileTableConfig = (prg) => {
72
72
  validate: async ({ data, localParams, command, filter }) => {
73
73
  const tableHandler = prg.dboBuilder.dboMap.get(fileTableName);
74
74
  if (!tableHandler)
75
- throw "FileManager tableHandler not found";
75
+ throw "Storage tableHandler not found";
76
76
  if (command === "update") {
77
77
  const { newData } = await (0, updateFile_1.updateFile)(tableHandler, fileTable, {
78
78
  filter: filter ?? {},
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFileTableConfig.js","sourceRoot":"","sources":["../../lib/StorageClient/getFileTableConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ALLOWED_CONTENT_TYPE, ALLOWED_EXTENSION } from "prostgles-types";
2
+ export declare const getFileType: (file: Buffer | string, fileName: string) => Promise<{
3
+ mime: ALLOWED_CONTENT_TYPE;
4
+ ext: ALLOWED_EXTENSION;
5
+ }>;
6
+ export declare const getFileTypeFromFilename: (fileName: string) => {
7
+ mime: ALLOWED_CONTENT_TYPE;
8
+ ext: ALLOWED_EXTENSION;
9
+ } | undefined;
10
+ //# sourceMappingURL=getFileType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFileType.d.ts","sourceRoot":"","sources":["../../lib/StorageClient/getFileType.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAG/E,eAAO,MAAM,WAAW,GACtB,MAAM,MAAM,GAAG,MAAM,EACrB,UAAU,MAAM,KACf,OAAO,CAAC;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,GAAG,EAAE,iBAAiB,CAAA;CAAE,CA0BhE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,UAAU,MAAM,KACf;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,GAAG,EAAE,iBAAiB,CAAA;CAAE,GAAG,SAgB3D,CAAC"}
@@ -1,24 +1,9 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getFileType = exports.getFileTypeFromFilename = exports.HOUR = void 0;
4
- exports.bytesToSize = bytesToSize;
5
- const prostgles_types_1 = require("prostgles-types");
6
- exports.HOUR = 3600 * 1000;
7
- const getFileTypeFromFilename = (fileName) => {
8
- const nameParts = fileName.split(".");
9
- if (nameParts.length < 2)
10
- return undefined;
11
- const nameExt = nameParts.at(-1).toLowerCase(), mime = (0, prostgles_types_1.getKeys)(prostgles_types_1.CONTENT_TYPE_TO_EXT).find((k) => prostgles_types_1.CONTENT_TYPE_TO_EXT[k].includes(nameExt));
12
- if (!mime)
13
- return undefined;
14
- return {
15
- mime,
16
- ext: nameExt,
17
- };
18
- };
19
- exports.getFileTypeFromFilename = getFileTypeFromFilename;
20
2
  // const fileType = require("file-type");
21
3
  // const res = await fileType.fromBuffer(typeof file === "string"? Buffer.from(file, 'utf8') : file);
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.getFileTypeFromFilename = exports.getFileType = void 0;
6
+ const prostgles_types_1 = require("prostgles-types");
22
7
  const getFileType = async (file, fileName) => {
23
8
  const { fileTypeFromBuffer } = await eval('import("file-type")');
24
9
  const fileNameMime = (0, exports.getFileTypeFromFilename)(fileName);
@@ -41,11 +26,17 @@ const getFileType = async (file, fileName) => {
41
26
  return res;
42
27
  };
43
28
  exports.getFileType = getFileType;
44
- function bytesToSize(bytes) {
45
- const sizes = ["Bytes", "KB", "MB", "GB", "TB"];
46
- if (bytes == 0)
47
- return "0 Byte";
48
- const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)) + "");
49
- return (bytes / Math.pow(1024, i)).toFixed(1) + " " + sizes[i];
50
- }
51
- //# sourceMappingURL=FileManager.js.map
29
+ const getFileTypeFromFilename = (fileName) => {
30
+ const nameParts = fileName.split(".");
31
+ if (nameParts.length < 2)
32
+ return undefined;
33
+ const nameExt = nameParts.at(-1).toLowerCase(), mime = (0, prostgles_types_1.getKeys)(prostgles_types_1.CONTENT_TYPE_TO_EXT).find((k) => prostgles_types_1.CONTENT_TYPE_TO_EXT[k].includes(nameExt));
34
+ if (!mime)
35
+ return undefined;
36
+ return {
37
+ mime,
38
+ ext: nameExt,
39
+ };
40
+ };
41
+ exports.getFileTypeFromFilename = getFileTypeFromFilename;
42
+ //# sourceMappingURL=getFileType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFileType.js","sourceRoot":"","sources":["../../lib/StorageClient/getFileType.ts"],"names":[],"mappings":";AAAA,yCAAyC;AACzC,qGAAqG;;;AAKrG,qDAA+D;AAExD,MAAM,WAAW,GAAG,KAAK,EAC9B,IAAqB,EACrB,QAAgB,EACiD,EAAE;IACnE,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAO,IAAI,CAAC,qBAAqB,CAG9D,CAAC;IAEH,MAAM,YAAY,GAAG,IAAA,+BAAuB,EAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,CAAC,YAAY,EAAE,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC5E,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAElG,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,mCAAmC;QACnC,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC;QACjC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACjE,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,IAAI,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CACb,gFAAgF,YAAY,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,EAAE,CACjH,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,GAAU,CAAC;AACpB,CAAC,CAAC;AA7BW,QAAA,WAAW,eA6BtB;AAEK,MAAM,uBAAuB,GAAG,CACrC,QAAgB,EACoD,EAAE;IACtE,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEtC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAE3C,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,EAC7C,IAAI,GAAG,IAAA,yBAAO,EAAC,qCAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5C,qCAAmB,CAAC,CAAC,CAAuB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAChE,CAAC;IAEJ,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAE5B,OAAO;QACL,IAAI;QACJ,GAAG,EAAE,OAA4B;KAClC,CAAC;AACJ,CAAC,CAAC;AAlBW,QAAA,uBAAuB,2BAkBlC"}
@@ -0,0 +1,15 @@
1
+ import type { LocalStorageClient } from "./StorageClientTypes";
2
+ export type LocalConfig = {
3
+ /**
4
+ * example: path.join(__dirname+'/media')
5
+ * note that this location will be relative to the compiled file location
6
+ */
7
+ localFolderPath: string;
8
+ /**
9
+ * Minimum amount of free bytes available to allow saving files
10
+ * Defaults to 100MB
11
+ */
12
+ minFreeBytes?: number;
13
+ };
14
+ export declare const getLocalStorageClient: (localConfig: LocalConfig) => LocalStorageClient;
15
+ //# sourceMappingURL=getLocalStorageClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getLocalStorageClient.d.ts","sourceRoot":"","sources":["../../lib/StorageClient/getLocalStorageClient.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,kBAAkB,EAEnB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,MAAM,WAAW,GAAG;IACxB;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,aAAa,WAAW,KAAG,kBAyGhE,CAAC"}
@@ -30,7 +30,6 @@ const getLocalStorageClient = (localConfig) => {
30
30
  type: "local",
31
31
  localFolderPath: localConfig.localFolderPath,
32
32
  upload: async (args) => {
33
- // Ensure the target directory exists
34
33
  await fs_1.default.promises.mkdir(localFolderPath, { recursive: true });
35
34
  await checkFreeSpace();
36
35
  const filePath = path_1.default.join(localFolderPath, args.fileName);
@@ -41,12 +40,12 @@ const getLocalStorageClient = (localConfig) => {
41
40
  writeStream.on("error", reject);
42
41
  writeStream.on("finish", () => {
43
42
  resolve({
44
- cloud_url: filePath,
45
- etag: hash.digest("hex"),
46
- content_length: contentLength,
43
+ type: "local",
44
+ filePath,
45
+ contentHash: hash.digest("hex"),
46
+ contentLength: contentLength,
47
47
  });
48
48
  });
49
- // Handle raw string or Buffer
50
49
  if (typeof args.file === "string" || Buffer.isBuffer(args.file)) {
51
50
  const buffer = Buffer.isBuffer(args.file) ? args.file : Buffer.from(args.file);
52
51
  contentLength = buffer.length;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getLocalStorageClient.js","sourceRoot":"","sources":["../../lib/StorageClient/getLocalStorageClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getValidatedFileType.d.ts","sourceRoot":"","sources":["../../lib/StorageClient/getValidatedFileType.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAG5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AACF,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,eAAe,EACvB,MAAM,IAAI,KACT,OAAO,CAAC;IACT,IAAI,EAAE,oBAAoB,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;CAIb,CAsEA,CAAC"}
@@ -3,11 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getValidatedFileType = void 0;
4
4
  const prostgles_types_1 = require("prostgles-types");
5
5
  const parseFieldFilter_1 = require("../DboBuilder/ViewHandler/parseFieldFilter");
6
- const FileManager_1 = require("./FileManager");
6
+ const getFileType_1 = require("./getFileType");
7
7
  const getValidatedFileType = async (config, args) => {
8
8
  const { file, fileName, tableName, colName } = args;
9
9
  const buffer = typeof file === "string" ? Buffer.from(file, "utf8") : file;
10
- const result = (0, FileManager_1.getFileTypeFromFilename)(fileName);
10
+ const result = (0, getFileType_1.getFileTypeFromFilename)(fileName);
11
11
  if (tableName && colName) {
12
12
  const tableConfig = config.referencedTables?.[tableName];
13
13
  if (tableConfig && (0, prostgles_types_1.isObject)(tableConfig) && tableConfig.referenceColumns[colName]) {
@@ -21,7 +21,7 @@ const getValidatedFileType = async (config, args) => {
21
21
  if ("acceptedContent" in colConfig &&
22
22
  colConfig.acceptedContent &&
23
23
  colConfig.acceptedContent !== "*") {
24
- const mime = await (0, FileManager_1.getFileType)(buffer, fileName);
24
+ const mime = await (0, getFileType_1.getFileType)(buffer, fileName);
25
25
  const CONTENTS = ["image", "audio", "video", "text", "application"];
26
26
  const allowedContent = (0, parseFieldFilter_1.parseFieldFilter)(colConfig.acceptedContent, false, CONTENTS);
27
27
  if (!allowedContent.some((c) => mime.mime.startsWith(c))) {
@@ -31,7 +31,7 @@ const getValidatedFileType = async (config, args) => {
31
31
  else if ("acceptedContentType" in colConfig &&
32
32
  colConfig.acceptedContentType &&
33
33
  colConfig.acceptedContentType !== "*") {
34
- const mime = await (0, FileManager_1.getFileType)(buffer, fileName);
34
+ const mime = await (0, getFileType_1.getFileType)(buffer, fileName);
35
35
  const allowedContentTypes = (0, parseFieldFilter_1.parseFieldFilter)(colConfig.acceptedContentType, false, (0, prostgles_types_1.getKeys)(prostgles_types_1.CONTENT_TYPE_TO_EXT));
36
36
  if (!allowedContentTypes.some((c) => c === mime.mime)) {
37
37
  throw new Error(`Disallowed MIME provided: ${mime.mime}. Allowed MIME values: ${allowedContentTypes} `);
@@ -40,7 +40,7 @@ const getValidatedFileType = async (config, args) => {
40
40
  else if ("acceptedFileTypes" in colConfig &&
41
41
  colConfig.acceptedFileTypes &&
42
42
  colConfig.acceptedFileTypes !== "*") {
43
- const mime = await (0, FileManager_1.getFileType)(buffer, fileName);
43
+ const mime = await (0, getFileType_1.getFileType)(buffer, fileName);
44
44
  const allowedExtensions = (0, parseFieldFilter_1.parseFieldFilter)(colConfig.acceptedFileTypes, false, Object.values(prostgles_types_1.CONTENT_TYPE_TO_EXT).flat());
45
45
  if (!allowedExtensions.some((c) => c === mime.ext)) {
46
46
  throw new Error(`Disallowed extension provided: ${mime.ext}. Allowed extension values: ${allowedExtensions} `);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getValidatedFileType.js","sourceRoot":"","sources":["../../lib/StorageClient/getValidatedFileType.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,8 @@ import type e from "express";
2
2
  import type { DB } from "../initProstgles";
3
3
  import type { Prostgles } from "../Prostgles";
4
4
  import type { FileTableConfig } from "../ProstglesTypes";
5
- import type { StorageClient } from "./FileManager";
5
+ import type { StorageClient } from "./StorageClientTypes";
6
+ export declare const getFileServeRoute: (config: FileTableConfig) => string;
6
7
  export declare const setupFileServeHandler: (db: DB, config: FileTableConfig, storageClient: StorageClient, app: e.Express, prg: Prostgles) => {
7
8
  destroy: () => void;
8
9
  };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupFileServeHandler.d.ts","sourceRoot":"","sources":["../../lib/StorageClient/setupFileServeHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAC;AAI7B,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D,eAAO,MAAM,iBAAiB,GAAI,QAAQ,eAAe,WAOxD,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,IAAI,EAAE,EACN,QAAQ,eAAe,EACvB,eAAe,aAAa,EAC5B,KAAK,CAAC,CAAC,OAAO,EACd,KAAK,SAAS;;CAkFf,CAAC"}
@@ -33,18 +33,23 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.setupFileServeHandler = void 0;
36
+ exports.setupFileServeHandler = exports.getFileServeRoute = void 0;
37
37
  const fs = __importStar(require("fs"));
38
38
  const path_1 = require("path");
39
39
  const AuthHandler_1 = require("../Auth/AuthHandler");
40
40
  const runClientRequest_1 = require("../runClientRequest");
41
- const FileManager_1 = require("./FileManager");
42
- const setupFileServeHandler = (db, config, storageClient, app, prg) => {
41
+ const getFileServeRoute = (config) => {
43
42
  const fileTableName = config.tableName;
44
43
  const fileServeRoute = config.fileServePath ?? `/${fileTableName}`;
45
44
  if (fileServeRoute.endsWith("/")) {
46
45
  throw `fileServeRoute must not end with a '/'`;
47
46
  }
47
+ return fileServeRoute;
48
+ };
49
+ exports.getFileServeRoute = getFileServeRoute;
50
+ const setupFileServeHandler = (db, config, storageClient, app, prg) => {
51
+ const fileTableName = config.tableName;
52
+ const fileServeRoute = (0, exports.getFileServeRoute)(config);
48
53
  const fileRouteExpress = fileServeRoute + "/:name";
49
54
  app.get(fileRouteExpress, async (req, res) => {
50
55
  try {
@@ -79,7 +84,8 @@ const setupFileServeHandler = (db, config, storageClient, app, prg) => {
79
84
  if (storageClient.type === "cloud") {
80
85
  let url = file.signed_url;
81
86
  const expires = +(file.signed_url_expires || 0);
82
- const EXPIRES = Date.now() + FileManager_1.HOUR;
87
+ const HOUR = 3600 * 1000;
88
+ const EXPIRES = Date.now() + HOUR;
83
89
  if (!url || expires < EXPIRES) {
84
90
  url = await storageClient.getSignedUrlForDownload(file.name, 60 * 60);
85
91
  await db.any("UPDATE ${fileTableName:name} SET signed_url = ${signed_url}, signed_url_expires = ${signed_url_expires} WHERE id = ${id}", {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupFileServeHandler.js","sourceRoot":"","sources":["../../lib/StorageClient/setupFileServeHandler.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -7,8 +7,8 @@ export * from "./Auth/AuthTypes";
7
7
  export type { PublishParams } from "./PublishParser/publishTypesAndUtils";
8
8
  export type { DBOFullyTyped } from "./DBSchemaBuilder/DBSchemaBuilder";
9
9
  export type { DBHandlerServer } from "./Prostgles";
10
- export type { StorageClient as CloudClient, LocalConfig } from "./FileManager/FileManager";
11
- export * from "./FileManager/getLocalStorageClient";
10
+ export type { StorageClient as CloudClient } from "./StorageClient/StorageClientTypes";
11
+ export * from "./StorageClient/getLocalStorageClient";
12
12
  export type { DB } from "./initProstgles";
13
13
  export type * from "./TableConfig/TableConfigTypes";
14
14
  export * from "./Auth/utils/upsertNamedExpressMiddleware";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAwB,MAAM,iBAAiB,CAAC;AAExE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,iBAAS,SAAS,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,SAAS,WAAW,GAAG,WAAW,EAClE,MAAM,EAAE,oBAAoB,CAAC,CAAC,EAAE,KAAK,CAAC,GAKrB,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAC/C;AACD,cAAc,sCAAsC,CAAC;AACrD,cAAc,kBAAkB,CAAC;AACjC,YAAY,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,YAAY,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,aAAa,IAAI,WAAW,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC3F,cAAc,qCAAqC,CAAC;AACpD,YAAY,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAC1C,mBAAmB,gCAAgC,CAAC;AACpD,cAAc,2CAA2C,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC/E,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAwB,MAAM,iBAAiB,CAAC;AAExE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,iBAAS,SAAS,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,SAAS,WAAW,GAAG,WAAW,EAClE,MAAM,EAAE,oBAAoB,CAAC,CAAC,EAAE,KAAK,CAAC,GAKrB,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAC/C;AACD,cAAc,sCAAsC,CAAC;AACrD,cAAc,kBAAkB,CAAC;AACjC,YAAY,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,YAAY,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACvF,cAAc,uCAAuC,CAAC;AACtD,YAAY,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAC1C,mBAAmB,gCAAgC,CAAC;AACpD,cAAc,2CAA2C,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC/E,eAAe,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -23,7 +23,7 @@ function prostgles(params) {
23
23
  }
24
24
  __exportStar(require("./PublishParser/defineServerFunction"), exports);
25
25
  __exportStar(require("./Auth/AuthTypes"), exports);
26
- __exportStar(require("./FileManager/getLocalStorageClient"), exports);
26
+ __exportStar(require("./StorageClient/getLocalStorageClient"), exports);
27
27
  __exportStar(require("./Auth/utils/upsertNamedExpressMiddleware"), exports);
28
28
  exports.default = prostgles;
29
29
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAEA,2CAAwC;AAGxC,SAAS,SAAS,CAChB,MAAsC;IAEtC,MAAM,IAAI,GAAG,IAAI,qBAAS,CAAC,MAA8B,CAAC,CAAC;IAC3D,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAA0C,EAAE;QAClE,IAAI,EAAE,MAAM;KACb,CAA6C,CAAC;AACjD,CAAC;AACD,uEAAqD;AACrD,mDAAiC;AAKjC,sEAAoD;AAGpD,4EAA0D;AAE1D,kBAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAEA,2CAAwC;AAGxC,SAAS,SAAS,CAChB,MAAsC;IAEtC,MAAM,IAAI,GAAG,IAAI,qBAAS,CAAC,MAA8B,CAAC,CAAC;IAC3D,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAA0C,EAAE;QAClE,IAAI,EAAE,MAAM;KACb,CAA6C,CAAC;AACjD,CAAC;AACD,uEAAqD;AACrD,mDAAiC;AAKjC,wEAAsD;AAGtD,4EAA0D;AAE1D,kBAAe,SAAS,CAAC"}
@@ -3,7 +3,7 @@ import type { AnyObject } from "prostgles-types";
3
3
  import { asName, pickKeys } from "prostgles-types";
4
4
  import type { FileTableConfig } from "../../ProstglesTypes";
5
5
  import type { TableHandlers } from "../DboBuilder";
6
- import type { FileTableRow } from "../../FileManager/getFileTableConfig";
6
+ import type { FileTableRow } from "../../StorageClient/getFileTableConfig";
7
7
 
8
8
  type OnDeleteFromFileTableArgs = {
9
9
  returningQuery: undefined | string;
@@ -1,6 +1,6 @@
1
1
  import type { AnyObject } from "prostgles-types";
2
2
  import { getJSONBObjectSchemaValidationError, omitKeys } from "prostgles-types";
3
- import type { FileTableRow } from "../../FileManager/getFileTableConfig";
3
+ import type { FileTableRow } from "../../StorageClient/getFileTableConfig";
4
4
  import type { FileTableConfig } from "../../ProstglesTypes";
5
5
  import type { LocalParams } from "../DboBuilder";
6
6
  import { isFile, uploadFile } from "../uploadFile";
@@ -1,10 +1,11 @@
1
1
  import { randomUUID } from "crypto";
2
2
  import type { AnyObject } from "prostgles-types";
3
3
  import { getKeys, isObject } from "prostgles-types";
4
- import type { FileTableRow } from "../FileManager/getFileTableConfig";
5
- import { getValidatedFileType } from "../FileManager/getValidatedFileType";
4
+ import type { FileTableRow } from "../StorageClient/getFileTableConfig";
5
+ import { getValidatedFileType } from "../StorageClient/getValidatedFileType";
6
6
  import type { FileTableConfig } from "../ProstglesTypes";
7
7
  import type { LocalParams } from "./DboBuilder";
8
+ import { getFileServeRoute } from "../StorageClient/setupFileServeHandler";
8
9
 
9
10
  export const isFile = (row: any): row is { data: Buffer; name: string } => {
10
11
  return Boolean(
@@ -65,6 +66,11 @@ export const uploadFile = async (
65
66
  contentType: coreInfo.content_type,
66
67
  });
67
68
 
69
+ const { contentLength, contentHash } = uploadedInfo;
70
+ const { filePath } = uploadedInfo.type === "local" ? uploadedInfo : {};
71
+ const { url } = uploadedInfo.type === "cloud" ? uploadedInfo : {};
72
+
73
+ const fileServeRoute = getFileServeRoute(config);
68
74
  const mediaRow: FileTableRow = {
69
75
  signed_url: null,
70
76
  signed_url_expires: null,
@@ -73,10 +79,11 @@ export const uploadFile = async (
73
79
  deleted_from_storage: null,
74
80
  description: "",
75
81
  ...coreInfo,
76
- ...uploadedInfo,
82
+ cloud_url: url ?? "",
83
+ etag: contentHash,
77
84
  extension: type.ext,
78
- url: uploadedInfo.cloud_url,
79
- content_length: String(uploadedInfo.content_length),
85
+ url: [fileServeRoute, coreInfo.name].join("/"),
86
+ content_length: String(contentLength),
80
87
  };
81
88
 
82
89
  return mediaRow;
package/lib/Logging.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { ABORTABLE_METHODS, AnyObject, ClientSchema, TableHandler } from "prostgles-types";
1
+ import type { AnyObject, ClientSchema, TableHandler } from "prostgles-types";
2
2
  import type { LocalParams } from "./DboBuilder/DboBuilder";
3
3
  import type { PubSubManagerTriggers, SyncParams } from "./PubSubManager/PubSubManager";
4
4
  import type { NotifTypeName } from "./PubSubManager/PubSubManagerUtils";
package/lib/Prostgles.ts CHANGED
@@ -60,7 +60,7 @@ import { randomUUID } from "crypto";
60
60
  import * as fs from "fs";
61
61
  import type { getAdminClient } from "./DboBuilder/runSql/getAdminClient";
62
62
  import type { TableHandler } from "./DboBuilder/TableHandler/TableHandler";
63
- import { getFileTableConfig } from "./FileManager/getFileTableConfig";
63
+ import { getFileTableConfig } from "./StorageClient/getFileTableConfig";
64
64
 
65
65
  export class Prostgles {
66
66
  /**
@@ -232,12 +232,8 @@ export class Prostgles {
232
232
  };
233
233
 
234
234
  initRestApi = () => {
235
- if (this.opts.restApi) {
236
- this.restApi = new RestApi({ prostgles: this, ...this.opts.restApi });
237
- } else {
238
- this.restApi?.destroy();
239
- this.restApi = undefined;
240
- }
235
+ this.restApi?.destroy();
236
+ this.restApi = this.opts.restApi && new RestApi({ prostgles: this, ...this.opts.restApi });
241
237
  };
242
238
 
243
239
  initAuthHandler = () => {
@@ -6,7 +6,7 @@ import type {
6
6
  SessionUser,
7
7
  } from "./Auth/AuthTypes";
8
8
  import type { EventTriggerTagFilter } from "./Event_Trigger_Tags";
9
- import type { StorageClient } from "./FileManager/FileManager";
9
+ import type { StorageClient } from "./StorageClient/StorageClientTypes";
10
10
  import type { DbConnection, OnReadyCallback } from "./initProstgles";
11
11
  import type { EventInfo } from "./Logging";
12
12
  import type { RestApiConfig } from "./RestApi";
@@ -84,38 +84,29 @@ export const getSyncUtilFunctions = ({
84
84
  s_count: count,
85
85
  };
86
86
  },
87
- getClientRowInfo = (args: SyncBatchInfo = {}) => {
87
+ getClientRowInfo = async (args: SyncBatchInfo = {}) => {
88
88
  const { from_synced = undefined, to_synced = undefined, end_offset = null } = args;
89
89
  const onSyncRequest = { from_synced, to_synced, end_offset };
90
- const result = withTimeout(
91
- new Promise<ClientSyncInfo>(async (resolve, reject) => {
92
- const res = await handlers.ServerSyncRequest(onSyncRequest);
93
- if (res.state === "error") {
94
- reject(res.err);
95
- } else {
96
- resolve(res);
97
- }
98
- }),
99
- 5000,
100
- );
101
90
 
102
- return result;
91
+ const res = await withTimeout(handlers.ServerSyncRequest(onSyncRequest), 5000);
92
+ if (res.state === "error") {
93
+ throw res.err;
94
+ }
95
+ return res;
103
96
  },
104
- getClientData = (from_synced: number | undefined, offset = 0): Promise<AnyObject[]> => {
105
- return new Promise(async (resolve, reject) => {
106
- const onPullRequest = {
107
- from_synced,
108
- offset,
109
- limit: batch_size,
110
- to_synced: undefined,
111
- };
112
- const res = await handlers.PullRequest(onPullRequest);
113
- if (!res.success) {
114
- reject(res.err);
115
- } else {
116
- resolve(sortClientData(res.data));
117
- }
118
- });
97
+ getClientData = async (from_synced: number | undefined, offset = 0): Promise<AnyObject[]> => {
98
+ const onPullRequest = {
99
+ from_synced,
100
+ offset,
101
+ limit: batch_size,
102
+ to_synced: undefined,
103
+ };
104
+ const res = await handlers.PullRequest(onPullRequest);
105
+ if (!res.success) {
106
+ throw res.err;
107
+ } else {
108
+ return sortClientData(res.data);
109
+ }
119
110
 
120
111
  function sortClientData(data: AnyObject[]) {
121
112
  return data.sort((a, b) => {
@@ -273,22 +264,18 @@ export const getSyncUtilFunctions = ({
273
264
  ) => {
274
265
  const items = request.state === "syncing-data" ? request.data : undefined;
275
266
  const start = Date.now();
276
- const result = await new Promise<{
277
- pushed: number;
278
- }>(async (resolve, reject) => {
279
- const resp = await handlers.UpdateRequest(
280
- request.state === "synced" ?
281
- { state: "synced", isSynced: true }
282
- : { state: "syncing", data: request.data },
283
- );
284
- if (resp.success) {
285
- // console.log("PUSHED to client: fr/lr", data[0], data[data.length - 1]);
286
- resolve({ pushed: items?.length ?? 0 });
287
- } else {
288
- reject(resp);
289
- console.error("Unexpected response");
290
- }
291
- });
267
+
268
+ const resp = await handlers.UpdateRequest(
269
+ request.state === "synced" ?
270
+ { state: "synced", isSynced: true }
271
+ : { state: "syncing", data: request.data },
272
+ );
273
+ if (!resp.success) {
274
+ console.error("Unexpected response");
275
+ throw resp;
276
+ }
277
+
278
+ const result = { pushed: items?.length ?? 0 };
292
279
 
293
280
  await pubSubManager._log({
294
281
  type: "sync",
@@ -123,7 +123,14 @@ export async function syncData(
123
123
  /**
124
124
  * After all data was inserted request SyncInfo from client and sync again if necessary
125
125
  */
126
- void this.syncData(sync, undefined, source);
126
+ void this.syncData(sync, undefined, source).catch((error) => {
127
+ console.error("Follow-up replication failed", {
128
+ tableName: sync.table_name,
129
+ channelName: sync.channel_name,
130
+ socketId: sync.socket_id,
131
+ error,
132
+ });
133
+ });
127
134
  },
128
135
  });
129
136
 
@@ -117,14 +117,21 @@ export async function notifListener(this: PubSubManager, data: { payload: string
117
117
  */
118
118
  const changedColumns =
119
119
  !changedColumnsByTriggerId ? "*" : (changedColumnsByTriggerId[table_condition_id] ?? "*");
120
- log(
121
- "notifListener",
122
- subs.map((s) => s.channel_name),
123
- syncs.map((s) => s.channel_name),
124
- );
125
-
126
- syncs.map((s) => {
127
- void this.syncData(s, undefined, "trigger");
120
+ // log(
121
+ // "notifListener",
122
+ // subs.map((s) => s.channel_name),
123
+ // syncs.map((s) => s.channel_name),
124
+ // );
125
+
126
+ syncs.forEach((sync) => {
127
+ void this.syncData(sync, undefined, "trigger").catch((error) => {
128
+ console.error("Triggered replication failed", {
129
+ tableName: sync.table_name,
130
+ channelName: sync.channel_name,
131
+ socketId: sync.socket_id,
132
+ error,
133
+ });
134
+ });
128
135
  });
129
136
 
130
137
  const operation = (op_name?.toLowerCase() || "insert") as "insert" | "delete" | "update";
@@ -0,0 +1,37 @@
1
+ import type * as stream from "stream";
2
+
3
+ export type LocalUploadedFileDetails = {
4
+ type: "local";
5
+ filePath: string;
6
+ contentHash: string;
7
+ contentLength: number;
8
+ };
9
+ export type CloudUploadedFileDetails = {
10
+ type: "cloud";
11
+ url: string;
12
+ /**
13
+ * The ETag
14
+ */
15
+ contentHash: string;
16
+ contentLength: number;
17
+ };
18
+ export type UploadFileOptions = {
19
+ fileName: string;
20
+ contentType: string;
21
+ file: string | Buffer | stream.PassThrough;
22
+ onProgress?: (bytesUploaded: number) => void;
23
+ };
24
+ export type StorageClientBase<T> = {
25
+ upload: (file: UploadFileOptions) => Promise<T>;
26
+ downloadAsStream: (name: string) => Promise<stream.Readable>;
27
+ delete: (fileName: string) => Promise<void>;
28
+ };
29
+ export type LocalStorageClient = StorageClientBase<LocalUploadedFileDetails> & {
30
+ type: "local";
31
+ localFolderPath: string;
32
+ };
33
+ export type CloudStorageClient = StorageClientBase<CloudUploadedFileDetails> & {
34
+ type: "cloud";
35
+ getSignedUrlForDownload: (fileName: string, expiresInSeconds: number) => Promise<string>;
36
+ };
37
+ export type StorageClient = LocalStorageClient | CloudStorageClient;
@@ -20,7 +20,7 @@ const FILE_TABLE_COLUMN_DEFINITIONS = {
20
20
  cloud_url: `TEXT`,
21
21
  signed_url: `TEXT`,
22
22
  signed_url_expires: `BIGINT`,
23
- etag: `TEXT`,
23
+ etag: `TEXT NOT NULL`,
24
24
  deleted: `BIGINT`,
25
25
  deleted_from_storage: `BIGINT`,
26
26
  } as const;
@@ -98,7 +98,7 @@ export const getFileTableConfig = (prg: Prostgles): TableConfig | undefined => {
98
98
  },
99
99
  validate: async ({ data, localParams, command, filter }) => {
100
100
  const tableHandler = prg.dboBuilder.dboMap.get(fileTableName);
101
- if (!tableHandler) throw "FileManager tableHandler not found";
101
+ if (!tableHandler) throw "Storage tableHandler not found";
102
102
 
103
103
  if (command === "update") {
104
104
  const { newData } = await updateFile(tableHandler, fileTable, {