Add auth to State - #10

Merged
nemanjabogdanovic merged 4 commits into
mainfrom
add_auth_to_state
May 20, 2026
Merged

Add auth to State#10
nemanjabogdanovic merged 4 commits into
mainfrom
add_auth_to_state

Conversation

@nemanjabogdanovic

Copy link
Copy Markdown
Contributor

No description provided.

@nemanjabogdanovic
nemanjabogdanovic requested a review from a teamMay 18, 2026 12:44
@nemanjabogdanovicnemanjabogdanovic self-assigned this May 18, 2026
@nemanjabogdanovicnemanjabogdanovic added the enhancement New feature or request label May 18, 2026

@bdebinskabdebinska left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

Comment threadlib/actions/http.ex
max_retries: max_retries,
decode_body: decode_body
)
|> Req.update(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe use Req.merge?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, but it's older code and not super-relevant for this PR, so I'd prefer handling it separately if that's okay

@bdebinska

Copy link
Copy Markdown

Another comment from my side: This branch and PR should be linked to the ticket

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

@nemanjabogdanovicnemanjabogdanovic changed the title Add auth to StatePD-4147 Add auth to StateMay 18, 2026
@bdebinska

Copy link
Copy Markdown

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

Bad formulation on my side sorry. I meant more that it seems that having a separate "auth" action/step, instead of having it in the state directly seems more fitting to me.

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

Bad formulation on my side sorry. I meant more that it seems that having a separate "auth" action/step, instead of having it in the state directly seems more fitting to me.

Hm, maybe.. My line of thinking was always that the current workflows shouldn't be affected/touched, so I put everything on the services. We could discuss this other way as well

@iStefo

Copy link
Copy Markdown
Contributor

Hi all 👋

I'd like to throw a different suggestion into the ring: Make authentication a callback-based operation (optional of course). This brings flexibility while keeping complexity out of workflow engine.

While I haven't fully thought this through, I could image it looking like this:

defmoduleMyApp.WorkflowEnginedouseWorkflowEngine,defauthenticate(:http,target,auth_context)do{:ok,{:bearer,"foobar"}}enddefauthenticate(_action_type,_target,_auth_context),do: {:ok,nil}end

where :http is hardcoded based on the action type, target would depend on the action type (for HTTP it could be either the full URL or a {method, host, path} tuple) and auth_context is a struct with

%{state: %WorkflowEngine.State{},action: %{},# action JSON being executedworkflow: %{}# whole workflow JSON definition or identifier?}

Information about the acting entity would be placed into a new key in the workflow engine's state when calling execute. But then no token needs to be fetched or created if the workflow doesn't even ask for auth, while automatically centralizing authentication code for all workflow executions.

The return format would depend on the action type, for HTTP you could initially support {:ok, nil} or {:ok, {:bearer, "token"}} and then later also basic auth etc. when needed. Other actions might need different auth formats (SSH or API keys, client certificates...)

To make it easy to use, WorkflowEngine should add/generate a get_auth method that can be used by actions to fetch auth for the current action if the callback has been implemented by the hosting application.

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

Hi all 👋

I'd like to throw a different suggestion into the ring: Make authentication a callback-based operation (optional of course). This brings flexibility while keeping complexity out of workflow engine.

While I haven't fully thought this through, I could image it looking like this:
...

Heyy, thanks for the suggestion! I like the idea overall, I'll try and see if I can cook something up around it

@nemanjabogdanovicnemanjabogdanovic changed the title PD-4147 Add auth to StateAdd auth to StateMay 20, 2026

@bdebinskabdebinska left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code-wise looks good, but I'm still not convinced we should add this feature if we won't be meaningfully using it in the foreseeable future

@mpneuriedmpneuried left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code wise it looks good.
Only some small doc extensions would be nice.

I partially agree with BDE, on the other side we now put effort in it and it's covered by tests. So I'm fine with it.

Comment threadlib/auth.ex Outdated
Comment threadREADME.md Outdated
@nemanjabogdanovic
nemanjabogdanovic merged commit 3a21fbd into mainMay 20, 2026
11 checks passed
@nemanjabogdanovic
nemanjabogdanovic deleted the add_auth_to_state branch May 20, 2026 13:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@nemanjabogdanovic@bdebinska@iStefo@mpneuried
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add auth to State - #10

Merged
nemanjabogdanovic merged 4 commits into
mainfrom
add_auth_to_state
May 20, 2026
Merged

Add auth to State#10
nemanjabogdanovic merged 4 commits into
mainfrom
add_auth_to_state

Conversation

@nemanjabogdanovic

Copy link
Copy Markdown
Contributor

No description provided.

@nemanjabogdanovic
nemanjabogdanovic requested a review from a teamMay 18, 2026 12:44
@nemanjabogdanovicnemanjabogdanovic self-assigned this May 18, 2026
@nemanjabogdanovicnemanjabogdanovic added the enhancement New feature or request label May 18, 2026

@bdebinskabdebinska left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

Comment threadlib/actions/http.ex
max_retries: max_retries,
decode_body: decode_body
)
|> Req.update(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe use Req.merge?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, but it's older code and not super-relevant for this PR, so I'd prefer handling it separately if that's okay

@bdebinska

Copy link
Copy Markdown

Another comment from my side: This branch and PR should be linked to the ticket

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

@nemanjabogdanovicnemanjabogdanovic changed the title Add auth to StatePD-4147 Add auth to StateMay 18, 2026
@bdebinska

Copy link
Copy Markdown

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

Bad formulation on my side sorry. I meant more that it seems that having a separate "auth" action/step, instead of having it in the state directly seems more fitting to me.

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

Bad formulation on my side sorry. I meant more that it seems that having a separate "auth" action/step, instead of having it in the state directly seems more fitting to me.

Hm, maybe.. My line of thinking was always that the current workflows shouldn't be affected/touched, so I put everything on the services. We could discuss this other way as well

@iStefo

Copy link
Copy Markdown
Contributor

Hi all 👋

I'd like to throw a different suggestion into the ring: Make authentication a callback-based operation (optional of course). This brings flexibility while keeping complexity out of workflow engine.

While I haven't fully thought this through, I could image it looking like this:

defmoduleMyApp.WorkflowEnginedouseWorkflowEngine,defauthenticate(:http,target,auth_context)do{:ok,{:bearer,"foobar"}}enddefauthenticate(_action_type,_target,_auth_context),do: {:ok,nil}end

where :http is hardcoded based on the action type, target would depend on the action type (for HTTP it could be either the full URL or a {method, host, path} tuple) and auth_context is a struct with

%{state: %WorkflowEngine.State{},action: %{},# action JSON being executedworkflow: %{}# whole workflow JSON definition or identifier?}

Information about the acting entity would be placed into a new key in the workflow engine's state when calling execute. But then no token needs to be fetched or created if the workflow doesn't even ask for auth, while automatically centralizing authentication code for all workflow executions.

The return format would depend on the action type, for HTTP you could initially support {:ok, nil} or {:ok, {:bearer, "token"}} and then later also basic auth etc. when needed. Other actions might need different auth formats (SSH or API keys, client certificates...)

To make it easy to use, WorkflowEngine should add/generate a get_auth method that can be used by actions to fetch auth for the current action if the callback has been implemented by the hosting application.

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

Hi all 👋

I'd like to throw a different suggestion into the ring: Make authentication a callback-based operation (optional of course). This brings flexibility while keeping complexity out of workflow engine.

While I haven't fully thought this through, I could image it looking like this:
...

Heyy, thanks for the suggestion! I like the idea overall, I'll try and see if I can cook something up around it

@nemanjabogdanovicnemanjabogdanovic changed the title PD-4147 Add auth to StateAdd auth to StateMay 20, 2026

@bdebinskabdebinska left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code-wise looks good, but I'm still not convinced we should add this feature if we won't be meaningfully using it in the foreseeable future

@mpneuriedmpneuried left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code wise it looks good.
Only some small doc extensions would be nice.

I partially agree with BDE, on the other side we now put effort in it and it's covered by tests. So I'm fine with it.

Comment threadlib/auth.ex Outdated
Comment threadREADME.md Outdated
@nemanjabogdanovic
nemanjabogdanovic merged commit 3a21fbd into mainMay 20, 2026
11 checks passed
@nemanjabogdanovic
nemanjabogdanovic deleted the add_auth_to_state branch May 20, 2026 13:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@nemanjabogdanovic@bdebinska@iStefo@mpneuried
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add auth to State - #10

Merged
nemanjabogdanovic merged 4 commits into
mainfrom
add_auth_to_state
May 20, 2026
Merged

Add auth to State#10
nemanjabogdanovic merged 4 commits into
mainfrom
add_auth_to_state

Conversation

@nemanjabogdanovic

Copy link
Copy Markdown
Contributor

No description provided.

@nemanjabogdanovic
nemanjabogdanovic requested a review from a teamMay 18, 2026 12:44
@nemanjabogdanovicnemanjabogdanovic self-assigned this May 18, 2026
@nemanjabogdanovicnemanjabogdanovic added the enhancement New feature or request label May 18, 2026

@bdebinskabdebinska left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

Comment threadlib/actions/http.ex
max_retries: max_retries,
decode_body: decode_body
)
|> Req.update(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe use Req.merge?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, but it's older code and not super-relevant for this PR, so I'd prefer handling it separately if that's okay

@bdebinska

Copy link
Copy Markdown

Another comment from my side: This branch and PR should be linked to the ticket

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

@nemanjabogdanovicnemanjabogdanovic changed the title Add auth to StatePD-4147 Add auth to StateMay 18, 2026
@bdebinska

Copy link
Copy Markdown

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

Bad formulation on my side sorry. I meant more that it seems that having a separate "auth" action/step, instead of having it in the state directly seems more fitting to me.

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

Bad formulation on my side sorry. I meant more that it seems that having a separate "auth" action/step, instead of having it in the state directly seems more fitting to me.

Hm, maybe.. My line of thinking was always that the current workflows shouldn't be affected/touched, so I put everything on the services. We could discuss this other way as well

@iStefo

Copy link
Copy Markdown
Contributor

Hi all 👋

I'd like to throw a different suggestion into the ring: Make authentication a callback-based operation (optional of course). This brings flexibility while keeping complexity out of workflow engine.

While I haven't fully thought this through, I could image it looking like this:

defmoduleMyApp.WorkflowEnginedouseWorkflowEngine,defauthenticate(:http,target,auth_context)do{:ok,{:bearer,"foobar"}}enddefauthenticate(_action_type,_target,_auth_context),do: {:ok,nil}end

where :http is hardcoded based on the action type, target would depend on the action type (for HTTP it could be either the full URL or a {method, host, path} tuple) and auth_context is a struct with

%{state: %WorkflowEngine.State{},action: %{},# action JSON being executedworkflow: %{}# whole workflow JSON definition or identifier?}

Information about the acting entity would be placed into a new key in the workflow engine's state when calling execute. But then no token needs to be fetched or created if the workflow doesn't even ask for auth, while automatically centralizing authentication code for all workflow executions.

The return format would depend on the action type, for HTTP you could initially support {:ok, nil} or {:ok, {:bearer, "token"}} and then later also basic auth etc. when needed. Other actions might need different auth formats (SSH or API keys, client certificates...)

To make it easy to use, WorkflowEngine should add/generate a get_auth method that can be used by actions to fetch auth for the current action if the callback has been implemented by the hosting application.

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

Hi all 👋

I'd like to throw a different suggestion into the ring: Make authentication a callback-based operation (optional of course). This brings flexibility while keeping complexity out of workflow engine.

While I haven't fully thought this through, I could image it looking like this:
...

Heyy, thanks for the suggestion! I like the idea overall, I'll try and see if I can cook something up around it

@nemanjabogdanovicnemanjabogdanovic changed the title PD-4147 Add auth to StateAdd auth to StateMay 20, 2026

@bdebinskabdebinska left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code-wise looks good, but I'm still not convinced we should add this feature if we won't be meaningfully using it in the foreseeable future

@mpneuriedmpneuried left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code wise it looks good.
Only some small doc extensions would be nice.

I partially agree with BDE, on the other side we now put effort in it and it's covered by tests. So I'm fine with it.

Comment threadlib/auth.ex Outdated
Comment threadREADME.md Outdated
@nemanjabogdanovic
nemanjabogdanovic merged commit 3a21fbd into mainMay 20, 2026
11 checks passed
@nemanjabogdanovic
nemanjabogdanovic deleted the add_auth_to_state branch May 20, 2026 13:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@nemanjabogdanovic@bdebinska@iStefo@mpneuried
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add auth to State - #10

Merged
nemanjabogdanovic merged 4 commits into
mainfrom
add_auth_to_state
May 20, 2026
Merged

Add auth to State#10
nemanjabogdanovic merged 4 commits into
mainfrom
add_auth_to_state

Conversation

@nemanjabogdanovic

Copy link
Copy Markdown
Contributor

No description provided.

@nemanjabogdanovic
nemanjabogdanovic requested a review from a teamMay 18, 2026 12:44
@nemanjabogdanovicnemanjabogdanovic self-assigned this May 18, 2026
@nemanjabogdanovicnemanjabogdanovic added the enhancement New feature or request label May 18, 2026

@bdebinskabdebinska left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

Comment threadlib/actions/http.ex
max_retries: max_retries,
decode_body: decode_body
)
|> Req.update(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe use Req.merge?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, but it's older code and not super-relevant for this PR, so I'd prefer handling it separately if that's okay

@bdebinska

Copy link
Copy Markdown

Another comment from my side: This branch and PR should be linked to the ticket

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

@nemanjabogdanovicnemanjabogdanovic changed the title Add auth to StatePD-4147 Add auth to StateMay 18, 2026
@bdebinska

Copy link
Copy Markdown

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

Bad formulation on my side sorry. I meant more that it seems that having a separate "auth" action/step, instead of having it in the state directly seems more fitting to me.

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

Bad formulation on my side sorry. I meant more that it seems that having a separate "auth" action/step, instead of having it in the state directly seems more fitting to me.

Hm, maybe.. My line of thinking was always that the current workflows shouldn't be affected/touched, so I put everything on the services. We could discuss this other way as well

@iStefo

Copy link
Copy Markdown
Contributor

Hi all 👋

I'd like to throw a different suggestion into the ring: Make authentication a callback-based operation (optional of course). This brings flexibility while keeping complexity out of workflow engine.

While I haven't fully thought this through, I could image it looking like this:

defmoduleMyApp.WorkflowEnginedouseWorkflowEngine,defauthenticate(:http,target,auth_context)do{:ok,{:bearer,"foobar"}}enddefauthenticate(_action_type,_target,_auth_context),do: {:ok,nil}end

where :http is hardcoded based on the action type, target would depend on the action type (for HTTP it could be either the full URL or a {method, host, path} tuple) and auth_context is a struct with

%{state: %WorkflowEngine.State{},action: %{},# action JSON being executedworkflow: %{}# whole workflow JSON definition or identifier?}

Information about the acting entity would be placed into a new key in the workflow engine's state when calling execute. But then no token needs to be fetched or created if the workflow doesn't even ask for auth, while automatically centralizing authentication code for all workflow executions.

The return format would depend on the action type, for HTTP you could initially support {:ok, nil} or {:ok, {:bearer, "token"}} and then later also basic auth etc. when needed. Other actions might need different auth formats (SSH or API keys, client certificates...)

To make it easy to use, WorkflowEngine should add/generate a get_auth method that can be used by actions to fetch auth for the current action if the callback has been implemented by the hosting application.

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

Hi all 👋

I'd like to throw a different suggestion into the ring: Make authentication a callback-based operation (optional of course). This brings flexibility while keeping complexity out of workflow engine.

While I haven't fully thought this through, I could image it looking like this:
...

Heyy, thanks for the suggestion! I like the idea overall, I'll try and see if I can cook something up around it

@nemanjabogdanovicnemanjabogdanovic changed the title PD-4147 Add auth to StateAdd auth to StateMay 20, 2026

@bdebinskabdebinska left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code-wise looks good, but I'm still not convinced we should add this feature if we won't be meaningfully using it in the foreseeable future

@mpneuriedmpneuried left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code wise it looks good.
Only some small doc extensions would be nice.

I partially agree with BDE, on the other side we now put effort in it and it's covered by tests. So I'm fine with it.

Comment threadlib/auth.ex Outdated
Comment threadREADME.md Outdated
@nemanjabogdanovic
nemanjabogdanovic merged commit 3a21fbd into mainMay 20, 2026
11 checks passed
@nemanjabogdanovic
nemanjabogdanovic deleted the add_auth_to_state branch May 20, 2026 13:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@nemanjabogdanovic@bdebinska@iStefo@mpneuried
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add auth to State - #10

Merged
nemanjabogdanovic merged 4 commits into
mainfrom
add_auth_to_state
May 20, 2026
Merged

Add auth to State#10
nemanjabogdanovic merged 4 commits into
mainfrom
add_auth_to_state

Conversation

@nemanjabogdanovic

Copy link
Copy Markdown
Contributor

No description provided.

@nemanjabogdanovic
nemanjabogdanovic requested a review from a teamMay 18, 2026 12:44
@nemanjabogdanovicnemanjabogdanovic self-assigned this May 18, 2026
@nemanjabogdanovicnemanjabogdanovic added the enhancement New feature or request label May 18, 2026

@bdebinskabdebinska left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

Comment threadlib/actions/http.ex
max_retries: max_retries,
decode_body: decode_body
)
|> Req.update(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe use Req.merge?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, but it's older code and not super-relevant for this PR, so I'd prefer handling it separately if that's okay

@bdebinska

Copy link
Copy Markdown

Another comment from my side: This branch and PR should be linked to the ticket

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

@nemanjabogdanovicnemanjabogdanovic changed the title Add auth to StatePD-4147 Add auth to StateMay 18, 2026
@bdebinska

Copy link
Copy Markdown

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

Bad formulation on my side sorry. I meant more that it seems that having a separate "auth" action/step, instead of having it in the state directly seems more fitting to me.

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

Bad formulation on my side sorry. I meant more that it seems that having a separate "auth" action/step, instead of having it in the state directly seems more fitting to me.

Hm, maybe.. My line of thinking was always that the current workflows shouldn't be affected/touched, so I put everything on the services. We could discuss this other way as well

@iStefo

Copy link
Copy Markdown
Contributor

Hi all 👋

I'd like to throw a different suggestion into the ring: Make authentication a callback-based operation (optional of course). This brings flexibility while keeping complexity out of workflow engine.

While I haven't fully thought this through, I could image it looking like this:

defmoduleMyApp.WorkflowEnginedouseWorkflowEngine,defauthenticate(:http,target,auth_context)do{:ok,{:bearer,"foobar"}}enddefauthenticate(_action_type,_target,_auth_context),do: {:ok,nil}end

where :http is hardcoded based on the action type, target would depend on the action type (for HTTP it could be either the full URL or a {method, host, path} tuple) and auth_context is a struct with

%{state: %WorkflowEngine.State{},action: %{},# action JSON being executedworkflow: %{}# whole workflow JSON definition or identifier?}

Information about the acting entity would be placed into a new key in the workflow engine's state when calling execute. But then no token needs to be fetched or created if the workflow doesn't even ask for auth, while automatically centralizing authentication code for all workflow executions.

The return format would depend on the action type, for HTTP you could initially support {:ok, nil} or {:ok, {:bearer, "token"}} and then later also basic auth etc. when needed. Other actions might need different auth formats (SSH or API keys, client certificates...)

To make it easy to use, WorkflowEngine should add/generate a get_auth method that can be used by actions to fetch auth for the current action if the callback has been implemented by the hosting application.

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

Hi all 👋

I'd like to throw a different suggestion into the ring: Make authentication a callback-based operation (optional of course). This brings flexibility while keeping complexity out of workflow engine.

While I haven't fully thought this through, I could image it looking like this:
...

Heyy, thanks for the suggestion! I like the idea overall, I'll try and see if I can cook something up around it

@nemanjabogdanovicnemanjabogdanovic changed the title PD-4147 Add auth to StateAdd auth to StateMay 20, 2026

@bdebinskabdebinska left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code-wise looks good, but I'm still not convinced we should add this feature if we won't be meaningfully using it in the foreseeable future

@mpneuriedmpneuried left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code wise it looks good.
Only some small doc extensions would be nice.

I partially agree with BDE, on the other side we now put effort in it and it's covered by tests. So I'm fine with it.

Comment threadlib/auth.ex Outdated
Comment threadREADME.md Outdated
@nemanjabogdanovic
nemanjabogdanovic merged commit 3a21fbd into mainMay 20, 2026
11 checks passed
@nemanjabogdanovic
nemanjabogdanovic deleted the add_auth_to_state branch May 20, 2026 13:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@nemanjabogdanovic@bdebinska@iStefo@mpneuried
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add auth to State - #10

Merged
nemanjabogdanovic merged 4 commits into
mainfrom
add_auth_to_state
May 20, 2026
Merged

Add auth to State#10
nemanjabogdanovic merged 4 commits into
mainfrom
add_auth_to_state

Conversation

@nemanjabogdanovic

Copy link
Copy Markdown
Contributor

No description provided.

@nemanjabogdanovic
nemanjabogdanovic requested a review from a teamMay 18, 2026 12:44
@nemanjabogdanovicnemanjabogdanovic self-assigned this May 18, 2026
@nemanjabogdanovicnemanjabogdanovic added the enhancement New feature or request label May 18, 2026

@bdebinskabdebinska left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

Comment threadlib/actions/http.ex
max_retries: max_retries,
decode_body: decode_body
)
|> Req.update(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe use Req.merge?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, but it's older code and not super-relevant for this PR, so I'd prefer handling it separately if that's okay

@bdebinska

Copy link
Copy Markdown

Another comment from my side: This branch and PR should be linked to the ticket

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

@nemanjabogdanovicnemanjabogdanovic changed the title Add auth to StatePD-4147 Add auth to StateMay 18, 2026
@bdebinska

Copy link
Copy Markdown

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

Bad formulation on my side sorry. I meant more that it seems that having a separate "auth" action/step, instead of having it in the state directly seems more fitting to me.

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

Bad formulation on my side sorry. I meant more that it seems that having a separate "auth" action/step, instead of having it in the state directly seems more fitting to me.

Hm, maybe.. My line of thinking was always that the current workflows shouldn't be affected/touched, so I put everything on the services. We could discuss this other way as well

@iStefo

Copy link
Copy Markdown
Contributor

Hi all 👋

I'd like to throw a different suggestion into the ring: Make authentication a callback-based operation (optional of course). This brings flexibility while keeping complexity out of workflow engine.

While I haven't fully thought this through, I could image it looking like this:

defmoduleMyApp.WorkflowEnginedouseWorkflowEngine,defauthenticate(:http,target,auth_context)do{:ok,{:bearer,"foobar"}}enddefauthenticate(_action_type,_target,_auth_context),do: {:ok,nil}end

where :http is hardcoded based on the action type, target would depend on the action type (for HTTP it could be either the full URL or a {method, host, path} tuple) and auth_context is a struct with

%{state: %WorkflowEngine.State{},action: %{},# action JSON being executedworkflow: %{}# whole workflow JSON definition or identifier?}

Information about the acting entity would be placed into a new key in the workflow engine's state when calling execute. But then no token needs to be fetched or created if the workflow doesn't even ask for auth, while automatically centralizing authentication code for all workflow executions.

The return format would depend on the action type, for HTTP you could initially support {:ok, nil} or {:ok, {:bearer, "token"}} and then later also basic auth etc. when needed. Other actions might need different auth formats (SSH or API keys, client certificates...)

To make it easy to use, WorkflowEngine should add/generate a get_auth method that can be used by actions to fetch auth for the current action if the callback has been implemented by the hosting application.

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

Hi all 👋

I'd like to throw a different suggestion into the ring: Make authentication a callback-based operation (optional of course). This brings flexibility while keeping complexity out of workflow engine.

While I haven't fully thought this through, I could image it looking like this:
...

Heyy, thanks for the suggestion! I like the idea overall, I'll try and see if I can cook something up around it

@nemanjabogdanovicnemanjabogdanovic changed the title PD-4147 Add auth to StateAdd auth to StateMay 20, 2026

@bdebinskabdebinska left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code-wise looks good, but I'm still not convinced we should add this feature if we won't be meaningfully using it in the foreseeable future

@mpneuriedmpneuried left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code wise it looks good.
Only some small doc extensions would be nice.

I partially agree with BDE, on the other side we now put effort in it and it's covered by tests. So I'm fine with it.

Comment threadlib/auth.ex Outdated
Comment threadREADME.md Outdated
@nemanjabogdanovic
nemanjabogdanovic merged commit 3a21fbd into mainMay 20, 2026
11 checks passed
@nemanjabogdanovic
nemanjabogdanovic deleted the add_auth_to_state branch May 20, 2026 13:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@nemanjabogdanovic@bdebinska@iStefo@mpneuried
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add auth to State - #10

Merged
nemanjabogdanovic merged 4 commits into
mainfrom
add_auth_to_state
May 20, 2026
Merged

Add auth to State#10
nemanjabogdanovic merged 4 commits into
mainfrom
add_auth_to_state

Conversation

@nemanjabogdanovic

Copy link
Copy Markdown
Contributor

No description provided.

@nemanjabogdanovic
nemanjabogdanovic requested a review from a teamMay 18, 2026 12:44
@nemanjabogdanovicnemanjabogdanovic self-assigned this May 18, 2026
@nemanjabogdanovicnemanjabogdanovic added the enhancement New feature or request label May 18, 2026

@bdebinskabdebinska left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

Comment threadlib/actions/http.ex
max_retries: max_retries,
decode_body: decode_body
)
|> Req.update(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe use Req.merge?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, but it's older code and not super-relevant for this PR, so I'd prefer handling it separately if that's okay

@bdebinska

Copy link
Copy Markdown

Another comment from my side: This branch and PR should be linked to the ticket

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

@nemanjabogdanovicnemanjabogdanovic changed the title Add auth to StatePD-4147 Add auth to StateMay 18, 2026
@bdebinska

Copy link
Copy Markdown

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

Bad formulation on my side sorry. I meant more that it seems that having a separate "auth" action/step, instead of having it in the state directly seems more fitting to me.

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

Bad formulation on my side sorry. I meant more that it seems that having a separate "auth" action/step, instead of having it in the state directly seems more fitting to me.

Hm, maybe.. My line of thinking was always that the current workflows shouldn't be affected/touched, so I put everything on the services. We could discuss this other way as well

@iStefo

Copy link
Copy Markdown
Contributor

Hi all 👋

I'd like to throw a different suggestion into the ring: Make authentication a callback-based operation (optional of course). This brings flexibility while keeping complexity out of workflow engine.

While I haven't fully thought this through, I could image it looking like this:

defmoduleMyApp.WorkflowEnginedouseWorkflowEngine,defauthenticate(:http,target,auth_context)do{:ok,{:bearer,"foobar"}}enddefauthenticate(_action_type,_target,_auth_context),do: {:ok,nil}end

where :http is hardcoded based on the action type, target would depend on the action type (for HTTP it could be either the full URL or a {method, host, path} tuple) and auth_context is a struct with

%{state: %WorkflowEngine.State{},action: %{},# action JSON being executedworkflow: %{}# whole workflow JSON definition or identifier?}

Information about the acting entity would be placed into a new key in the workflow engine's state when calling execute. But then no token needs to be fetched or created if the workflow doesn't even ask for auth, while automatically centralizing authentication code for all workflow executions.

The return format would depend on the action type, for HTTP you could initially support {:ok, nil} or {:ok, {:bearer, "token"}} and then later also basic auth etc. when needed. Other actions might need different auth formats (SSH or API keys, client certificates...)

To make it easy to use, WorkflowEngine should add/generate a get_auth method that can be used by actions to fetch auth for the current action if the callback has been implemented by the hosting application.

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

Hi all 👋

I'd like to throw a different suggestion into the ring: Make authentication a callback-based operation (optional of course). This brings flexibility while keeping complexity out of workflow engine.

While I haven't fully thought this through, I could image it looking like this:
...

Heyy, thanks for the suggestion! I like the idea overall, I'll try and see if I can cook something up around it

@nemanjabogdanovicnemanjabogdanovic changed the title PD-4147 Add auth to StateAdd auth to StateMay 20, 2026

@bdebinskabdebinska left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code-wise looks good, but I'm still not convinced we should add this feature if we won't be meaningfully using it in the foreseeable future

@mpneuriedmpneuried left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code wise it looks good.
Only some small doc extensions would be nice.

I partially agree with BDE, on the other side we now put effort in it and it's covered by tests. So I'm fine with it.

Comment threadlib/auth.ex Outdated
Comment threadREADME.md Outdated
@nemanjabogdanovic
nemanjabogdanovic merged commit 3a21fbd into mainMay 20, 2026
11 checks passed
@nemanjabogdanovic
nemanjabogdanovic deleted the add_auth_to_state branch May 20, 2026 13:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@nemanjabogdanovic@bdebinska@iStefo@mpneuried
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add auth to State - #10

Merged
nemanjabogdanovic merged 4 commits into
mainfrom
add_auth_to_state
May 20, 2026
Merged

Add auth to State#10
nemanjabogdanovic merged 4 commits into
mainfrom
add_auth_to_state

Conversation

@nemanjabogdanovic

Copy link
Copy Markdown
Contributor

No description provided.

@nemanjabogdanovic
nemanjabogdanovic requested a review from a teamMay 18, 2026 12:44
@nemanjabogdanovicnemanjabogdanovic self-assigned this May 18, 2026
@nemanjabogdanovicnemanjabogdanovic added the enhancement New feature or request label May 18, 2026

@bdebinskabdebinska left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

Comment threadlib/actions/http.ex
max_retries: max_retries,
decode_body: decode_body
)
|> Req.update(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe use Req.merge?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, but it's older code and not super-relevant for this PR, so I'd prefer handling it separately if that's okay

@bdebinska

Copy link
Copy Markdown

Another comment from my side: This branch and PR should be linked to the ticket

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

@nemanjabogdanovicnemanjabogdanovic changed the title Add auth to StatePD-4147 Add auth to StateMay 18, 2026
@bdebinska

Copy link
Copy Markdown

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

Bad formulation on my side sorry. I meant more that it seems that having a separate "auth" action/step, instead of having it in the state directly seems more fitting to me.

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

I'm not entirely convinced this is necessary. Why does "auth" have to be a top level key? Can't it be part of the action itself?

It's so that the services themselves (e.g. Batch Service) can generate and set the auth key outside a single action/step (a step shouldn't be involved in the auth of the calling services).

Bad formulation on my side sorry. I meant more that it seems that having a separate "auth" action/step, instead of having it in the state directly seems more fitting to me.

Hm, maybe.. My line of thinking was always that the current workflows shouldn't be affected/touched, so I put everything on the services. We could discuss this other way as well

@iStefo

Copy link
Copy Markdown
Contributor

Hi all 👋

I'd like to throw a different suggestion into the ring: Make authentication a callback-based operation (optional of course). This brings flexibility while keeping complexity out of workflow engine.

While I haven't fully thought this through, I could image it looking like this:

defmoduleMyApp.WorkflowEnginedouseWorkflowEngine,defauthenticate(:http,target,auth_context)do{:ok,{:bearer,"foobar"}}enddefauthenticate(_action_type,_target,_auth_context),do: {:ok,nil}end

where :http is hardcoded based on the action type, target would depend on the action type (for HTTP it could be either the full URL or a {method, host, path} tuple) and auth_context is a struct with

%{state: %WorkflowEngine.State{},action: %{},# action JSON being executedworkflow: %{}# whole workflow JSON definition or identifier?}

Information about the acting entity would be placed into a new key in the workflow engine's state when calling execute. But then no token needs to be fetched or created if the workflow doesn't even ask for auth, while automatically centralizing authentication code for all workflow executions.

The return format would depend on the action type, for HTTP you could initially support {:ok, nil} or {:ok, {:bearer, "token"}} and then later also basic auth etc. when needed. Other actions might need different auth formats (SSH or API keys, client certificates...)

To make it easy to use, WorkflowEngine should add/generate a get_auth method that can be used by actions to fetch auth for the current action if the callback has been implemented by the hosting application.

@nemanjabogdanovic

Copy link
Copy Markdown
ContributorAuthor

Hi all 👋

I'd like to throw a different suggestion into the ring: Make authentication a callback-based operation (optional of course). This brings flexibility while keeping complexity out of workflow engine.

While I haven't fully thought this through, I could image it looking like this:
...

Heyy, thanks for the suggestion! I like the idea overall, I'll try and see if I can cook something up around it

@nemanjabogdanovicnemanjabogdanovic changed the title PD-4147 Add auth to StateAdd auth to StateMay 20, 2026

@bdebinskabdebinska left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code-wise looks good, but I'm still not convinced we should add this feature if we won't be meaningfully using it in the foreseeable future

@mpneuriedmpneuried left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code wise it looks good.
Only some small doc extensions would be nice.

I partially agree with BDE, on the other side we now put effort in it and it's covered by tests. So I'm fine with it.

Comment threadlib/auth.ex Outdated
Comment threadREADME.md Outdated
@nemanjabogdanovic
nemanjabogdanovic merged commit 3a21fbd into mainMay 20, 2026
11 checks passed
@nemanjabogdanovic
nemanjabogdanovic deleted the add_auth_to_state branch May 20, 2026 13:22
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@nemanjabogdanovic@bdebinska@iStefo@mpneuried