UNPKG

prostgles-client

Version:

Reactive client for Postgres

152 lines (151 loc) 6.52 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.asName = exports.debug = exports.isClientSide = void 0; exports.prostgles = prostgles; const prostgles_types_1 = require("prostgles-types"); Object.defineProperty(exports, "asName", { enumerable: true, get: function () { return prostgles_types_1.asName; } }); const getAuthHandler_1 = require("./getAuthHandler"); const getDbHandler_1 = require("./getDbHandler"); const getMethods_1 = require("./getMethods"); const getSqlHandler_1 = require("./getSqlHandler"); const getSubscriptionHandler_1 = require("./getSubscriptionHandler"); const getSyncHandler_1 = require("./getSyncHandler"); const DEBUG_KEY = "DEBUG_SYNCEDTABLE"; exports.isClientSide = typeof window !== "undefined"; const debug = function (...args) { if (exports.isClientSide && window[DEBUG_KEY]) { window[DEBUG_KEY](...args); } }; exports.debug = debug; __exportStar(require("./hooks/useEffectDeep"), exports); __exportStar(require("./hooks/useProstglesClient"), exports); function prostgles(initOpts, syncedTable) { const { endpoint, socket, onReady, onDisconnect, onReconnect, onSchemaChange, onReload, onDebug, credentials, redirect, } = initOpts; let schemaAge; (0, exports.debug)("prostgles", { initOpts }); if (onSchemaChange) { socket.removeAllListeners(prostgles_types_1.CHANNELS.SCHEMA_CHANGED); socket.on(prostgles_types_1.CHANNELS.SCHEMA_CHANGED, onSchemaChange); } const subscriptionHandler = (0, getSubscriptionHandler_1.getSubscriptionHandler)(initOpts); const syncHandler = (0, getSyncHandler_1.getSyncHandler)(initOpts); const sqlHandler = (0, getSqlHandler_1.getSqlHandler)(initOpts); let state; return new Promise((resolve, reject) => { socket.removeAllListeners("connect_error"); socket.on("connect_error", (err) => { reject(err); }); socket.removeAllListeners(prostgles_types_1.CHANNELS.CONNECTION); socket.on(prostgles_types_1.CHANNELS.CONNECTION, (error) => { reject(error); return "ok"; }); if (onDisconnect) { socket.on("disconnect", () => { state = "disconnected"; onDisconnect(); }); } if (onReconnect) { /** A reconnect will happen after the server is ready and pushed the schema */ socket.on("connect", () => { if (state === "disconnected") { state = "reconnected"; } }); } /* Schema = published schema */ socket.on(prostgles_types_1.CHANNELS.SCHEMA, async (args) => { await (onDebug === null || onDebug === void 0 ? void 0 : onDebug({ type: "schemaChanged", data: args, state })); const { joinTables = [], ...clientSchema } = args; const { methods, tableSchema, auth: authConfig, rawSQL, err } = clientSchema; /** Only destroy existing syncs if schema changed */ const schemaDidNotChange = (schemaAge === null || schemaAge === void 0 ? void 0 : schemaAge.clientSchema) && (0, prostgles_types_1.isEqual)(schemaAge.clientSchema, clientSchema); if (!schemaDidNotChange) { syncHandler .destroySyncs() .catch((error) => console.error("Error while destroying syncs", error)); } if (err) { console.error("Error on schema change:", err); } if ((state === "connected" || state === "reconnected") && onReconnect) { onReconnect(socket, err); if (err) { return; } schemaAge = { origin: "onReconnect", date: new Date(), clientSchema }; } else { schemaAge = { origin: "onReady", date: new Date(), clientSchema }; } if (err) { reject(err); return; } const isReconnect = state === "reconnected"; state = "connected"; const auth = (0, getAuthHandler_1.getAuthHandler)({ authData: authConfig, socket, onReload, endpoint, credentials, redirect, }); const { methodHandlers, methodSchema } = (0, getMethods_1.getMethods)({ onDebug, methods, socket }); const { db } = (0, getDbHandler_1.getDB)({ onDebug, syncedTable, syncHandler, subscriptionHandler, socket, tableSchema, }); const sql = rawSQL ? (0, getSqlHandler_1.getSqlHandler)(initOpts).sql : undefined; subscriptionHandler.reAttachAll(); syncHandler.reAttachAll(); (async () => { try { const onReadyArgs = { db, sql, methods: methodHandlers, methodSchema, tableSchema, auth, socket, isReconnect, }; await (onDebug === null || onDebug === void 0 ? void 0 : onDebug({ type: "onReady.call", data: onReadyArgs, state, })); await onReady(onReadyArgs); } catch (err) { console.error("Prostgles: Error within onReady: \n", err); reject(err); } resolve(db); })(); }); }); }