webhookdump 0.0.2
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.
- checksums.yaml +7 -0
- data/bin/webhookdump +3 -0
- data/lib/webhook_dump.rb +120 -0
- metadata +101 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f49b8299be7c721086315b6b1599bccbdf4f45d713626e2108995d1eecdfdb47
|
4
|
+
data.tar.gz: a4d3442adeb9b99d5f8ad79061bff5eb97d2d6be607492e7614e2ad275940c58
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 25b7318994daa111f9d33d500e3c636f597873a39ff722f3e36770546d60e7dcea1629a1e537c8c58dee545f5970a0475c6c4120ff396e4f4367760744c4d9a5
|
7
|
+
data.tar.gz: 3a41012a76154f87b40e326b9d25cde3978f9da522b7ab1a091aa43dfc9509543a8c1a854b20768fb186f8fab09b39d64336ffd9c62f74866dd091a2a6e03190
|
data/bin/webhookdump
ADDED
data/lib/webhook_dump.rb
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'eventmachine'
|
3
|
+
require 'faye/websocket'
|
4
|
+
require 'json'
|
5
|
+
require 'faraday'
|
6
|
+
|
7
|
+
module WebhookDump
|
8
|
+
class CLI < Thor
|
9
|
+
WEBSOCKET_URL = 'wss://webhookdump.link/cable'
|
10
|
+
WEBSOCKET_URL_DEV = 'ws://localhost:3000/cable'
|
11
|
+
|
12
|
+
option :dev, type: :boolean, default: false, desc: 'Use development environment'
|
13
|
+
|
14
|
+
desc "forward WEBHOOKDUMP_ID FORWARD_URL", "Forward events from WebhookDump to a target URL"
|
15
|
+
|
16
|
+
def forward(webhookdump_id, forward_url)
|
17
|
+
EM.run do
|
18
|
+
puts "Start forwarding events from WebhookDump #{webhookdump_id} to #{forward_url}"
|
19
|
+
|
20
|
+
ws = init_faye_websocket_connection(webhookdump_id)
|
21
|
+
|
22
|
+
open_websocket_connection(ws)
|
23
|
+
|
24
|
+
handle_incoming_message(ws, forward_url)
|
25
|
+
|
26
|
+
close_websocket_connection(ws)
|
27
|
+
rescue => e
|
28
|
+
puts "Error in EventMachine: #{e.message}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def open_websocket_connection(ws)
|
35
|
+
ws.on :open do |event|
|
36
|
+
ws.send({
|
37
|
+
command: 'subscribe',
|
38
|
+
identifier: { channel: 'RequestForwarderChannel' }.to_json
|
39
|
+
}.to_json)
|
40
|
+
rescue => e
|
41
|
+
puts "Error opening connection: #{e.message}"
|
42
|
+
ensure
|
43
|
+
puts "Connection established. Waiting for incoming request..."
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def handle_incoming_message(ws, forward_url)
|
48
|
+
ws.on :message do |event|
|
49
|
+
data = JSON.parse(event.data, symbolize_names: true)
|
50
|
+
message = {}
|
51
|
+
message = data[:message] if data[:message].is_a? Hash
|
52
|
+
|
53
|
+
if message.has_key? :id
|
54
|
+
forward_message(forward_url, message)
|
55
|
+
end
|
56
|
+
rescue => e
|
57
|
+
puts "Error forwarding request to #{forward_url}: #{e.message}"
|
58
|
+
puts "Request: #{e.backtrace}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def close_websocket_connection(ws)
|
63
|
+
ws.on :close do |event|
|
64
|
+
reason = event.reason != ' ' ? 'Probably invalid WebhookDump ID' : event.reason
|
65
|
+
puts "Connection closed, #{event.code}, #{reason}"
|
66
|
+
|
67
|
+
EM.stop
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def init_faye_websocket_connection(webhookdump_id)
|
72
|
+
Faye::WebSocket::Client.new("#{WEBSOCKET_URL_DEV}?id=#{webhookdump_id}")
|
73
|
+
end
|
74
|
+
|
75
|
+
def websocket_url
|
76
|
+
options[:dev] ? WEBSOCKET_URL_DEV : WEBSOCKET_URL
|
77
|
+
end
|
78
|
+
|
79
|
+
def forward_message(forward_url, message)
|
80
|
+
headers = parse_headers(message[:headers])
|
81
|
+
body = parse_body(message[:payload])
|
82
|
+
|
83
|
+
conn = Faraday.new(url: forward_url)
|
84
|
+
|
85
|
+
response = conn.send(message[:method].downcase.to_sym) do |req|
|
86
|
+
# req.url path
|
87
|
+
req.headers = headers
|
88
|
+
# set user agent
|
89
|
+
req.headers['User-Agent'] = 'WebhookDump Forwarder'
|
90
|
+
req.body = body.to_json if body
|
91
|
+
end
|
92
|
+
|
93
|
+
puts "Request forwarded with status: #{response.status}"
|
94
|
+
rescue JSON::ParserError => e
|
95
|
+
puts "Error parsing JSON: #{e.message}"
|
96
|
+
end
|
97
|
+
|
98
|
+
def parse_headers(headers)
|
99
|
+
return {} if headers.nil? || headers.empty?
|
100
|
+
|
101
|
+
JSON.parse(headers)
|
102
|
+
rescue JSON::ParserError => e
|
103
|
+
puts "Error parsing headers: #{e.message}"
|
104
|
+
|
105
|
+
{}
|
106
|
+
end
|
107
|
+
|
108
|
+
def parse_body(body)
|
109
|
+
return {} if body.nil? || body.empty?
|
110
|
+
|
111
|
+
JSON.parse(body)
|
112
|
+
rescue JSON::ParserError => e
|
113
|
+
puts "Error parsing body: #{e.message}"
|
114
|
+
|
115
|
+
{}
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
WebhookDump::CLI.start(ARGV)
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: webhookdump
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Risal Hidayat
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-02-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: thor
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: eventmachine
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: faye-websocket
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: faraday
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: A webhook dump http forwarder CLI
|
70
|
+
email: risalhidayat88@gmail.com
|
71
|
+
executables:
|
72
|
+
- webhookdump
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- bin/webhookdump
|
77
|
+
- lib/webhook_dump.rb
|
78
|
+
homepage: https://rubygems.org/gems/webhook_dump_cli
|
79
|
+
licenses:
|
80
|
+
- MIT
|
81
|
+
metadata: {}
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
requirements: []
|
97
|
+
rubygems_version: 3.4.10
|
98
|
+
signing_key:
|
99
|
+
specification_version: 4
|
100
|
+
summary: Webhook Dump CLI
|
101
|
+
test_files: []
|