UNPKG

@azure/functions-extensions-servicebus

Version:
2 lines 16.7 kB
import{createRequire as e}from"node:module";const t=e(import.meta.url);var n={971(e){e.exports=t("rhea")}},s={};function o(e){var t=s[e];if(void 0!==t)return t.exports;var r=s[e]={exports:{}};return n[e](r,r.exports,o),r.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);const r=t("@azure/functions-extensions-base"),i=t("@azure/core-amqp"),a=t("long");var c=o.n(a),u=o(971),l=o.n(u);class d{static convertToString(e){return[e.subarray(0,4).reverse().toString("hex"),e.subarray(4,6).reverse().toString("hex"),e.subarray(6,8).reverse().toString("hex"),e.subarray(8,10).toString("hex"),e.subarray(10).toString("hex")].join("-")}static extractFromMessage(e,t){const n=Buffer.isBuffer(e)?e.subarray(0,t):new Uint8Array(e.slice(0,t));return this.convertToString(Buffer.from(n.subarray(0,16)))}}d.X_OPT_LOCK_TOKEN=Buffer.from("x-opt-lock-token");class p{static decode(e){if(!e||0===e.length)throw new Error("Content buffer is empty");const t=e.indexOf(d.X_OPT_LOCK_TOKEN);if(-1===t)throw new Error("Lock token not found in content");const n=d.extractFromMessage(e,t),s=e.subarray(16),o=console.warn;try{return console.warn=()=>{},{decodedMessage:l().message.decode(s),lockToken:n}}finally{console.warn=o}}}const g=t("@grpc/grpc-js"),m=t("@grpc/proto-loader"),f=t("fs"),y=t("os"),v=t("path");let b=null;var h;!function(e){e.Null="null",e.Byte="byte",e.SByte="sbyte",e.Char="char",e.Int16="int16",e.UInt16="uint16",e.Int32="int32",e.UInt32="uint32",e.Int64="int64",e.UInt64="uint64",e.Single="single",e.Double="double",e.Decimal="decimal",e.Boolean="boolean",e.Guid="guid",e.String="string",e.Uri="uri",e.DateTime="datetime",e.DateTimeOffset="datetimeoffset",e.TimeSpan="timespan",e.Stream="stream",e.Array="array",e.Unknown="unknown"}(h||(h={}));const k=new Map([["number",h.Double],["boolean",h.Boolean],["string",h.String],["bigint",h.Int64]]);function w(e,t){const n=o(971);switch(e){case"null":return null;case"boolean":case"byte":case"sbyte":case"int16":case"uint16":case"int32":case"uint32":case"single":case"double":case"char":case"string":case"guid":case"uri":case"datetime":case"datetimeoffset":case"timespan":default:return t;case"int64":case"uint64":return"bigint"==typeof t?(t>=BigInt(Number.MIN_SAFE_INTEGER)&&t<=BigInt(Number.MAX_SAFE_INTEGER)||console.warn(`BigInt value ${t} is outside safe integer range, precision may be lost`),n.types.wrap_long(Number(t))):n.types.wrap_long(t);case"decimal":return n.types.wrap_decimal128(t);case"stream":return n.types.wrap_binary(t)}}const S="Supported types: Primitives: null, boolean, string (including char, guid, uri, datetime, timespan), Numbers: byte, sbyte, int16, uint16, int32, uint32, int64, uint64, single, double, decimal, Objects: Date (datetimeoffset), URL (uri), Buffer/Uint8Array (stream), arrays of supported types";function R(e){const t=new Map;for(const[n,s]of Object.entries(e)){const e=A(s);if(null===e)throw new Error(`The key '${n}' has a value of type '${typeof s}' which is not supported for AMQP transport. ${S}`);t.set(n,e)}const n=function(e){try{const t=o(971),n={};for(const[t,s]of e.entries())if(s&&"object"==typeof s&&"type"in s&&"value"in s){const e=s;n[t]=w(e.type,e.value)}else n[t]=s;const s=t.types.wrap_map(n),r=new t.types.Writer;r.write(s);const i=r.toBuffer();return new Uint8Array(i)}catch(e){throw new Error(`Failed to encode AMQP map: ${e instanceof Error?e.message:String(e)}`)}}(t);return n}function q(e,t){if(!e||0===Object.keys(e).length)return new Uint8Array;try{return new Uint8Array(R(e))}catch(e){throw new Error(`Failed to encode properties for ${t} operation: ${e instanceof Error?e.message:String(e)}`)}}function A(e){if(null==e)return{type:"null",value:null};switch(typeof e){case"string":{const t=e;return""===t?{type:"string",value:t}:1===t.length?{type:"char",value:t}:(e=>/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e))(t)?{type:"guid",value:t}:(e=>{try{return new URL(e),!0}catch(e){return!1}})(t)?{type:"uri",value:t}:(e=>/^-?(\d+\.)?(\d{2}:)?(\d{2}:)?\d{2}(\.\d{1,7})?$/.test(e))(t)?{type:"timespan",value:t}:(e=>!isNaN(Date.parse(e)))(t)?{type:"datetime",value:t}:{type:"string",value:t}}case"number":{const t=e;return Number.isFinite(t)?Number.isInteger(t)?(e=>Number.isInteger(e)&&e>=0&&e<=255)(t)?{type:"byte",value:t}:(e=>Number.isInteger(e)&&e>=-128&&e<=127)(t)?{type:"sbyte",value:t}:(e=>Number.isInteger(e)&&e>=-32768&&e<=32767)(t)?{type:"int16",value:t}:(e=>Number.isInteger(e)&&e>=0&&e<=65535)(t)?{type:"uint16",value:t}:(e=>Number.isInteger(e)&&e>=-2147483648&&e<=2147483647)(t)?{type:"int32",value:t}:(e=>Number.isInteger(e)&&e>=0&&e<=4294967295)(t)?{type:"uint32",value:t}:{type:"int64",value:BigInt(t)}:(e=>!Number.isInteger(e)&&Math.abs(e)<=34028235e31)(t)?{type:"single",value:t}:{type:"double",value:t}:t}case"boolean":return{type:"boolean",value:e};case"bigint":{const t=e;return t>=BigInt(0)&&t<=BigInt("18446744073709551615")?{type:"uint64",value:t}:{type:"int64",value:t}}case"object":return e instanceof Date?{type:"datetimeoffset",value:e.toISOString()}:e instanceof Buffer||e instanceof Uint8Array?{type:"stream",value:e}:e instanceof URL?{type:"uri",value:e.href}:null!==(t=e)&&"object"==typeof t&&"toString"in t&&("precision"in t||"scale"in t||"value"in t)?{type:"decimal",value:e}:Array.isArray(e)?e.map(e=>A(e)):null;default:return null}var t}function M(e){if(null==e)return h.Null;if(e&&"object"==typeof e&&"type"in e&&"value"in e){const t=e;return Object.values(h).find(e=>e===t.type)||h.Unknown}const t=typeof e,n=k.get(t);if(n)return n;if("object"===t){if(e instanceof Date)return h.DateTimeOffset;if(e instanceof URL)return h.Uri;if(e instanceof Buffer||e instanceof Uint8Array)return h.Stream;if(Array.isArray(e))return h.Array}return h.Unknown}function T(e){for(const[t,n]of Object.entries(e))if(M(n)===h.Unknown)throw new Error(`Property '${t}' has unsupported type '${typeof n}' for AMQP transport. ${S}`)}const I=t("node:util");class x{static build(){const{values:e}=(0,I.parseArgs)({args:process.argv.slice(2),options:{host:{type:"string"},port:{type:"string"},"functions-grpc-max-message-length":{type:"string"}},strict:!1}),{host:t,port:n,"functions-grpc-max-message-length":s}=e,o=[];if(t||o.push("'host'"),n||o.push("'port'"),s||o.push("'functions-grpc-max-message-length'"),o.length)throw new Error(`Missing required arguments: ${o.join(", ")}`);return{uri:`${String(t)}:${String(n)}`,grpcMaxMessageLength:Number(s)}}}var B=function(e,t,n,s){return new(n||(n=Promise))(function(o,r){function i(e){try{c(s.next(e))}catch(e){r(e)}}function a(e){try{c(s.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(i,a)}c((s=s.apply(e,t||[])).next())})};class D{constructor(){const{uri:e,grpcMaxMessageLength:t}=x.build();this.client=function({serviceName:e,address:t,credentials:n=g.credentials.createInsecure(),grpcMaxMessageLength:s}){if(!b){const e=y.tmpdir(),t=v.join(e,"settlement.proto");try{f.writeFileSync(t,'\nsyntax = "proto3";\n\nimport "google/protobuf/empty.proto";\nimport "google/protobuf/wrappers.proto";\nimport "google/protobuf/timestamp.proto";\n\n// this namespace will be shared between isolated worker and WebJobs extension so make it somewhat generic\noption csharp_namespace = "Microsoft.Azure.ServiceBus.Grpc";\n\n// The settlement service definition.\nservice Settlement {\n // Completes a message\n rpc Complete (CompleteRequest) returns (google.protobuf.Empty) {}\n\n // Abandons a message\n rpc Abandon (AbandonRequest) returns (google.protobuf.Empty) {}\n\n // Deadletters a message\n rpc Deadletter (DeadletterRequest) returns (google.protobuf.Empty) {}\n\n // Defers a message\n rpc Defer (DeferRequest) returns (google.protobuf.Empty) {}\n\n // Renew message lock\n rpc RenewMessageLock (RenewMessageLockRequest) returns (google.protobuf.Empty) {}\n\n // Get session state\n rpc GetSessionState (GetSessionStateRequest) returns (GetSessionStateResponse) {}\n\n // Set session state\n rpc SetSessionState (SetSessionStateRequest) returns (google.protobuf.Empty) {}\n\n // Release session\n rpc ReleaseSession (ReleaseSessionRequest) returns (google.protobuf.Empty) {}\n\n // Renew session lock\n rpc RenewSessionLock (RenewSessionLockRequest) returns (RenewSessionLockResponse) {}\n}\n\n// The complete message request containing the locktoken.\nmessage CompleteRequest {\n string locktoken = 1;\n}\n\n// The abandon message request containing the locktoken and properties to modify.\nmessage AbandonRequest {\n string locktoken = 1;\n bytes propertiesToModify = 2;\n}\n\n// The deadletter message request containing the locktoken and properties to modify along with the reason/description.\nmessage DeadletterRequest {\n string locktoken = 1;\n bytes propertiesToModify = 2;\n google.protobuf.StringValue deadletterReason = 3;\n google.protobuf.StringValue deadletterErrorDescription = 4;\n}\n\n// The defer message request containing the locktoken and properties to modify.\nmessage DeferRequest {\n string locktoken = 1;\n bytes propertiesToModify = 2;\n}\n\n// The renew message lock request containing the locktoken.\nmessage RenewMessageLockRequest {\n string locktoken = 1;\n}\n\n// The get message request.\nmessage GetSessionStateRequest {\n string sessionId = 1;\n}\n\n// The set message request.\nmessage SetSessionStateRequest {\n string sessionId = 1;\n bytes sessionState = 2;\n}\n\n// Get response containing the session state.\nmessage GetSessionStateResponse {\n bytes sessionState = 1;\n}\n\n// Release session.\nmessage ReleaseSessionRequest {\n string sessionId = 1;\n}\n\n// Renew session lock.\nmessage RenewSessionLockRequest {\n string sessionId = 1;\n}\n\n// Renew session lock.\nmessage RenewSessionLockResponse {\n google.protobuf.Timestamp lockedUntil = 1;\n}\n');const n=m.loadSync(t,{keepCase:!1,longs:String,enums:String,defaults:!0,oneofs:!0,includeDirs:[e]});b=g.loadPackageDefinition(n)}finally{try{f.unlinkSync(t)}catch(e){}}}const o=b[e];if(!o)throw new Error(`Service "${e}" not found in embedded proto definition`);return new o(t,n,{"grpc.max_send_message_length":s,"grpc.max_receive_message_length":s})}({serviceName:"Settlement",address:e,credentials:g.credentials.createInsecure(),grpcMaxMessageLength:t})}static getInstance(){return D.instance||(D.instance=new D),D.instance}validateLockToken(e){const t=e.lockToken;if(!t)throw new Error("ArgumentException: lockToken is required in ServiceBusReceivedMessage.");return t}complete(e){return B(this,void 0,void 0,function*(){const t=this.validateLockToken(e);return new Promise((e,n)=>{const s={locktoken:t};this.client.complete(s,t=>{t?(console.error("Complete request failed:",{code:t.code,message:t.message,details:t.details}),n(t)):e()})})})}abandon(e,t){return B(this,void 0,void 0,function*(){const n=this.validateLockToken(e),s=q(t,"abandon");return new Promise((e,t)=>{const o={locktoken:n,propertiesToModify:s};this.client.abandon(o,n=>{n?(console.error("Abandon request failed:",{code:n.code,message:n.message,details:n.details}),t(n)):e()})})})}deadletter(e,t,n,s){return B(this,void 0,void 0,function*(){const o=this.validateLockToken(e),r=q(t,"deadletter");return new Promise((e,t)=>{const i={locktoken:o,propertiesToModify:r,deadletterReason:n?{value:n}:void 0,deadletterErrorDescription:s?{value:s}:void 0};this.client.deadletter(i,n=>{n?(console.error("Deadletter request failed:",{code:n.code,message:n.message,details:n.details}),t(n)):e()})})})}defer(e,t){return B(this,void 0,void 0,function*(){const n=this.validateLockToken(e),s=q(t,"defer");return new Promise((e,t)=>{const o={locktoken:n,propertiesToModify:s};this.client.defer(o,n=>{n?(console.error("Defer request failed:",{code:n.code,message:n.message,details:n.details}),t(n)):e()})})})}renewMessageLock(e){return B(this,void 0,void 0,function*(){const t=this.validateLockToken(e);return new Promise((e,n)=>{const s={locktoken:t};this.client.renewMessageLock(s,t=>{t?(console.error("Renew message lock request failed:",{code:t.code,message:t.message,details:t.details}),n(t)):e()})})})}setSessionState(e,t){return B(this,void 0,void 0,function*(){return new Promise((n,s)=>{const o={sessionId:e,sessionState:t};this.client.setSessionState(o,e=>{e?(console.error("Set session state request failed:",{code:e.code,message:e.message,details:e.details}),s(e)):n()})})})}releaseSession(e){return B(this,void 0,void 0,function*(){return new Promise((t,n)=>{const s={sessionId:e};this.client.releaseSession(s,e=>{e?(console.error("Release session request failed:",{code:e.code,message:e.message,details:e.details}),n(e)):t()})})})}renewSessionLock(e){return B(this,void 0,void 0,function*(){return new Promise((t,n)=>{const s={sessionId:e};this.client.renewSessionLock(s,(e,s)=>{if(e)console.error("Renew session lock request failed:",{code:e.code,message:e.message,details:e.details}),n(e);else if(s&&s.lockedUntil)t(s.lockedUntil);else{const e=new Error("No response or lockedUntil returned from renewSessionLock");n(e)}})})})}static resetInstance(){D.instance=null}}D.instance=null;const L="x-opt-sequence-number",E="x-opt-offset";class N{static buildServiceBusMessageFromModelBindingData(e){const t=D.getInstance(),n=e=>{if(!e.content)throw new Error("ModelBindingData.content is null or undefined.");const{decodedMessage:t,lockToken:n}=p.decode(e.content);return this.createServiceBusReceivedMessageFromRhea(t,n)};return{messages:Array.isArray(e)?e.map(n):[n(e)],actions:t}}static createServiceBusReceivedMessageFromAmqp(e,t){var n,s,o,r,i,a,u,l,d,p,g,m,f,y,v,b,h,k,w,S;return{body:N.decodeAmqpBody(e.body),messageId:null===(s=null===(n=e.properties)||void 0===n?void 0:n.messageId)||void 0===s?void 0:s.toString(),correlationId:null===(r=null===(o=e.properties)||void 0===o?void 0:o.correlationId)||void 0===r?void 0:r.toString(),contentType:null===(i=e.properties)||void 0===i?void 0:i.contentType,subject:null===(a=e.properties)||void 0===a?void 0:a.subject,to:null===(u=e.properties)||void 0===u?void 0:u.to,replyTo:null===(l=e.properties)||void 0===l?void 0:l.replyTo,replyToSessionId:null===(d=e.properties)||void 0===d?void 0:d.replyToGroupId,sessionId:null===(p=e.properties)||void 0===p?void 0:p.groupId,timeToLive:null===(g=e.header)||void 0===g?void 0:g.timeToLive,applicationProperties:e.applicationProperties||{},deliveryCount:(null===(m=e.header)||void 0===m?void 0:m.deliveryCount)||0,lockToken:t,_rawAmqpMessage:e,enqueuedTimeUtc:N.extractDateFromAnnotation(null===(f=e.messageAnnotations)||void 0===f?void 0:f["x-opt-enqueued-time"]),lockedUntilUtc:N.extractDateFromAnnotation(null===(y=e.messageAnnotations)||void 0===y?void 0:y["x-opt-locked-until"]),sequenceNumber:void 0!==(null===(v=e.messageAnnotations)||void 0===v?void 0:v[L])?c().fromNumber(Number(e.messageAnnotations[L])):void 0,enqueuedSequenceNumber:void 0!==(null===(b=e.messageAnnotations)||void 0===b?void 0:b[E])?Number(e.messageAnnotations[E]):void 0!==(null===(h=e.messageAnnotations)||void 0===h?void 0:h[L])?Number(e.messageAnnotations[L]):void 0,deadLetterReason:null===(k=e.applicationProperties)||void 0===k?void 0:k.DeadLetterReason,deadLetterErrorDescription:null===(w=e.applicationProperties)||void 0===w?void 0:w.DeadLetterErrorDescription,deadLetterSource:null===(S=e.messageAnnotations)||void 0===S?void 0:S["x-opt-deadletter-source"],state:"active"}}static createServiceBusReceivedMessageFromRhea(e,t){const n=i.AmqpAnnotatedMessage.fromRheaMessage(e);return N.createServiceBusReceivedMessageFromAmqp(n,t)}static decodeAmqpBody(e){if("object"==typeof e&&null!==e&&"typecode"in e&&"content"in e&&"number"==typeof e.typecode&&Buffer.isBuffer(e.content)){const{typecode:t,content:n}=e;return n}return e}static extractDateFromAnnotation(e){if(null!=e)return e instanceof Date?e:"string"==typeof e||"number"==typeof e?new Date(e):void 0}}const U="AzureServiceBusReceivedMessage",_=new TextDecoder("utf-8",{fatal:!0});function P(e){const t=e.body;return Buffer.isBuffer(t)?_.decode(t):"string"==typeof t?t:JSON.stringify(t)}function F(e,t){return JSON.parse(P(e),t)}!function(){try{const e=r.ResourceFactoryResolver.getInstance();e.hasResourceFactory(U)||e.registerResourceFactory(U,e=>N.buildServiceBusMessageFromModelBindingData(e))}catch(e){throw new Error(`Service Bus Message Factory initialization failed: ${e instanceof Error?e.message:String(e)}`)}}();export{R as convertPropertiesToAmqpBytes,F as messageBodyAsJson,P as messageBodyAsText,T as validateAmqpProperties}; //# sourceMappingURL=azure-functions-extensions-servicebus.min.mjs.map