@autofleet/sequelize-utils 6.1.19-ghp → 6.1.20
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/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`@autofleet/logger`);c=s(c);let l=require(`sequelize`)
|
|
1
|
+
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`@autofleet/logger`);c=s(c);let l=require(`sequelize`),u=require(`debug`);u=s(u);const d=(0,c.default)();var f=d;const p=async(e,t)=>{t.transaction?t.transaction.afterCommit(()=>e()):await e()};var m=p;const h=e=>e instanceof Date||Object.prototype.toString.call(e)===`[object Date]`,g=e=>{let t={};for(let[n,r]of Object.entries(e))t[n]=h(r)?r.getTime()/1e3:r;return t},_=(e,t,n,r)=>{let i=r??f;if(!n){i.warn(`Events object must be provided to addModelEventHooks`);return}let a=(e,r=!1)=>{try{let a=e.get();r&&Object.assign(a,{deletedAt:new Date});let o=t[e.constructor.name]?.tableName,s=g(a);if(!o)return;n.sendObject(o,`1`,s,Object.keys(e.rawAttributes)).catch(e=>{i.error(`sendObject error`,{tableName:o,eventVersion:`1`,e})})}catch(e){i.error(`dimTables error`,{e})}};e.addHook(`afterSave`,(e,t)=>m(()=>a(e),t)),e.addHook(`afterDestroy`,(e,t)=>m(()=>a(e,!0),t))};var v=_;const y=(0,u.default)(`sequelize-utils`),b=async(e,t,n=2,r={})=>{if(typeof t!=`function`)throw Error(`funcToRun must be a function`);if(typeof n!=`number`)throw Error(`if defined, retriesCount must be a number`);if(n<0)throw Error(`retriesCount must be a positive number`);try{return await e.transaction(r,async e=>await t(e))}catch(i){if((i instanceof l.DatabaseError||i?.constructor?.name===`DatabaseError`)&&--n>=0)return y(`error inside transactionWithRetry - will retry times ${n}`,i),b(e,t,n,r);throw n===-1&&y(`error inside transactionWithRetry - will stop retry`,i),i}},x=`rollback has been called on this transaction`,S=`Transaction cancelled due to request cancellation`,C=(e,t,n,r)=>{let i=!1;if(t.socket.destroyed)throw y(S),Error(S);return e.transaction(async e=>{let a=async()=>{y(S),!i&&(i=!0,await e.rollback())},o=async()=>{if(!n.writableFinished){if(y(S),i)return;i=!0,await e.rollback()}};t.socket.once(`close`,a),n.once(`close`,o);let s=()=>{t.socket.removeListener(`close`,a),n.removeListener(`close`,o)};try{let t=await r(e);return s(),t}catch(e){throw s(),e.message.includes(`rollback has been called on this transaction`)?Error(S):e}})};var w=(e,t)=>{let n=(t,n,r)=>b(e,t,n,r);return{httpBasedTransaction:(t,n,r)=>C(e,t,n,r),transactionWithRetry:n,registerModelEventHooks:(n,r)=>v(e,n,r,t),runAfterTransactionCommits:m,useOrCreateTransaction:(e,t)=>e?t(e):n(t,0)}};module.exports=w;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["defaultExport: LoggerInstanceManager","newObj: Record<string, unknown>","packageLogger","runAfterTransactionCommits","debugLog: debug.Debugger","sequelize","DatabaseError","sequelize","transactionWithRetry","_transactionWithRetry","sequelize","httpBasedTransaction","_httpBasedTransaction","addModelEventHooks"],"sources":["../src/logger.ts","../src/runAfterTransactionCommits.ts","../src/model-event-hooks.ts","../src/common.ts","../src/transaction-with-retry.ts","../src/http-based-transaction.ts","../src/index.ts"],"sourcesContent":["import Logger, { type LoggerInstanceManager } from '@autofleet/logger';\n\nconst defaultExport: LoggerInstanceManager = Logger();\nexport default defaultExport;\n","import type { Transactionable } from 'sequelize';\n\nconst runAfterTransactionCommits = async (cb: () => void | Promise<void>, options: Transactionable): Promise<void> => {\n if (options.transaction) {\n options.transaction.afterCommit(() => cb());\n } else {\n await cb();\n }\n};\nexport default runAfterTransactionCommits;\n","import type { Model, Sequelize } from 'sequelize';\nimport type Events from '@autofleet/events';\nimport type { LoggerInstanceManager } from '@autofleet/logger';\nimport packageLogger from './logger';\nimport runAfterTransactionCommits from './runAfterTransactionCommits';\n\nexport type ModelMapping = Record<string, { tableName: string; }>;\n\nconst isDate = (input: unknown): input is Date => input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\nconst formatDatesInObject = (obj: object) => {\n const newObj: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const valueToUse = isDate(value) ? value.getTime() / 1000 : value;\n newObj[key] = valueToUse;\n }\n return newObj;\n};\n\nconst addModelEventHooks = (sequelize: Sequelize, modelTableMapping: ModelMapping, events: Events, logger?: LoggerInstanceManager): void => {\n const localLogger = logger ?? packageLogger;\n if (!events) {\n localLogger.warn('Events object must be provided to addModelEventHooks');\n return;\n }\n const updateEventToDimTable = (object: Model, isDelete = false) => {\n try {\n const objectToSend = object.get();\n if (isDelete) {\n Object.assign(objectToSend, { deletedAt: new Date() });\n }\n const tableName = modelTableMapping[object.constructor.name]?.tableName;\n const eventVersion = '1';\n const objectToSendFormatted = formatDatesInObject(objectToSend);\n if (!tableName) {\n return;\n }\n events.sendObject(\n tableName,\n eventVersion,\n objectToSendFormatted,\n // @ts-expect-error the rawAttributes is typed as static, while it actually is on the instance level.\n Object.keys(object.rawAttributes),\n ).catch((e) => {\n localLogger.error('sendObject error', { tableName, eventVersion, e });\n });\n } catch (e) {\n localLogger.error('dimTables error', { e });\n }\n };\n\n sequelize.addHook('afterSave', (savedObject, options) => runAfterTransactionCommits(() => updateEventToDimTable(savedObject), options));\n sequelize.addHook('afterDestroy', (savedObject, options) => runAfterTransactionCommits(() => updateEventToDimTable(savedObject, true), options));\n};\n\nexport default addModelEventHooks;\n","import debug from 'debug';\n\nexport const debugLog: debug.Debugger = debug('sequelize-utils');\n","import {\n DatabaseError, type Sequelize, type Transaction, type TransactionOptions,\n} from 'sequelize';\nimport { debugLog } from './common';\n\nexport const transactionWithRetry = async <T>(sequelize: Sequelize, funcToRun: (transaction: Transaction) => Promise<T>, retriesCount = 2, options: TransactionOptions = {}): Promise<T> => {\n if (typeof funcToRun !== 'function') {\n throw new Error('funcToRun must be a function');\n }\n if (typeof retriesCount !== 'number') {\n throw new Error('if defined, retriesCount must be a number');\n }\n if (retriesCount < 0) {\n throw new Error('retriesCount must be a positive number');\n }\n try {\n const transValue = await sequelize.transaction(options, async (transaction) => {\n const funcValue = await funcToRun(transaction);\n return funcValue;\n });\n return transValue;\n } catch (e) {\n if ((e instanceof DatabaseError || e?.constructor?.name === 'DatabaseError') && --retriesCount >= 0) {\n debugLog(`error inside transactionWithRetry - will retry times ${retriesCount}`, e);\n return transactionWithRetry(sequelize, funcToRun, retriesCount, options);\n }\n if (retriesCount === -1) {\n debugLog('error inside transactionWithRetry - will stop retry', e);\n }\n throw e;\n }\n};\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { Sequelize, Transaction } from 'sequelize';\nimport { debugLog } from './common';\n\nconst rollbackErrorText = 'rollback has been called on this transaction';\nconst abortErrorText = 'Transaction cancelled due to request cancellation';\n\nexport const httpBasedTransaction = <T>(sequelize: Sequelize, req: IncomingMessage, res: ServerResponse, cb: (transaction: Transaction) => Promise<T>): Promise<T> => {\n let aborted = false;\n if (req.socket.destroyed) {\n debugLog(abortErrorText);\n throw new Error(abortErrorText);\n }\n return sequelize.transaction(async (transaction: Transaction) => {\n // https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/test/parallel/test-http-aborted.js#L9\n\n // 2023-04-13: Node.js 16.0.0\n // Added also the `res.writableFinished` check, because it seems that the socket is not destroyed when the request is aborted, but the response is not finished.\n // https://github.com/Jimbly/http-proxy-node16/commit/ba0c414cd03799e357c5d867c11dea06a9c34ec8#diff-b2d1e3b7c5f3b424a0af7971c582c822fd25a5ea279040ef6dc93fc4b2cf619dR151\n\n const rollback = async () => {\n debugLog(abortErrorText);\n if (aborted) return;\n aborted = true;\n await transaction.rollback();\n };\n const resRollback = async () => {\n const didNotFinishWrite = !res.writableFinished;\n if (didNotFinishWrite) {\n debugLog(abortErrorText);\n if (aborted) return;\n aborted = true;\n await transaction.rollback();\n }\n };\n req.socket.once('close', rollback);\n res.once('close', resRollback);\n\n const removeListeners = () => {\n req.socket.removeListener('close', rollback);\n res.removeListener('close', resRollback);\n };\n\n try {\n const response = await cb(transaction);\n removeListeners();\n return response;\n } catch (e) {\n removeListeners();\n if (e.message.includes(rollbackErrorText)) {\n throw new Error(abortErrorText);\n }\n throw e;\n }\n });\n};\n","import type {\n Sequelize,\n Transaction,\n TransactionOptions,\n} from 'sequelize';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { LoggerInstanceManager } from '@autofleet/logger';\nimport type Events from '@autofleet/events';\nimport addModelEventHooks, { type ModelMapping } from './model-event-hooks';\nimport { transactionWithRetry as _transactionWithRetry } from './transaction-with-retry';\nimport { httpBasedTransaction as _httpBasedTransaction } from './http-based-transaction';\nimport runAfterTransactionCommits from './runAfterTransactionCommits';\n\ntype ArgsWithoutSequelize<T> = T extends (arg1: Sequelize, ...args: infer U) => unknown ? U : never;\n\nexport default (sequelize: Sequelize, logger?: LoggerInstanceManager): {\n transactionWithRetry: <T>(...args: ArgsWithoutSequelize<typeof _transactionWithRetry<T>>) => Promise<T>;\n httpBasedTransaction: <T>(...args: ArgsWithoutSequelize<typeof _httpBasedTransaction<T>>) => Promise<T>;\n registerModelEventHooks: (modelTableMapping: ModelMapping, events: Events) => void;\n runAfterTransactionCommits: typeof runAfterTransactionCommits;\n useOrCreateTransaction: <T>(transaction: Transaction | null | undefined, cb: (t: Transaction) => Promise<T>) => Promise<T>;\n} => {\n const transactionWithRetry = <T>(\n funcToRun: (transaction: Transaction) => Promise<T>,\n retriesCount?: number,\n options?: TransactionOptions,\n ): Promise<T> => _transactionWithRetry(sequelize, funcToRun, retriesCount, options);\n const httpBasedTransaction = <T>(req: IncomingMessage, res: ServerResponse, cb: (transaction: Transaction) => Promise<T>): Promise<T> => _httpBasedTransaction(sequelize, req, res, cb);\n const registerModelEventHooks = (modelTableMapping: ModelMapping, events: Events) => addModelEventHooks(sequelize, modelTableMapping, events, logger);\n const useOrCreateTransaction = <T>(transaction: Transaction | null | undefined, cb: (t: Transaction) => Promise<T>) => {\n if (transaction) {\n return cb(transaction);\n }\n return transactionWithRetry(cb, 0);\n };\n\n return {\n httpBasedTransaction,\n transactionWithRetry,\n registerModelEventHooks,\n runAfterTransactionCommits,\n useOrCreateTransaction,\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["defaultExport: LoggerInstanceManager","newObj: Record<string, unknown>","packageLogger","runAfterTransactionCommits","debugLog: debug.Debugger","sequelize","DatabaseError","sequelize","transactionWithRetry","_transactionWithRetry","sequelize","httpBasedTransaction","_httpBasedTransaction","addModelEventHooks"],"sources":["../src/logger.ts","../src/runAfterTransactionCommits.ts","../src/model-event-hooks.ts","../src/common.ts","../src/transaction-with-retry.ts","../src/http-based-transaction.ts","../src/index.ts"],"sourcesContent":["import Logger, { type LoggerInstanceManager } from '@autofleet/logger';\n\nconst defaultExport: LoggerInstanceManager = Logger();\nexport default defaultExport;\n","import type { Transactionable } from 'sequelize';\n\nconst runAfterTransactionCommits = async (cb: () => void | Promise<void>, options: Transactionable): Promise<void> => {\n if (options.transaction) {\n options.transaction.afterCommit(() => cb());\n } else {\n await cb();\n }\n};\nexport default runAfterTransactionCommits;\n","import type { Model, Sequelize } from 'sequelize';\nimport type Events from '@autofleet/events';\nimport type { LoggerInstanceManager } from '@autofleet/logger';\nimport packageLogger from './logger';\nimport runAfterTransactionCommits from './runAfterTransactionCommits';\n\nexport type ModelMapping = Record<string, { tableName: string; }>;\n\nconst isDate = (input: unknown): input is Date => input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\nconst formatDatesInObject = (obj: object) => {\n const newObj: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const valueToUse = isDate(value) ? value.getTime() / 1000 : value;\n newObj[key] = valueToUse;\n }\n return newObj;\n};\n\nconst addModelEventHooks = (sequelize: Sequelize, modelTableMapping: ModelMapping, events: Events, logger?: LoggerInstanceManager): void => {\n const localLogger = logger ?? packageLogger;\n if (!events) {\n localLogger.warn('Events object must be provided to addModelEventHooks');\n return;\n }\n const updateEventToDimTable = (object: Model, isDelete = false) => {\n try {\n const objectToSend = object.get();\n if (isDelete) {\n Object.assign(objectToSend, { deletedAt: new Date() });\n }\n const tableName = modelTableMapping[object.constructor.name]?.tableName;\n const eventVersion = '1';\n const objectToSendFormatted = formatDatesInObject(objectToSend);\n if (!tableName) {\n return;\n }\n events.sendObject(\n tableName,\n eventVersion,\n objectToSendFormatted,\n // @ts-expect-error the rawAttributes is typed as static, while it actually is on the instance level.\n Object.keys(object.rawAttributes),\n ).catch((e) => {\n localLogger.error('sendObject error', { tableName, eventVersion, e });\n });\n } catch (e) {\n localLogger.error('dimTables error', { e });\n }\n };\n\n sequelize.addHook('afterSave', (savedObject, options) => runAfterTransactionCommits(() => updateEventToDimTable(savedObject), options));\n sequelize.addHook('afterDestroy', (savedObject, options) => runAfterTransactionCommits(() => updateEventToDimTable(savedObject, true), options));\n};\n\nexport default addModelEventHooks;\n","import debug from 'debug';\n\nexport const debugLog: debug.Debugger = debug('sequelize-utils');\n","import {\n DatabaseError, type Sequelize, type Transaction, type TransactionOptions,\n} from 'sequelize';\nimport { debugLog } from './common';\n\nexport const transactionWithRetry = async <T>(sequelize: Sequelize, funcToRun: (transaction: Transaction) => Promise<T>, retriesCount = 2, options: TransactionOptions = {}): Promise<T> => {\n if (typeof funcToRun !== 'function') {\n throw new Error('funcToRun must be a function');\n }\n if (typeof retriesCount !== 'number') {\n throw new Error('if defined, retriesCount must be a number');\n }\n if (retriesCount < 0) {\n throw new Error('retriesCount must be a positive number');\n }\n try {\n const transValue = await sequelize.transaction(options, async (transaction) => {\n const funcValue = await funcToRun(transaction);\n return funcValue;\n });\n return transValue;\n } catch (e) {\n if ((e instanceof DatabaseError || e?.constructor?.name === 'DatabaseError') && --retriesCount >= 0) {\n debugLog(`error inside transactionWithRetry - will retry times ${retriesCount}`, e);\n return transactionWithRetry(sequelize, funcToRun, retriesCount, options);\n }\n if (retriesCount === -1) {\n debugLog('error inside transactionWithRetry - will stop retry', e);\n }\n throw e;\n }\n};\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { Sequelize, Transaction } from 'sequelize';\nimport { debugLog } from './common';\n\nconst rollbackErrorText = 'rollback has been called on this transaction';\nconst abortErrorText = 'Transaction cancelled due to request cancellation';\n\nexport const httpBasedTransaction = <T>(sequelize: Sequelize, req: IncomingMessage, res: ServerResponse, cb: (transaction: Transaction) => Promise<T>): Promise<T> => {\n let aborted = false;\n if (req.socket.destroyed) {\n debugLog(abortErrorText);\n throw new Error(abortErrorText);\n }\n return sequelize.transaction(async (transaction: Transaction) => {\n // https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/test/parallel/test-http-aborted.js#L9\n\n // 2023-04-13: Node.js 16.0.0\n // Added also the `res.writableFinished` check, because it seems that the socket is not destroyed when the request is aborted, but the response is not finished.\n // https://github.com/Jimbly/http-proxy-node16/commit/ba0c414cd03799e357c5d867c11dea06a9c34ec8#diff-b2d1e3b7c5f3b424a0af7971c582c822fd25a5ea279040ef6dc93fc4b2cf619dR151\n\n const rollback = async () => {\n debugLog(abortErrorText);\n if (aborted) return;\n aborted = true;\n await transaction.rollback();\n };\n const resRollback = async () => {\n const didNotFinishWrite = !res.writableFinished;\n if (didNotFinishWrite) {\n debugLog(abortErrorText);\n if (aborted) return;\n aborted = true;\n await transaction.rollback();\n }\n };\n req.socket.once('close', rollback);\n res.once('close', resRollback);\n\n const removeListeners = () => {\n req.socket.removeListener('close', rollback);\n res.removeListener('close', resRollback);\n };\n\n try {\n const response = await cb(transaction);\n removeListeners();\n return response;\n } catch (e) {\n removeListeners();\n if (e.message.includes(rollbackErrorText)) {\n throw new Error(abortErrorText);\n }\n throw e;\n }\n });\n};\n","import type {\n Sequelize,\n Transaction,\n TransactionOptions,\n} from 'sequelize';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { LoggerInstanceManager } from '@autofleet/logger';\nimport type Events from '@autofleet/events';\nimport addModelEventHooks, { type ModelMapping } from './model-event-hooks';\nimport { transactionWithRetry as _transactionWithRetry } from './transaction-with-retry';\nimport { httpBasedTransaction as _httpBasedTransaction } from './http-based-transaction';\nimport runAfterTransactionCommits from './runAfterTransactionCommits';\n\ntype ArgsWithoutSequelize<T> = T extends (arg1: Sequelize, ...args: infer U) => unknown ? U : never;\n\nexport default (sequelize: Sequelize, logger?: LoggerInstanceManager): {\n transactionWithRetry: <T>(...args: ArgsWithoutSequelize<typeof _transactionWithRetry<T>>) => Promise<T>;\n httpBasedTransaction: <T>(...args: ArgsWithoutSequelize<typeof _httpBasedTransaction<T>>) => Promise<T>;\n registerModelEventHooks: (modelTableMapping: ModelMapping, events: Events) => void;\n runAfterTransactionCommits: typeof runAfterTransactionCommits;\n useOrCreateTransaction: <T>(transaction: Transaction | null | undefined, cb: (t: Transaction) => Promise<T>) => Promise<T>;\n} => {\n const transactionWithRetry = <T>(\n funcToRun: (transaction: Transaction) => Promise<T>,\n retriesCount?: number,\n options?: TransactionOptions,\n ): Promise<T> => _transactionWithRetry(sequelize, funcToRun, retriesCount, options);\n const httpBasedTransaction = <T>(req: IncomingMessage, res: ServerResponse, cb: (transaction: Transaction) => Promise<T>): Promise<T> => _httpBasedTransaction(sequelize, req, res, cb);\n const registerModelEventHooks = (modelTableMapping: ModelMapping, events: Events) => addModelEventHooks(sequelize, modelTableMapping, events, logger);\n const useOrCreateTransaction = <T>(transaction: Transaction | null | undefined, cb: (t: Transaction) => Promise<T>) => {\n if (transaction) {\n return cb(transaction);\n }\n return transactionWithRetry(cb, 0);\n };\n\n return {\n httpBasedTransaction,\n transactionWithRetry,\n registerModelEventHooks,\n runAfterTransactionCommits,\n useOrCreateTransaction,\n };\n};\n"],"mappings":"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"}
|