@arcane-utils/pubsub 1.2.6 → 1.3.0

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/README.md CHANGED
@@ -2,6 +2,9 @@
2
2
 
3
3
  ## CHANGE LOG
4
4
 
5
+ ### V 1.3.0
6
+ Publish monitoring pf message with avro schema
7
+
5
8
  ### V 1.2.5
6
9
  Use commonjs module
7
10
 
@@ -0,0 +1,2 @@
1
+ var t=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var C=(e,n)=>{for(var o in n)t(e,o,{get:n[o],enumerable:!0})},U=(e,n,o,c)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of i(n))!s.call(e,r)&&r!==o&&t(e,r,{get:()=>n[r],enumerable:!(c=_(n,r))||c.enumerable});return e};var O=e=>U(t({},"__esModule",{value:!0}),e);var T={};C(T,{GCPEnvironment:()=>u,getGcpEnvironment:()=>N,getLogExplorerResourceType:()=>E,getServiceName:()=>v});module.exports=O(T);var u=(r=>(r.CLOUD_RUN="cloud_run",r.CLOUD_FUNCTION_V2="cloud_function_v2",r.CLOUD_FUNCTION_V1="cloud_function_v1",r.UNKNOWN="unknown",r))(u||{});function N(){let e=process.env.FUNCTION_TARGET,n=process.env.FUNCTION_NAME,o=process.env.K_SERVICE;return e?"cloud_function_v2":n&&!o?"cloud_function_v1":o?"cloud_run":"unknown"}function v(){return process.env.K_SERVICE??process.env.FUNCTION_NAME??"unknown-service"}function E(){switch(N()){case"cloud_run":return"cloud_run_revision";case"cloud_function_v2":return"cloud_run_revision";case"cloud_function_v1":return"cloud_function";default:return"global"}}0&&(module.exports={GCPEnvironment,getGcpEnvironment,getLogExplorerResourceType,getServiceName});
2
+ //# sourceMappingURL=gcp_component_retrieve_info.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/gcp_component_retrieve_info.ts"],"sourcesContent":["/**\n * Detect GCP environment (Cloud Run, Cloud Functions v1/v2)\n * and utilities for service name and Log Explorer resource type.\n */\n\nexport enum GCPEnvironment {\n CLOUD_RUN = 'cloud_run',\n CLOUD_FUNCTION_V2 = 'cloud_function_v2',\n CLOUD_FUNCTION_V1 = 'cloud_function_v1',\n UNKNOWN = 'unknown',\n}\n\n/**\n * Detect whether we're running in Cloud Run, Cloud Functions v1, or v2.\n */\nexport function getGcpEnvironment(): GCPEnvironment {\n const functionTarget = process.env.FUNCTION_TARGET\n const functionName = process.env.FUNCTION_NAME\n const kService = process.env.K_SERVICE\n\n // Cloud Functions v2 runs on Cloud Run but has FUNCTION_TARGET\n if (functionTarget) {\n return GCPEnvironment.CLOUD_FUNCTION_V2\n }\n\n // Cloud Functions v1 has FUNCTION_NAME but not K_SERVICE\n if (functionName && !kService) {\n return GCPEnvironment.CLOUD_FUNCTION_V1\n }\n\n // Cloud Run has K_SERVICE but not FUNCTION_TARGET\n if (kService) {\n return GCPEnvironment.CLOUD_RUN\n }\n\n return GCPEnvironment.UNKNOWN\n}\n\n/**\n * Retrieve the service name from the current GCP environment.\n */\nexport function getServiceName(): string {\n return process.env.K_SERVICE ?? process.env.FUNCTION_NAME ?? 'unknown-service'\n}\n\n/**\n * Get the resource type for Log Explorer queries.\n */\nexport function getLogExplorerResourceType(): string {\n const env = getGcpEnvironment()\n\n switch (env) {\n case GCPEnvironment.CLOUD_RUN:\n return 'cloud_run_revision'\n case GCPEnvironment.CLOUD_FUNCTION_V2:\n return 'cloud_run_revision' // v2 uses Cloud Run\n case GCPEnvironment.CLOUD_FUNCTION_V1:\n return 'cloud_function'\n default:\n return 'global'\n }\n}\n"],"mappings":"4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oBAAAE,EAAA,sBAAAC,EAAA,+BAAAC,EAAA,mBAAAC,IAAA,eAAAC,EAAAN,GAKO,IAAKE,OACVA,EAAA,UAAY,YACZA,EAAA,kBAAoB,oBACpBA,EAAA,kBAAoB,oBACpBA,EAAA,QAAU,UAJAA,OAAA,IAUL,SAASC,GAAoC,CAClD,IAAMI,EAAiB,QAAQ,IAAI,gBAC7BC,EAAe,QAAQ,IAAI,cAC3BC,EAAW,QAAQ,IAAI,UAG7B,OAAIF,EACK,oBAILC,GAAgB,CAACC,EACZ,oBAILA,EACK,YAGF,SACT,CAKO,SAASJ,GAAyB,CACvC,OAAO,QAAQ,IAAI,WAAa,QAAQ,IAAI,eAAiB,iBAC/D,CAKO,SAASD,GAAqC,CAGnD,OAFYD,EAAkB,EAEjB,CACX,IAAK,YACH,MAAO,qBACT,IAAK,oBACH,MAAO,qBACT,IAAK,oBACH,MAAO,iBACT,QACE,MAAO,QACX,CACF","names":["gcp_component_retrieve_info_exports","__export","GCPEnvironment","getGcpEnvironment","getLogExplorerResourceType","getServiceName","__toCommonJS","functionTarget","functionName","kService"]}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Detect GCP environment (Cloud Run, Cloud Functions v1/v2)
3
+ * and utilities for service name and Log Explorer resource type.
4
+ */
5
+ declare enum GCPEnvironment {
6
+ CLOUD_RUN = "cloud_run",
7
+ CLOUD_FUNCTION_V2 = "cloud_function_v2",
8
+ CLOUD_FUNCTION_V1 = "cloud_function_v1",
9
+ UNKNOWN = "unknown"
10
+ }
11
+ /**
12
+ * Detect whether we're running in Cloud Run, Cloud Functions v1, or v2.
13
+ */
14
+ declare function getGcpEnvironment(): GCPEnvironment;
15
+ /**
16
+ * Retrieve the service name from the current GCP environment.
17
+ */
18
+ declare function getServiceName(): string;
19
+ /**
20
+ * Get the resource type for Log Explorer queries.
21
+ */
22
+ declare function getLogExplorerResourceType(): string;
23
+
24
+ export { GCPEnvironment, getGcpEnvironment, getLogExplorerResourceType, getServiceName };
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- var A=Object.create;var m=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var U=Object.getPrototypeOf,I=Object.prototype.hasOwnProperty;var k=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),F=(e,t)=>{for(var r in t)m(e,r,{get:t[r],enumerable:!0})},h=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of j(t))!I.call(e,o)&&o!==r&&m(e,o,{get:()=>t[o],enumerable:!(n=T(t,o))||n.enumerable});return e};var y=(e,t,r)=>(r=e!=null?A(U(e)):{},h(t||!e||!e.__esModule?m(r,"default",{value:e,enumerable:!0}):r,e)),$=e=>h(m({},"__esModule",{value:!0}),e);var P=k((l,S)=>{var b=require("buffer"),s=b.Buffer;function w(e,t){for(var r in e)t[r]=e[r]}s.from&&s.alloc&&s.allocUnsafe&&s.allocUnsafeSlow?S.exports=b:(w(b,l),l.Buffer=u);function u(e,t,r){return s(e,t,r)}u.prototype=Object.create(s.prototype);w(s,u);u.from=function(e,t,r){if(typeof e=="number")throw new TypeError("Argument must not be a number");return s(e,t,r)};u.alloc=function(e,t,r){if(typeof e!="number")throw new TypeError("Argument must be a number");var n=s(e);return t!==void 0?typeof r=="string"?n.fill(t,r):n.fill(t):n.fill(0),n};u.allocUnsafe=function(e){if(typeof e!="number")throw new TypeError("Argument must be a number");return s(e)};u.allocUnsafeSlow=function(e){if(typeof e!="number")throw new TypeError("Argument must be a number");return b.SlowBuffer(e)}});var J={};F(J,{getPubsubClient:()=>x,googlePubsub:()=>O,publishAvroRecords:()=>_,publishMessage:()=>p,publishProductFlowMonitoringMessage:()=>B,publishStorageMessage:()=>E});module.exports=$(J);var O=y(require("@google-cloud/pubsub"),1);var f=require("@google-cloud/pubsub"),M=y(require("avro-js"),1),{Buffer:v}=P(),x=(e,t)=>new f.PubSub({projectId:e,keyFilename:t}),p=async(e,t,r,n)=>{let o=v.from(JSON.stringify(t));return r.topic(e).publish(o,n)},B=async(e,t,r,n,o,i,a)=>{let c={entity_id:t,status:n,monitoring_id:r,step:e};return a&&(c.error_message=a),p(o,{parameters:c},i)},E=async(e,t,r,n,o)=>{let i={metadata:{monitoring_id:o}},c={objectId:e,bucketId:t,eventTime:new Date().toISOString()};return p(r,i,n,c)},q=async(e,t)=>(await t.schema(e).get()).definition,_=async(e,t,r)=>{let n=t.topic(e),[o]=await n.getMetadata(),i=o.schemaSettings;if(!i)return Promise.reject(new Error(`Topic ${e} doesn't seem to have a schema.`));let a=i.encoding,c=await q(i?.schema??"",t),d=M.parse(c),g;switch(a){case f.Encodings.Binary:g=d.toBuffer(r);break;case f.Encodings.Json:g=v.from(d.toString(r));break;default:return Promise.reject(new Error(`Unknown schema encoding: ${a}`))}return g?await n.publishMessage({data:g}):Promise.reject(new Error(`Invalid encoding ${a} on the topic.`))};0&&(module.exports={getPubsubClient,googlePubsub,publishAvroRecords,publishMessage,publishProductFlowMonitoringMessage,publishStorageMessage});
1
+ var F=Object.create;var p=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var G=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var $=(e,r)=>()=>(r||e((r={exports:{}}).exports,r),r.exports),j=(e,r)=>{for(var n in r)p(e,n,{get:r[n],enumerable:!0})},h=(e,r,n,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of B(r))!V.call(e,t)&&t!==n&&p(e,t,{get:()=>r[t],enumerable:!(o=L(r,t))||o.enumerable});return e};var C=(e,r,n)=>(n=e!=null?F(G(e)):{},h(r||!e||!e.__esModule?p(n,"default",{value:e,enumerable:!0}):n,e)),k=e=>h(p({},"__esModule",{value:!0}),e);var P=$((N,E)=>{var d=require("buffer"),s=d.Buffer;function w(e,r){for(var n in e)r[n]=e[n]}s.from&&s.alloc&&s.allocUnsafe&&s.allocUnsafeSlow?E.exports=d:(w(d,N),N.Buffer=u);function u(e,r,n){return s(e,r,n)}u.prototype=Object.create(s.prototype);w(s,u);u.from=function(e,r,n){if(typeof e=="number")throw new TypeError("Argument must not be a number");return s(e,r,n)};u.alloc=function(e,r,n){if(typeof e!="number")throw new TypeError("Argument must be a number");var o=s(e);return r!==void 0?typeof n=="string"?o.fill(r,n):o.fill(r):o.fill(0),o};u.allocUnsafe=function(e){if(typeof e!="number")throw new TypeError("Argument must be a number");return s(e)};u.allocUnsafeSlow=function(e){if(typeof e!="number")throw new TypeError("Argument must be a number");return d.SlowBuffer(e)}});var K={};j(K,{GCPEnvironment:()=>_,getGcpEnvironment:()=>v,getLogExplorerResourceType:()=>b,getPubsubClient:()=>M,getServiceName:()=>l,googlePubsub:()=>J,publishAvroRecords:()=>y,publishMessage:()=>U,publishProductFlowMonitoringMessage:()=>x,publishStorageMessage:()=>I});module.exports=k(K);var J=C(require("@google-cloud/pubsub"),1);var f=require("@google-cloud/pubsub"),T=C(require("avro-js"),1);var _=(t=>(t.CLOUD_RUN="cloud_run",t.CLOUD_FUNCTION_V2="cloud_function_v2",t.CLOUD_FUNCTION_V1="cloud_function_v1",t.UNKNOWN="unknown",t))(_||{});function v(){let e=process.env.FUNCTION_TARGET,r=process.env.FUNCTION_NAME,n=process.env.K_SERVICE;return e?"cloud_function_v2":r&&!n?"cloud_function_v1":n?"cloud_run":"unknown"}function l(){return process.env.K_SERVICE??process.env.FUNCTION_NAME??"unknown-service"}function b(){switch(v()){case"cloud_run":return"cloud_run_revision";case"cloud_function_v2":return"cloud_run_revision";case"cloud_function_v1":return"cloud_function";default:return"global"}}var{Buffer:O}=P(),M=(e,r)=>new f.PubSub({projectId:e,keyFilename:r}),U=async(e,r,n,o)=>{let t=O.from(JSON.stringify(r));return n.topic(e).publish(t,o)},x=async(e,r,n,o,t,i,c,g)=>{let m=new Date,a=b(),S=l(),R=m.toISOString(),D={logs_explorer_url:`https://console.cloud.google.com/logs/query;query=resource.type%3D%22${encodeURIComponent(a)}%22%0Aresource.labels.service_name%3D%22${encodeURIComponent(S)}%22%0A%22${encodeURIComponent(n)}%22;aroundTime=${R};duration=PT1H?referrer=search&inv=1&invt=Ab20og&project=${encodeURIComponent(c)}`},A={step:e,entity_id:r,monitoring_id:n,status:o,error_message:g??"",timestamp:m,additional_info:JSON.stringify(D)};return y(t,i,A)},I=async(e,r,n,o,t)=>{let i={metadata:{monitoring_id:t}},g={objectId:e,bucketId:r,eventTime:new Date().toISOString()};return U(n,i,o,g)},q=async(e,r)=>(await r.schema(e).get()).definition,y=async(e,r,n)=>{let o=r.topic(e),[t]=await o.getMetadata(),i=t.schemaSettings;if(!i)return Promise.reject(new Error(`Topic ${e} doesn't seem to have a schema.`));let c=i.encoding,g=await q(i?.schema??"",r),m=T.parse(g),a;switch(c){case f.Encodings.Binary:a=m.toBuffer(n);break;case f.Encodings.Json:a=O.from(m.toString(n));break;default:return Promise.reject(new Error(`Unknown schema encoding: ${c}`))}return a?await o.publishMessage({data:a}):Promise.reject(new Error(`Invalid encoding ${c} on the topic.`))};0&&(module.exports={GCPEnvironment,getGcpEnvironment,getLogExplorerResourceType,getPubsubClient,getServiceName,googlePubsub,publishAvroRecords,publishMessage,publishProductFlowMonitoringMessage,publishStorageMessage});
2
2
  /*! Bundled license information:
3
3
 
4
4
  safe-buffer/index.js:
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/safe-buffer/index.js","../src/index.ts","../src/pubsub.ts"],"sourcesContent":["/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\n/* eslint-disable node/no-deprecated-api */\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n for (var key in src) {\n dst[key] = src[key]\n }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n module.exports = buffer\n} else {\n // Copy properties from require('buffer')\n copyProps(buffer, exports)\n exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.prototype = Object.create(Buffer.prototype)\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n if (typeof arg === 'number') {\n throw new TypeError('Argument must not be a number')\n }\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n var buf = Buffer(size)\n if (fill !== undefined) {\n if (typeof encoding === 'string') {\n buf.fill(fill, encoding)\n } else {\n buf.fill(fill)\n }\n } else {\n buf.fill(0)\n }\n return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return buffer.SlowBuffer(size)\n}\n","export * as googlePubsub from '@google-cloud/pubsub'\nexport {\n MonitoringMessage,\n getPubsubClient,\n publishMessage,\n publishProductFlowMonitoringMessage,\n publishStorageMessage,\n publishAvroRecords\n} from './pubsub';\n","import { PubSub, Encodings } from '@google-cloud/pubsub'\nimport { MonitoringStatus } from '@arcane-utils/types'\nimport * as avro from 'avro-js';\n\nconst {Buffer} = require('safe-buffer')\n\nexport interface MonitoringMessage {\n entity_id: number,\n status: MonitoringStatus,\n monitoring_id: string,\n step: string,\n error_message?: string\n}\n\n/**\n * Get PubSub client.\n *\n * To be used in Cloud Functions because of an issue with global declaration of clients.\n */\nexport const getPubsubClient = (gcpProject: string, serviceAccount: string): PubSub => {\n return new PubSub({\n projectId: gcpProject,\n keyFilename: serviceAccount\n })\n}\n\n/**\n * Publish a message on PubSub.\n*/\nexport const publishMessage = async (topicName: string, message: any, pubsub: PubSub, attributes?: any): Promise<string> => {\n const dataBuffer = Buffer.from(JSON.stringify(message))\n return pubsub.topic(topicName).publish(dataBuffer, attributes)\n}\n\n/**\n * Publish a message for Product Flow monitoring\n*/\nexport const publishProductFlowMonitoringMessage = async (\n step: string,\n entityId: number,\n monitoringId: string,\n status: MonitoringStatus,\n topicName: string,\n pubsub: PubSub,\n errorMessage?: string\n): Promise<string> => {\n const message: MonitoringMessage = {\n entity_id: entityId,\n status,\n monitoring_id: monitoringId,\n step\n }\n if (errorMessage) {\n message.error_message = errorMessage\n }\n return publishMessage(topicName, { parameters: message }, pubsub)\n}\n\n/**\n * Publish a message similar to a storage notification\n */\nexport const publishStorageMessage = async (\n objectId: string,\n bucketId: string,\n topicName: string,\n pubsub: PubSub,\n monitoringId?: string,\n): Promise<string> => {\n const message = {\n metadata: {\n monitoring_id: monitoringId\n }\n }\n const date = new Date()\n\n const attributes = {\n objectId,\n bucketId,\n eventTime: date.toISOString()\n }\n\n return publishMessage(topicName, message, pubsub, attributes)\n}\n\n/**\n * \n * @param schemaNameOrId : schema name or id\n * @param pubsub : pubsub client\n * @returns : schema definition Avro\n */\nexport const getSchema = async (schemaNameOrId: string, pubsub: PubSub): Promise<string | null | undefined> => {\n const schema = pubsub.schema(schemaNameOrId)\n const info = await schema.get()\n return info.definition\n}\n\n\n/**\n * Publish message with schema validation\n * \n * The schema will be retrieved from the topic metadata and validated\n */\nexport const publishAvroRecords = async (topicNameOrId : string, pubSubClient: PubSub, message: any): Promise<string> => {\n // Get the topic metadata to learn about its schema encoding.\n const topic = pubSubClient.topic(topicNameOrId)\n const [topicMetadata] = await topic.getMetadata()\n const topicSchemaMetadata = topicMetadata.schemaSettings\n\n if (!topicSchemaMetadata) {\n return Promise.reject(new Error(`Topic ${topicNameOrId} doesn't seem to have a schema.`))\n \n }\n const schemaEncoding = topicSchemaMetadata.encoding;\n\n // Make an encoder using the official avro-js library.\n const definition = await getSchema(topicSchemaMetadata?.schema ?? '', pubSubClient)\n const type = avro.parse(definition)\n\n \n let dataBuffer;\n switch (schemaEncoding) {\n case Encodings.Binary:\n dataBuffer = type.toBuffer(message)\n break\n case Encodings.Json:\n dataBuffer = Buffer.from(type.toString(message))\n break\n default:\n return Promise.reject(new Error(`Unknown schema encoding: ${schemaEncoding}`))\n }\n if (!dataBuffer) {\n return Promise.reject(new Error(`Invalid encoding ${schemaEncoding} on the topic.`))\n }\n\n const messageId = await topic.publishMessage({ data: dataBuffer })\n return messageId\n}"],"mappings":"umBAAA,IAAAA,EAAAC,EAAA,CAAAC,EAAAC,IAAA,CAEA,IAAIC,EAAS,QAAQ,QAAQ,EACzBC,EAASD,EAAO,OAGpB,SAASE,EAAWC,EAAKC,EAAK,CAC5B,QAASC,KAAOF,EACdC,EAAIC,CAAG,EAAIF,EAAIE,CAAG,CAEtB,CACIJ,EAAO,MAAQA,EAAO,OAASA,EAAO,aAAeA,EAAO,gBAC9DF,EAAO,QAAUC,GAGjBE,EAAUF,EAAQF,CAAO,EACzBA,EAAQ,OAASQ,GAGnB,SAASA,EAAYC,EAAKC,EAAkBC,EAAQ,CAClD,OAAOR,EAAOM,EAAKC,EAAkBC,CAAM,CAC7C,CAEAH,EAAW,UAAY,OAAO,OAAOL,EAAO,SAAS,EAGrDC,EAAUD,EAAQK,CAAU,EAE5BA,EAAW,KAAO,SAAUC,EAAKC,EAAkBC,EAAQ,CACzD,GAAI,OAAOF,GAAQ,SACjB,MAAM,IAAI,UAAU,+BAA+B,EAErD,OAAON,EAAOM,EAAKC,EAAkBC,CAAM,CAC7C,EAEAH,EAAW,MAAQ,SAAUI,EAAMC,EAAMC,EAAU,CACjD,GAAI,OAAOF,GAAS,SAClB,MAAM,IAAI,UAAU,2BAA2B,EAEjD,IAAIG,EAAMZ,EAAOS,CAAI,EACrB,OAAIC,IAAS,OACP,OAAOC,GAAa,SACtBC,EAAI,KAAKF,EAAMC,CAAQ,EAEvBC,EAAI,KAAKF,CAAI,EAGfE,EAAI,KAAK,CAAC,EAELA,CACT,EAEAP,EAAW,YAAc,SAAUI,EAAM,CACvC,GAAI,OAAOA,GAAS,SAClB,MAAM,IAAI,UAAU,2BAA2B,EAEjD,OAAOT,EAAOS,CAAI,CACpB,EAEAJ,EAAW,gBAAkB,SAAUI,EAAM,CAC3C,GAAI,OAAOA,GAAS,SAClB,MAAM,IAAI,UAAU,2BAA2B,EAEjD,OAAOV,EAAO,WAAWU,CAAI,CAC/B,IChEA,IAAAI,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,EAAA,iBAAAC,EAAA,uBAAAC,EAAA,mBAAAC,EAAA,wCAAAC,EAAA,0BAAAC,IAAA,eAAAC,EAAAR,GAAA,IAAAG,EAA8B,qCCA9B,IAAAM,EAAkC,gCAElCC,EAAsB,wBAEhB,CAAC,OAAAC,CAAM,EAAI,IAeJC,EAAkB,CAACC,EAAoBC,IAC3C,IAAI,SAAO,CAChB,UAAWD,EACX,YAAaC,CACf,CAAC,EAMUC,EAAiB,MAAOC,EAAmBC,EAAcC,EAAgBC,IAAsC,CAC1H,IAAMC,EAAaT,EAAO,KAAK,KAAK,UAAUM,CAAO,CAAC,EACtD,OAAOC,EAAO,MAAMF,CAAS,EAAE,QAAQI,EAAYD,CAAU,CAC/D,EAKaE,EAAsC,MACjDC,EACAC,EACAC,EACAC,EACAT,EACAE,EACAQ,IACoB,CACpB,IAAMT,EAA6B,CACjC,UAAWM,EACX,OAAAE,EACA,cAAeD,EACf,KAAAF,CACF,EACA,OAAII,IACFT,EAAQ,cAAgBS,GAEnBX,EAAeC,EAAW,CAAE,WAAYC,CAAQ,EAAGC,CAAM,CAClE,EAKaS,EAAwB,MACnCC,EACAC,EACAb,EACAE,EACAM,IACoB,CACpB,IAAMP,EAAU,CACd,SAAU,CACR,cAAeO,CACjB,CACF,EAGML,EAAa,CACjB,SAAAS,EACA,SAAAC,EACA,UALW,IAAI,KAAK,EAKJ,YAAY,CAC9B,EAEA,OAAOd,EAAeC,EAAWC,EAASC,EAAQC,CAAU,CAC9D,EAQaW,EAAY,MAAOC,EAAwBb,KAEzC,MADEA,EAAO,OAAOa,CAAc,EACjB,IAAI,GAClB,WASDC,EAAqB,MAAOC,EAAwBC,EAAsBjB,IAAkC,CAEvH,IAAMkB,EAAQD,EAAa,MAAMD,CAAa,EACxC,CAACG,CAAa,EAAI,MAAMD,EAAM,YAAY,EAC1CE,EAAsBD,EAAc,eAE1C,GAAI,CAACC,EACH,OAAO,QAAQ,OAAO,IAAI,MAAM,SAASJ,CAAa,iCAAiC,CAAC,EAG1F,IAAMK,EAAiBD,EAAoB,SAGrCE,EAAa,MAAMT,EAAUO,GAAqB,QAAU,GAAIH,CAAY,EAC5EM,EAAY,QAAMD,CAAU,EAG9BnB,EACJ,OAAQkB,EAAgB,CACtB,KAAK,YAAU,OACblB,EAAaoB,EAAK,SAASvB,CAAO,EAClC,MACF,KAAK,YAAU,KACbG,EAAaT,EAAO,KAAK6B,EAAK,SAASvB,CAAO,CAAC,EAC/C,MACF,QACE,OAAO,QAAQ,OAAO,IAAI,MAAM,4BAA4BqB,CAAc,EAAE,CAAC,CACjF,CACA,OAAKlB,EAIa,MAAMe,EAAM,eAAe,CAAE,KAAMf,CAAW,CAAC,EAHxD,QAAQ,OAAO,IAAI,MAAM,oBAAoBkB,CAAc,gBAAgB,CAAC,CAKvF","names":["require_safe_buffer","__commonJSMin","exports","module","buffer","Buffer","copyProps","src","dst","key","SafeBuffer","arg","encodingOrOffset","length","size","fill","encoding","buf","src_exports","__export","getPubsubClient","googlePubsub","publishAvroRecords","publishMessage","publishProductFlowMonitoringMessage","publishStorageMessage","__toCommonJS","import_pubsub","avro","Buffer","getPubsubClient","gcpProject","serviceAccount","publishMessage","topicName","message","pubsub","attributes","dataBuffer","publishProductFlowMonitoringMessage","step","entityId","monitoringId","status","errorMessage","publishStorageMessage","objectId","bucketId","getSchema","schemaNameOrId","publishAvroRecords","topicNameOrId","pubSubClient","topic","topicMetadata","topicSchemaMetadata","schemaEncoding","definition","type"]}
1
+ {"version":3,"sources":["../node_modules/safe-buffer/index.js","../src/index.ts","../src/pubsub.ts","../src/gcp_component_retrieve_info.ts"],"sourcesContent":["/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\n/* eslint-disable node/no-deprecated-api */\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n for (var key in src) {\n dst[key] = src[key]\n }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n module.exports = buffer\n} else {\n // Copy properties from require('buffer')\n copyProps(buffer, exports)\n exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.prototype = Object.create(Buffer.prototype)\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n if (typeof arg === 'number') {\n throw new TypeError('Argument must not be a number')\n }\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n var buf = Buffer(size)\n if (fill !== undefined) {\n if (typeof encoding === 'string') {\n buf.fill(fill, encoding)\n } else {\n buf.fill(fill)\n }\n } else {\n buf.fill(0)\n }\n return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return buffer.SlowBuffer(size)\n}\n","export * as googlePubsub from '@google-cloud/pubsub'\nexport {\n MonitoringMessage,\n getPubsubClient,\n publishMessage,\n publishProductFlowMonitoringMessage,\n publishStorageMessage,\n publishAvroRecords\n} from './pubsub';\nexport {\n GCPEnvironment,\n getGcpEnvironment,\n getServiceName,\n getLogExplorerResourceType\n} from './gcp_component_retrieve_info';\n","import { PubSub, Encodings } from '@google-cloud/pubsub'\nimport { MonitoringStatus } from '@arcane-utils/types'\nimport * as avro from 'avro-js'\nimport { getLogExplorerResourceType, getServiceName } from './gcp_component_retrieve_info'\n\nconst { Buffer } = require('safe-buffer')\n\nexport interface MonitoringMessage {\n entity_id: number\n status: MonitoringStatus\n monitoring_id: string\n step: string\n error_message?: string\n}\n\n/**\n * Get PubSub client.\n *\n * To be used in Cloud Functions because of an issue with global declaration of clients.\n */\nexport const getPubsubClient = (gcpProject: string, serviceAccount: string): PubSub => {\n return new PubSub({\n projectId: gcpProject,\n keyFilename: serviceAccount\n })\n}\n\n/**\n * Publish a message on PubSub.\n*/\nexport const publishMessage = async (topicName: string, message: any, pubsub: PubSub, attributes?: any): Promise<string> => {\n const dataBuffer = Buffer.from(JSON.stringify(message))\n return pubsub.topic(topicName).publish(dataBuffer, attributes)\n}\n\n/**\n * Publish a message for Product Flow monitoring via an Avro topic.\n */\nexport const publishProductFlowMonitoringMessage = async (\n step: string,\n entityId: number,\n monitoringId: string,\n status: MonitoringStatus,\n topicName: string,\n pubsub: PubSub,\n projectId: string,\n errorMessage?: string\n): Promise<string> => {\n const timestamp = new Date()\n const componentType = getLogExplorerResourceType()\n const componentName = getServiceName()\n const aroundTime = timestamp.toISOString()\n const logsExplorerUrl =\n `https://console.cloud.google.com/logs/query;query=resource.type%3D%22${encodeURIComponent(componentType)}%22%0Aresource.labels.service_name%3D%22${encodeURIComponent(componentName)}%22%0A%22${encodeURIComponent(monitoringId)}%22;aroundTime=${aroundTime};duration=PT1H?referrer=search&inv=1&invt=Ab20og&project=${encodeURIComponent(projectId)}`\n\n const additionalInfo = { logs_explorer_url: logsExplorerUrl }\n const errorMessageStr = errorMessage ?? ''\n\n const row = {\n step,\n entity_id: entityId,\n monitoring_id: monitoringId,\n status,\n error_message: errorMessageStr,\n timestamp,\n additional_info: JSON.stringify(additionalInfo),\n }\n\n return publishAvroRecords(topicName, pubsub, row)\n}\n\n/**\n * Publish a message similar to a storage notification\n */\nexport const publishStorageMessage = async (\n objectId: string,\n bucketId: string,\n topicName: string,\n pubsub: PubSub,\n monitoringId?: string,\n): Promise<string> => {\n const message = {\n metadata: {\n monitoring_id: monitoringId\n }\n }\n const date = new Date()\n\n const attributes = {\n objectId,\n bucketId,\n eventTime: date.toISOString()\n }\n\n return publishMessage(topicName, message, pubsub, attributes)\n}\n\n/**\n *\n * @param schemaNameOrId : schema name or id\n * @param pubsub : pubsub client\n * @returns : schema definition Avro\n */\nexport const getSchema = async (schemaNameOrId: string, pubsub: PubSub): Promise<string | null | undefined> => {\n const schema = pubsub.schema(schemaNameOrId)\n const info = await schema.get()\n return info.definition\n}\n\n\n/**\n * Publish message with schema validation\n *\n * The schema will be retrieved from the topic metadata and validated\n */\nexport const publishAvroRecords = async (topicNameOrId : string, pubSubClient: PubSub, message: any): Promise<string> => {\n // Get the topic metadata to learn about its schema encoding.\n const topic = pubSubClient.topic(topicNameOrId)\n const [topicMetadata] = await topic.getMetadata()\n const topicSchemaMetadata = topicMetadata.schemaSettings\n\n if (!topicSchemaMetadata) {\n return Promise.reject(new Error(`Topic ${topicNameOrId} doesn't seem to have a schema.`))\n\n }\n const schemaEncoding = topicSchemaMetadata.encoding;\n\n // Make an encoder using the official avro-js library.\n const definition = await getSchema(topicSchemaMetadata?.schema ?? '', pubSubClient)\n const type = avro.parse(definition)\n\n\n let dataBuffer;\n switch (schemaEncoding) {\n case Encodings.Binary:\n dataBuffer = type.toBuffer(message)\n break\n case Encodings.Json:\n dataBuffer = Buffer.from(type.toString(message))\n break\n default:\n return Promise.reject(new Error(`Unknown schema encoding: ${schemaEncoding}`))\n }\n if (!dataBuffer) {\n return Promise.reject(new Error(`Invalid encoding ${schemaEncoding} on the topic.`))\n }\n\n const messageId = await topic.publishMessage({ data: dataBuffer })\n return messageId\n}","/**\n * Detect GCP environment (Cloud Run, Cloud Functions v1/v2)\n * and utilities for service name and Log Explorer resource type.\n */\n\nexport enum GCPEnvironment {\n CLOUD_RUN = 'cloud_run',\n CLOUD_FUNCTION_V2 = 'cloud_function_v2',\n CLOUD_FUNCTION_V1 = 'cloud_function_v1',\n UNKNOWN = 'unknown',\n}\n\n/**\n * Detect whether we're running in Cloud Run, Cloud Functions v1, or v2.\n */\nexport function getGcpEnvironment(): GCPEnvironment {\n const functionTarget = process.env.FUNCTION_TARGET\n const functionName = process.env.FUNCTION_NAME\n const kService = process.env.K_SERVICE\n\n // Cloud Functions v2 runs on Cloud Run but has FUNCTION_TARGET\n if (functionTarget) {\n return GCPEnvironment.CLOUD_FUNCTION_V2\n }\n\n // Cloud Functions v1 has FUNCTION_NAME but not K_SERVICE\n if (functionName && !kService) {\n return GCPEnvironment.CLOUD_FUNCTION_V1\n }\n\n // Cloud Run has K_SERVICE but not FUNCTION_TARGET\n if (kService) {\n return GCPEnvironment.CLOUD_RUN\n }\n\n return GCPEnvironment.UNKNOWN\n}\n\n/**\n * Retrieve the service name from the current GCP environment.\n */\nexport function getServiceName(): string {\n return process.env.K_SERVICE ?? process.env.FUNCTION_NAME ?? 'unknown-service'\n}\n\n/**\n * Get the resource type for Log Explorer queries.\n */\nexport function getLogExplorerResourceType(): string {\n const env = getGcpEnvironment()\n\n switch (env) {\n case GCPEnvironment.CLOUD_RUN:\n return 'cloud_run_revision'\n case GCPEnvironment.CLOUD_FUNCTION_V2:\n return 'cloud_run_revision' // v2 uses Cloud Run\n case GCPEnvironment.CLOUD_FUNCTION_V1:\n return 'cloud_function'\n default:\n return 'global'\n }\n}\n"],"mappings":"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","names":["require_safe_buffer","__commonJSMin","exports","module","buffer","Buffer","copyProps","src","dst","key","SafeBuffer","arg","encodingOrOffset","length","size","fill","encoding","buf","src_exports","__export","GCPEnvironment","getGcpEnvironment","getLogExplorerResourceType","getPubsubClient","getServiceName","googlePubsub","publishAvroRecords","publishMessage","publishProductFlowMonitoringMessage","publishStorageMessage","__toCommonJS","import_pubsub","avro","GCPEnvironment","getGcpEnvironment","functionTarget","functionName","kService","getServiceName","getLogExplorerResourceType","Buffer","getPubsubClient","gcpProject","serviceAccount","publishMessage","topicName","message","pubsub","attributes","dataBuffer","publishProductFlowMonitoringMessage","step","entityId","monitoringId","status","projectId","errorMessage","timestamp","componentType","getLogExplorerResourceType","componentName","getServiceName","aroundTime","additionalInfo","row","publishAvroRecords","publishStorageMessage","objectId","bucketId","getSchema","schemaNameOrId","topicNameOrId","pubSubClient","topic","topicMetadata","topicSchemaMetadata","schemaEncoding","definition","type"]}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,5 @@
1
1
  import * as pubsub from '@google-cloud/pubsub';
2
2
  export { pubsub as googlePubsub };
3
3
  export { MonitoringMessage, getPubsubClient, publishAvroRecords, publishMessage, publishProductFlowMonitoringMessage, publishStorageMessage } from './pubsub.cjs';
4
+ export { GCPEnvironment, getGcpEnvironment, getLogExplorerResourceType, getServiceName } from './gcp_component_retrieve_info.cjs';
4
5
  import '@arcane-utils/types';
package/dist/pubsub.cjs CHANGED
@@ -1,4 +1,4 @@
1
- var B=Object.create;var g=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var _=Object.getPrototypeOf,T=Object.prototype.hasOwnProperty;var j=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),A=(e,t)=>{for(var r in t)g(e,r,{get:t[r],enumerable:!0})},y=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of x(t))!T.call(e,o)&&o!==r&&g(e,o,{get:()=>t[o],enumerable:!(n=E(t,o))||n.enumerable});return e};var U=(e,t,r)=>(r=e!=null?B(_(e)):{},y(t||!e||!e.__esModule?g(r,"default",{value:e,enumerable:!0}):r,e)),I=e=>y(g({},"__esModule",{value:!0}),e);var S=j((b,w)=>{var p=require("buffer"),s=p.Buffer;function h(e,t){for(var r in e)t[r]=e[r]}s.from&&s.alloc&&s.allocUnsafe&&s.allocUnsafeSlow?w.exports=p:(h(p,b),b.Buffer=u);function u(e,t,r){return s(e,t,r)}u.prototype=Object.create(s.prototype);h(s,u);u.from=function(e,t,r){if(typeof e=="number")throw new TypeError("Argument must not be a number");return s(e,t,r)};u.alloc=function(e,t,r){if(typeof e!="number")throw new TypeError("Argument must be a number");var n=s(e);return t!==void 0?typeof r=="string"?n.fill(t,r):n.fill(t):n.fill(0),n};u.allocUnsafe=function(e){if(typeof e!="number")throw new TypeError("Argument must be a number");return s(e)};u.allocUnsafeSlow=function(e){if(typeof e!="number")throw new TypeError("Argument must be a number");return p.SlowBuffer(e)}});var J={};A(J,{getPubsubClient:()=>k,getSchema:()=>v,publishAvroRecords:()=>F,publishMessage:()=>l,publishProductFlowMonitoringMessage:()=>$,publishStorageMessage:()=>q});module.exports=I(J);var f=require("@google-cloud/pubsub"),P=U(require("avro-js"),1),{Buffer:M}=S(),k=(e,t)=>new f.PubSub({projectId:e,keyFilename:t}),l=async(e,t,r,n)=>{let o=M.from(JSON.stringify(t));return r.topic(e).publish(o,n)},$=async(e,t,r,n,o,i,a)=>{let c={entity_id:t,status:n,monitoring_id:r,step:e};return a&&(c.error_message=a),l(o,{parameters:c},i)},q=async(e,t,r,n,o)=>{let i={metadata:{monitoring_id:o}},c={objectId:e,bucketId:t,eventTime:new Date().toISOString()};return l(r,i,n,c)},v=async(e,t)=>(await t.schema(e).get()).definition,F=async(e,t,r)=>{let n=t.topic(e),[o]=await n.getMetadata(),i=o.schemaSettings;if(!i)return Promise.reject(new Error(`Topic ${e} doesn't seem to have a schema.`));let a=i.encoding,c=await v(i?.schema??"",t),d=P.parse(c),m;switch(a){case f.Encodings.Binary:m=d.toBuffer(r);break;case f.Encodings.Json:m=M.from(d.toString(r));break;default:return Promise.reject(new Error(`Unknown schema encoding: ${a}`))}return m?await n.publishMessage({data:m}):Promise.reject(new Error(`Invalid encoding ${a} on the topic.`))};0&&(module.exports={getPubsubClient,getSchema,publishAvroRecords,publishMessage,publishProductFlowMonitoringMessage,publishStorageMessage});
1
+ var x=Object.create;var p=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var R=Object.getPrototypeOf,A=Object.prototype.hasOwnProperty;var F=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports),L=(e,n)=>{for(var r in n)p(e,r,{get:n[r],enumerable:!0})},_=(e,n,r,t)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of D(n))!A.call(e,o)&&o!==r&&p(e,o,{get:()=>n[o],enumerable:!(t=M(n,o))||t.enumerable});return e};var B=(e,n,r)=>(r=e!=null?x(R(e)):{},_(n||!e||!e.__esModule?p(r,"default",{value:e,enumerable:!0}):r,e)),V=e=>_(p({},"__esModule",{value:!0}),e);var S=F((d,y)=>{var l=require("buffer"),s=l.Buffer;function v(e,n){for(var r in e)n[r]=e[r]}s.from&&s.alloc&&s.allocUnsafe&&s.allocUnsafeSlow?y.exports=l:(v(l,d),d.Buffer=c);function c(e,n,r){return s(e,n,r)}c.prototype=Object.create(s.prototype);v(s,c);c.from=function(e,n,r){if(typeof e=="number")throw new TypeError("Argument must not be a number");return s(e,n,r)};c.alloc=function(e,n,r){if(typeof e!="number")throw new TypeError("Argument must be a number");var t=s(e);return n!==void 0?typeof r=="string"?t.fill(n,r):t.fill(n):t.fill(0),t};c.allocUnsafe=function(e){if(typeof e!="number")throw new TypeError("Argument must be a number");return s(e)};c.allocUnsafeSlow=function(e){if(typeof e!="number")throw new TypeError("Argument must be a number");return l.SlowBuffer(e)}});var q={};L(q,{getPubsubClient:()=>j,getSchema:()=>E,publishAvroRecords:()=>O,publishMessage:()=>h,publishProductFlowMonitoringMessage:()=>k,publishStorageMessage:()=>G});module.exports=V(q);var g=require("@google-cloud/pubsub"),w=B(require("avro-js"),1);function $(){let e=process.env.FUNCTION_TARGET,n=process.env.FUNCTION_NAME,r=process.env.K_SERVICE;return e?"cloud_function_v2":n&&!r?"cloud_function_v1":r?"cloud_run":"unknown"}function N(){return process.env.K_SERVICE??process.env.FUNCTION_NAME??"unknown-service"}function U(){switch($()){case"cloud_run":return"cloud_run_revision";case"cloud_function_v2":return"cloud_run_revision";case"cloud_function_v1":return"cloud_function";default:return"global"}}var{Buffer:C}=S(),j=(e,n)=>new g.PubSub({projectId:e,keyFilename:n}),h=async(e,n,r,t)=>{let o=C.from(JSON.stringify(n));return r.topic(e).publish(o,t)},k=async(e,n,r,t,o,i,u,f)=>{let m=new Date,a=U(),b=N(),T=m.toISOString(),P={logs_explorer_url:`https://console.cloud.google.com/logs/query;query=resource.type%3D%22${encodeURIComponent(a)}%22%0Aresource.labels.service_name%3D%22${encodeURIComponent(b)}%22%0A%22${encodeURIComponent(r)}%22;aroundTime=${T};duration=PT1H?referrer=search&inv=1&invt=Ab20og&project=${encodeURIComponent(u)}`},I={step:e,entity_id:n,monitoring_id:r,status:t,error_message:f??"",timestamp:m,additional_info:JSON.stringify(P)};return O(o,i,I)},G=async(e,n,r,t,o)=>{let i={metadata:{monitoring_id:o}},f={objectId:e,bucketId:n,eventTime:new Date().toISOString()};return h(r,i,t,f)},E=async(e,n)=>(await n.schema(e).get()).definition,O=async(e,n,r)=>{let t=n.topic(e),[o]=await t.getMetadata(),i=o.schemaSettings;if(!i)return Promise.reject(new Error(`Topic ${e} doesn't seem to have a schema.`));let u=i.encoding,f=await E(i?.schema??"",n),m=w.parse(f),a;switch(u){case g.Encodings.Binary:a=m.toBuffer(r);break;case g.Encodings.Json:a=C.from(m.toString(r));break;default:return Promise.reject(new Error(`Unknown schema encoding: ${u}`))}return a?await t.publishMessage({data:a}):Promise.reject(new Error(`Invalid encoding ${u} on the topic.`))};0&&(module.exports={getPubsubClient,getSchema,publishAvroRecords,publishMessage,publishProductFlowMonitoringMessage,publishStorageMessage});
2
2
  /*! Bundled license information:
3
3
 
4
4
  safe-buffer/index.js:
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/safe-buffer/index.js","../src/pubsub.ts"],"sourcesContent":["/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\n/* eslint-disable node/no-deprecated-api */\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n for (var key in src) {\n dst[key] = src[key]\n }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n module.exports = buffer\n} else {\n // Copy properties from require('buffer')\n copyProps(buffer, exports)\n exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.prototype = Object.create(Buffer.prototype)\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n if (typeof arg === 'number') {\n throw new TypeError('Argument must not be a number')\n }\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n var buf = Buffer(size)\n if (fill !== undefined) {\n if (typeof encoding === 'string') {\n buf.fill(fill, encoding)\n } else {\n buf.fill(fill)\n }\n } else {\n buf.fill(0)\n }\n return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return buffer.SlowBuffer(size)\n}\n","import { PubSub, Encodings } from '@google-cloud/pubsub'\nimport { MonitoringStatus } from '@arcane-utils/types'\nimport * as avro from 'avro-js';\n\nconst {Buffer} = require('safe-buffer')\n\nexport interface MonitoringMessage {\n entity_id: number,\n status: MonitoringStatus,\n monitoring_id: string,\n step: string,\n error_message?: string\n}\n\n/**\n * Get PubSub client.\n *\n * To be used in Cloud Functions because of an issue with global declaration of clients.\n */\nexport const getPubsubClient = (gcpProject: string, serviceAccount: string): PubSub => {\n return new PubSub({\n projectId: gcpProject,\n keyFilename: serviceAccount\n })\n}\n\n/**\n * Publish a message on PubSub.\n*/\nexport const publishMessage = async (topicName: string, message: any, pubsub: PubSub, attributes?: any): Promise<string> => {\n const dataBuffer = Buffer.from(JSON.stringify(message))\n return pubsub.topic(topicName).publish(dataBuffer, attributes)\n}\n\n/**\n * Publish a message for Product Flow monitoring\n*/\nexport const publishProductFlowMonitoringMessage = async (\n step: string,\n entityId: number,\n monitoringId: string,\n status: MonitoringStatus,\n topicName: string,\n pubsub: PubSub,\n errorMessage?: string\n): Promise<string> => {\n const message: MonitoringMessage = {\n entity_id: entityId,\n status,\n monitoring_id: monitoringId,\n step\n }\n if (errorMessage) {\n message.error_message = errorMessage\n }\n return publishMessage(topicName, { parameters: message }, pubsub)\n}\n\n/**\n * Publish a message similar to a storage notification\n */\nexport const publishStorageMessage = async (\n objectId: string,\n bucketId: string,\n topicName: string,\n pubsub: PubSub,\n monitoringId?: string,\n): Promise<string> => {\n const message = {\n metadata: {\n monitoring_id: monitoringId\n }\n }\n const date = new Date()\n\n const attributes = {\n objectId,\n bucketId,\n eventTime: date.toISOString()\n }\n\n return publishMessage(topicName, message, pubsub, attributes)\n}\n\n/**\n * \n * @param schemaNameOrId : schema name or id\n * @param pubsub : pubsub client\n * @returns : schema definition Avro\n */\nexport const getSchema = async (schemaNameOrId: string, pubsub: PubSub): Promise<string | null | undefined> => {\n const schema = pubsub.schema(schemaNameOrId)\n const info = await schema.get()\n return info.definition\n}\n\n\n/**\n * Publish message with schema validation\n * \n * The schema will be retrieved from the topic metadata and validated\n */\nexport const publishAvroRecords = async (topicNameOrId : string, pubSubClient: PubSub, message: any): Promise<string> => {\n // Get the topic metadata to learn about its schema encoding.\n const topic = pubSubClient.topic(topicNameOrId)\n const [topicMetadata] = await topic.getMetadata()\n const topicSchemaMetadata = topicMetadata.schemaSettings\n\n if (!topicSchemaMetadata) {\n return Promise.reject(new Error(`Topic ${topicNameOrId} doesn't seem to have a schema.`))\n \n }\n const schemaEncoding = topicSchemaMetadata.encoding;\n\n // Make an encoder using the official avro-js library.\n const definition = await getSchema(topicSchemaMetadata?.schema ?? '', pubSubClient)\n const type = avro.parse(definition)\n\n \n let dataBuffer;\n switch (schemaEncoding) {\n case Encodings.Binary:\n dataBuffer = type.toBuffer(message)\n break\n case Encodings.Json:\n dataBuffer = Buffer.from(type.toString(message))\n break\n default:\n return Promise.reject(new Error(`Unknown schema encoding: ${schemaEncoding}`))\n }\n if (!dataBuffer) {\n return Promise.reject(new Error(`Invalid encoding ${schemaEncoding} on the topic.`))\n }\n\n const messageId = await topic.publishMessage({ data: dataBuffer })\n return messageId\n}"],"mappings":"umBAAA,IAAAA,EAAAC,EAAA,CAAAC,EAAAC,IAAA,CAEA,IAAIC,EAAS,QAAQ,QAAQ,EACzBC,EAASD,EAAO,OAGpB,SAASE,EAAWC,EAAKC,EAAK,CAC5B,QAASC,KAAOF,EACdC,EAAIC,CAAG,EAAIF,EAAIE,CAAG,CAEtB,CACIJ,EAAO,MAAQA,EAAO,OAASA,EAAO,aAAeA,EAAO,gBAC9DF,EAAO,QAAUC,GAGjBE,EAAUF,EAAQF,CAAO,EACzBA,EAAQ,OAASQ,GAGnB,SAASA,EAAYC,EAAKC,EAAkBC,EAAQ,CAClD,OAAOR,EAAOM,EAAKC,EAAkBC,CAAM,CAC7C,CAEAH,EAAW,UAAY,OAAO,OAAOL,EAAO,SAAS,EAGrDC,EAAUD,EAAQK,CAAU,EAE5BA,EAAW,KAAO,SAAUC,EAAKC,EAAkBC,EAAQ,CACzD,GAAI,OAAOF,GAAQ,SACjB,MAAM,IAAI,UAAU,+BAA+B,EAErD,OAAON,EAAOM,EAAKC,EAAkBC,CAAM,CAC7C,EAEAH,EAAW,MAAQ,SAAUI,EAAMC,EAAMC,EAAU,CACjD,GAAI,OAAOF,GAAS,SAClB,MAAM,IAAI,UAAU,2BAA2B,EAEjD,IAAIG,EAAMZ,EAAOS,CAAI,EACrB,OAAIC,IAAS,OACP,OAAOC,GAAa,SACtBC,EAAI,KAAKF,EAAMC,CAAQ,EAEvBC,EAAI,KAAKF,CAAI,EAGfE,EAAI,KAAK,CAAC,EAELA,CACT,EAEAP,EAAW,YAAc,SAAUI,EAAM,CACvC,GAAI,OAAOA,GAAS,SAClB,MAAM,IAAI,UAAU,2BAA2B,EAEjD,OAAOT,EAAOS,CAAI,CACpB,EAEAJ,EAAW,gBAAkB,SAAUI,EAAM,CAC3C,GAAI,OAAOA,GAAS,SAClB,MAAM,IAAI,UAAU,2BAA2B,EAEjD,OAAOV,EAAO,WAAWU,CAAI,CAC/B,IChEA,IAAAI,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,EAAA,cAAAC,EAAA,uBAAAC,EAAA,mBAAAC,EAAA,wCAAAC,EAAA,0BAAAC,IAAA,eAAAC,EAAAR,GAAA,IAAAS,EAAkC,gCAElCC,EAAsB,wBAEhB,CAAC,OAAAC,CAAM,EAAI,IAeJT,EAAkB,CAACU,EAAoBC,IAC3C,IAAI,SAAO,CAChB,UAAWD,EACX,YAAaC,CACf,CAAC,EAMUR,EAAiB,MAAOS,EAAmBC,EAAcC,EAAgBC,IAAsC,CAC1H,IAAMC,EAAaP,EAAO,KAAK,KAAK,UAAUI,CAAO,CAAC,EACtD,OAAOC,EAAO,MAAMF,CAAS,EAAE,QAAQI,EAAYD,CAAU,CAC/D,EAKaX,EAAsC,MACjDa,EACAC,EACAC,EACAC,EACAR,EACAE,EACAO,IACoB,CACpB,IAAMR,EAA6B,CACjC,UAAWK,EACX,OAAAE,EACA,cAAeD,EACf,KAAAF,CACF,EACA,OAAII,IACFR,EAAQ,cAAgBQ,GAEnBlB,EAAeS,EAAW,CAAE,WAAYC,CAAQ,EAAGC,CAAM,CAClE,EAKaT,EAAwB,MACnCiB,EACAC,EACAX,EACAE,EACAK,IACoB,CACpB,IAAMN,EAAU,CACd,SAAU,CACR,cAAeM,CACjB,CACF,EAGMJ,EAAa,CACjB,SAAAO,EACA,SAAAC,EACA,UALW,IAAI,KAAK,EAKJ,YAAY,CAC9B,EAEA,OAAOpB,EAAeS,EAAWC,EAASC,EAAQC,CAAU,CAC9D,EAQad,EAAY,MAAOuB,EAAwBV,KAEzC,MADEA,EAAO,OAAOU,CAAc,EACjB,IAAI,GAClB,WASDtB,EAAqB,MAAOuB,EAAwBC,EAAsBb,IAAkC,CAEvH,IAAMc,EAAQD,EAAa,MAAMD,CAAa,EACxC,CAACG,CAAa,EAAI,MAAMD,EAAM,YAAY,EAC1CE,EAAsBD,EAAc,eAE1C,GAAI,CAACC,EACH,OAAO,QAAQ,OAAO,IAAI,MAAM,SAASJ,CAAa,iCAAiC,CAAC,EAG1F,IAAMK,EAAiBD,EAAoB,SAGrCE,EAAa,MAAM9B,EAAU4B,GAAqB,QAAU,GAAIH,CAAY,EAC5EM,EAAY,QAAMD,CAAU,EAG9Bf,EACJ,OAAQc,EAAgB,CACtB,KAAK,YAAU,OACbd,EAAagB,EAAK,SAASnB,CAAO,EAClC,MACF,KAAK,YAAU,KACbG,EAAaP,EAAO,KAAKuB,EAAK,SAASnB,CAAO,CAAC,EAC/C,MACF,QACE,OAAO,QAAQ,OAAO,IAAI,MAAM,4BAA4BiB,CAAc,EAAE,CAAC,CACjF,CACA,OAAKd,EAIa,MAAMW,EAAM,eAAe,CAAE,KAAMX,CAAW,CAAC,EAHxD,QAAQ,OAAO,IAAI,MAAM,oBAAoBc,CAAc,gBAAgB,CAAC,CAKvF","names":["require_safe_buffer","__commonJSMin","exports","module","buffer","Buffer","copyProps","src","dst","key","SafeBuffer","arg","encodingOrOffset","length","size","fill","encoding","buf","pubsub_exports","__export","getPubsubClient","getSchema","publishAvroRecords","publishMessage","publishProductFlowMonitoringMessage","publishStorageMessage","__toCommonJS","import_pubsub","avro","Buffer","gcpProject","serviceAccount","topicName","message","pubsub","attributes","dataBuffer","step","entityId","monitoringId","status","errorMessage","objectId","bucketId","schemaNameOrId","topicNameOrId","pubSubClient","topic","topicMetadata","topicSchemaMetadata","schemaEncoding","definition","type"]}
1
+ {"version":3,"sources":["../node_modules/safe-buffer/index.js","../src/pubsub.ts","../src/gcp_component_retrieve_info.ts"],"sourcesContent":["/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\n/* eslint-disable node/no-deprecated-api */\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n for (var key in src) {\n dst[key] = src[key]\n }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n module.exports = buffer\n} else {\n // Copy properties from require('buffer')\n copyProps(buffer, exports)\n exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.prototype = Object.create(Buffer.prototype)\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n if (typeof arg === 'number') {\n throw new TypeError('Argument must not be a number')\n }\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n var buf = Buffer(size)\n if (fill !== undefined) {\n if (typeof encoding === 'string') {\n buf.fill(fill, encoding)\n } else {\n buf.fill(fill)\n }\n } else {\n buf.fill(0)\n }\n return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return buffer.SlowBuffer(size)\n}\n","import { PubSub, Encodings } from '@google-cloud/pubsub'\nimport { MonitoringStatus } from '@arcane-utils/types'\nimport * as avro from 'avro-js'\nimport { getLogExplorerResourceType, getServiceName } from './gcp_component_retrieve_info'\n\nconst { Buffer } = require('safe-buffer')\n\nexport interface MonitoringMessage {\n entity_id: number\n status: MonitoringStatus\n monitoring_id: string\n step: string\n error_message?: string\n}\n\n/**\n * Get PubSub client.\n *\n * To be used in Cloud Functions because of an issue with global declaration of clients.\n */\nexport const getPubsubClient = (gcpProject: string, serviceAccount: string): PubSub => {\n return new PubSub({\n projectId: gcpProject,\n keyFilename: serviceAccount\n })\n}\n\n/**\n * Publish a message on PubSub.\n*/\nexport const publishMessage = async (topicName: string, message: any, pubsub: PubSub, attributes?: any): Promise<string> => {\n const dataBuffer = Buffer.from(JSON.stringify(message))\n return pubsub.topic(topicName).publish(dataBuffer, attributes)\n}\n\n/**\n * Publish a message for Product Flow monitoring via an Avro topic.\n */\nexport const publishProductFlowMonitoringMessage = async (\n step: string,\n entityId: number,\n monitoringId: string,\n status: MonitoringStatus,\n topicName: string,\n pubsub: PubSub,\n projectId: string,\n errorMessage?: string\n): Promise<string> => {\n const timestamp = new Date()\n const componentType = getLogExplorerResourceType()\n const componentName = getServiceName()\n const aroundTime = timestamp.toISOString()\n const logsExplorerUrl =\n `https://console.cloud.google.com/logs/query;query=resource.type%3D%22${encodeURIComponent(componentType)}%22%0Aresource.labels.service_name%3D%22${encodeURIComponent(componentName)}%22%0A%22${encodeURIComponent(monitoringId)}%22;aroundTime=${aroundTime};duration=PT1H?referrer=search&inv=1&invt=Ab20og&project=${encodeURIComponent(projectId)}`\n\n const additionalInfo = { logs_explorer_url: logsExplorerUrl }\n const errorMessageStr = errorMessage ?? ''\n\n const row = {\n step,\n entity_id: entityId,\n monitoring_id: monitoringId,\n status,\n error_message: errorMessageStr,\n timestamp,\n additional_info: JSON.stringify(additionalInfo),\n }\n\n return publishAvroRecords(topicName, pubsub, row)\n}\n\n/**\n * Publish a message similar to a storage notification\n */\nexport const publishStorageMessage = async (\n objectId: string,\n bucketId: string,\n topicName: string,\n pubsub: PubSub,\n monitoringId?: string,\n): Promise<string> => {\n const message = {\n metadata: {\n monitoring_id: monitoringId\n }\n }\n const date = new Date()\n\n const attributes = {\n objectId,\n bucketId,\n eventTime: date.toISOString()\n }\n\n return publishMessage(topicName, message, pubsub, attributes)\n}\n\n/**\n *\n * @param schemaNameOrId : schema name or id\n * @param pubsub : pubsub client\n * @returns : schema definition Avro\n */\nexport const getSchema = async (schemaNameOrId: string, pubsub: PubSub): Promise<string | null | undefined> => {\n const schema = pubsub.schema(schemaNameOrId)\n const info = await schema.get()\n return info.definition\n}\n\n\n/**\n * Publish message with schema validation\n *\n * The schema will be retrieved from the topic metadata and validated\n */\nexport const publishAvroRecords = async (topicNameOrId : string, pubSubClient: PubSub, message: any): Promise<string> => {\n // Get the topic metadata to learn about its schema encoding.\n const topic = pubSubClient.topic(topicNameOrId)\n const [topicMetadata] = await topic.getMetadata()\n const topicSchemaMetadata = topicMetadata.schemaSettings\n\n if (!topicSchemaMetadata) {\n return Promise.reject(new Error(`Topic ${topicNameOrId} doesn't seem to have a schema.`))\n\n }\n const schemaEncoding = topicSchemaMetadata.encoding;\n\n // Make an encoder using the official avro-js library.\n const definition = await getSchema(topicSchemaMetadata?.schema ?? '', pubSubClient)\n const type = avro.parse(definition)\n\n\n let dataBuffer;\n switch (schemaEncoding) {\n case Encodings.Binary:\n dataBuffer = type.toBuffer(message)\n break\n case Encodings.Json:\n dataBuffer = Buffer.from(type.toString(message))\n break\n default:\n return Promise.reject(new Error(`Unknown schema encoding: ${schemaEncoding}`))\n }\n if (!dataBuffer) {\n return Promise.reject(new Error(`Invalid encoding ${schemaEncoding} on the topic.`))\n }\n\n const messageId = await topic.publishMessage({ data: dataBuffer })\n return messageId\n}","/**\n * Detect GCP environment (Cloud Run, Cloud Functions v1/v2)\n * and utilities for service name and Log Explorer resource type.\n */\n\nexport enum GCPEnvironment {\n CLOUD_RUN = 'cloud_run',\n CLOUD_FUNCTION_V2 = 'cloud_function_v2',\n CLOUD_FUNCTION_V1 = 'cloud_function_v1',\n UNKNOWN = 'unknown',\n}\n\n/**\n * Detect whether we're running in Cloud Run, Cloud Functions v1, or v2.\n */\nexport function getGcpEnvironment(): GCPEnvironment {\n const functionTarget = process.env.FUNCTION_TARGET\n const functionName = process.env.FUNCTION_NAME\n const kService = process.env.K_SERVICE\n\n // Cloud Functions v2 runs on Cloud Run but has FUNCTION_TARGET\n if (functionTarget) {\n return GCPEnvironment.CLOUD_FUNCTION_V2\n }\n\n // Cloud Functions v1 has FUNCTION_NAME but not K_SERVICE\n if (functionName && !kService) {\n return GCPEnvironment.CLOUD_FUNCTION_V1\n }\n\n // Cloud Run has K_SERVICE but not FUNCTION_TARGET\n if (kService) {\n return GCPEnvironment.CLOUD_RUN\n }\n\n return GCPEnvironment.UNKNOWN\n}\n\n/**\n * Retrieve the service name from the current GCP environment.\n */\nexport function getServiceName(): string {\n return process.env.K_SERVICE ?? process.env.FUNCTION_NAME ?? 'unknown-service'\n}\n\n/**\n * Get the resource type for Log Explorer queries.\n */\nexport function getLogExplorerResourceType(): string {\n const env = getGcpEnvironment()\n\n switch (env) {\n case GCPEnvironment.CLOUD_RUN:\n return 'cloud_run_revision'\n case GCPEnvironment.CLOUD_FUNCTION_V2:\n return 'cloud_run_revision' // v2 uses Cloud Run\n case GCPEnvironment.CLOUD_FUNCTION_V1:\n return 'cloud_function'\n default:\n return 'global'\n }\n}\n"],"mappings":"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","names":["require_safe_buffer","__commonJSMin","exports","module","buffer","Buffer","copyProps","src","dst","key","SafeBuffer","arg","encodingOrOffset","length","size","fill","encoding","buf","pubsub_exports","__export","getPubsubClient","getSchema","publishAvroRecords","publishMessage","publishProductFlowMonitoringMessage","publishStorageMessage","__toCommonJS","import_pubsub","avro","getGcpEnvironment","functionTarget","functionName","kService","getServiceName","getLogExplorerResourceType","Buffer","getPubsubClient","gcpProject","serviceAccount","publishMessage","topicName","message","pubsub","attributes","dataBuffer","publishProductFlowMonitoringMessage","step","entityId","monitoringId","status","projectId","errorMessage","timestamp","componentType","getLogExplorerResourceType","componentName","getServiceName","aroundTime","additionalInfo","row","publishAvroRecords","publishStorageMessage","objectId","bucketId","getSchema","schemaNameOrId","topicNameOrId","pubSubClient","topic","topicMetadata","topicSchemaMetadata","schemaEncoding","definition","type"]}
package/dist/pubsub.d.cts CHANGED
@@ -19,9 +19,9 @@ declare const getPubsubClient: (gcpProject: string, serviceAccount: string) => P
19
19
  */
20
20
  declare const publishMessage: (topicName: string, message: any, pubsub: PubSub, attributes?: any) => Promise<string>;
21
21
  /**
22
- * Publish a message for Product Flow monitoring
23
- */
24
- declare const publishProductFlowMonitoringMessage: (step: string, entityId: number, monitoringId: string, status: MonitoringStatus, topicName: string, pubsub: PubSub, errorMessage?: string) => Promise<string>;
22
+ * Publish a message for Product Flow monitoring via an Avro topic.
23
+ */
24
+ declare const publishProductFlowMonitoringMessage: (step: string, entityId: number, monitoringId: string, status: MonitoringStatus, topicName: string, pubsub: PubSub, projectId: string, errorMessage?: string) => Promise<string>;
25
25
  /**
26
26
  * Publish a message similar to a storage notification
27
27
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arcane-utils/pubsub",
3
- "version": "1.2.6",
3
+ "version": "1.3.0",
4
4
  "description": "PubSub helper functions.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -23,12 +23,12 @@
23
23
  "jest": {
24
24
  "preset": "ts-jest/presets/js-with-ts",
25
25
  "testEnvironment": "node",
26
- "transformIgnorePatterns": ["node_modules/(?!@arcane-utils/)"]
26
+ "transformIgnorePatterns": ["node_modules/(?!@arcane-utils/)"]
27
27
  },
28
28
  "tsup": {
29
29
  "entry": ["./src/index.ts"],
30
- "format": ["cjs"],
31
- "dts": true,
30
+ "format": ["cjs"],
31
+ "dts": true,
32
32
  "splitting": false,
33
33
  "sourcemap": true,
34
34
  "clean": true,