<div dir="ltr"><div>Hi,</div><div>I've been following this discussion as I have a similar use case.</div><div>I have created a PR offering a new function t_reply_by_callid for the module tm to simplify this:</div><div>  <a href="https://github.com/OpenSIPS/opensips/pull/2937">https://github.com/OpenSIPS/opensips/pull/2937</a><br></div><div><br></div><div>Regards,</div><div>Takeshi</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Oct 20, 2022 at 4:04 PM Bogdan-Andrei Iancu <<a href="mailto:bogdan@opensips.org">bogdan@opensips.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
  
    
  
  <div>
    <font face="monospace">Ivan,<br>
      <br>
      Actually a simpler approach will be to use
      t_wait_for_new_branches() instead of that t_write function, it
      should do the same trick (postponing the deletion of the
      transaction), but without any side effects.<br>
      <br>
      Regards,<br>
    </font>
    <pre cols="72">Bogdan-Andrei Iancu

OpenSIPS Founder and Developer
  <a href="https://www.opensips-solutions.com" target="_blank">https://www.opensips-solutions.com</a>
OpenSIPS Bootcamp 5-16 Dec 2022, online
  <a href="https://www.opensips.org/training/OpenSIPS_eBootcamp_2022/" target="_blank">https://www.opensips.org/training/OpenSIPS_eBootcamp_2022/</a></pre>
    <div>On 10/19/22 10:21 AM, Ryzhik Ivan
      wrote:<br>
    </div>
    <blockquote type="cite">
      
      <div dir="ltr">Sorry, I mean no sleep, i mean async(
        sleep($var(wait_time)), after_sleep ); 
        <div>Regards, Ivan.</div>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">вт, 18 окт. 2022 г. в 14:42,
          Bogdan-Andrei Iancu <<a href="mailto:bogdan@opensips.org" target="_blank">bogdan@opensips.org</a>>:<br>
        </div>
        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
          <div> <font face="monospace">Hi,<br>
              <br>
              yes, call it before ending the REQUEST route. I'm 100% the
              transaction is not deleted before the end of the route.
              And try to use the unix sock flavor for the function, not
              the fifo one.<br>
              <br>
              DO NOT use the sleep, you will block your whole opensips.<br>
              <br>
              Regards, <br>
            </font>
            <pre cols="72">Bogdan-Andrei Iancu

OpenSIPS Founder and Developer
  <a href="https://www.opensips-solutions.com" target="_blank">https://www.opensips-solutions.com</a>
OpenSIPS Bootcamp 5-16 Dec 2022, online
  <a href="https://www.opensips.org/training/OpenSIPS_eBootcamp_2022/" target="_blank">https://www.opensips.org/training/OpenSIPS_eBootcamp_2022/</a></pre>
            <div>On 10/17/22 11:56 AM, Ryzhik Ivan wrote:<br>
            </div>
            <blockquote type="cite">
              <div dir="ltr">Hi, did you mean that i must call
                t_write_req once before <span style="color:rgb(0,0,0);font-family:Helvetica,Arial;font-size:12px;text-align:justify">REQUEST_ROUTE
                  is finished? In this case the transaction was removed.</span>
                <div><span style="font-family:Helvetica,Arial;font-size:12px;text-align:justify">"</span><span style="font-family:monospace">even if you do not
                    have to actually write anything to outer world -
                    just fake it.</span><span style="font-family:Helvetica,Arial;font-size:12px;text-align:justify">"
                    - i must use fifo and i must read data from it, in
                    else we got:<br>
                  </span>ERROR:tm:write_to_fifo: nobody listening on
                  [/tmp/moh.fifo] fifo for reading!<br>
                  ERROR:tm:t_write_req: write_to_fifo failed<br>
                </div>
                <div>And last question is may I use sleep(20) at the end
                  of route to keep transaction? or can i use
                  modparam("tm", "wt_timer", 20)?</div>
                <div>Regards, Ivan</div>
              </div>
              <br>
              <div class="gmail_quote">
                <div dir="ltr" class="gmail_attr">пн, 17 окт. 2022 г. в
                  09:38, Bogdan-Andrei Iancu <<a href="mailto:bogdan@opensips.org" target="_blank">bogdan@opensips.org</a>>:<br>
                </div>
                <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                  <div> <font face="monospace">Hi Ryzhik,<br>
                      <br>
                      Right, the transaction must be forced to stay
                      until you are done with a final reply.
                      Unfortunately there is no clear way to do this
                      from script (this may be subject of further small
                      improvements), but you can try taking advantage of
                      the `t_write_req` [1] for this purpose, even if
                      you do not have to actually write anything to
                      outer world - just fake it.<br>
                      <br>
                      <br>
                      [1] <a href="https://opensips.org/html/docs/modules/3.2.x/tm.html#func_t_write_req" target="_blank">https://opensips.org/html/docs/modules/3.2.x/tm.html#func_t_write_req</a><br>
                      <br>
                      Regards,<br>
                    </font>
                    <pre cols="72">Bogdan-Andrei Iancu

OpenSIPS Founder and Developer
  <a href="https://www.opensips-solutions.com" target="_blank">https://www.opensips-solutions.com</a>
OpenSIPS Summit 27-30 Sept 2022, Athens
  <a href="https://www.opensips.org/events/Summit-2022Athens/" target="_blank">https://www.opensips.org/events/Summit-2022Athens/</a></pre>
                    <div>On 10/13/22 2:45 PM, Ryzhik Ivan wrote:<br>
                    </div>
                    <blockquote type="cite">
                      <div dir="ltr">Hi.
                        <div>One more question.</div>
                        <div>Everything works fine except the
                          transaction was deleted after 15 sec after the
                          initial route was finished.</div>
                        <div>on INVITE i last do t_reply_with_body(183,
                          "Session progress", ...) and than exit;</div>
                        <div><br>
                        </div>
                        <div>on end route log :</div>
                        <div><br>
                        </div>
                        <div>2022-10-13T10:58:01.994598+00:00
                           DBG:tm:_reply_light: reply sent out.
                          buf=0x7f558a087d98: SIP/2.0 1...,
                          shmem=0x7f5549797470: SIP/2.0 1<br>
                          2022-10-13T10:58:01.994676+00:00
                           DBG:tm:_reply_light: finished<br>
                        </div>
                        <div><br>
                        </div>
                        <div>2022-10-13T10:58:01.995835+00:00
                           DBG:tm:do_t_cleanup: transaction
                          0x7f5549793b18 already updated! Skipping
                          update!<br>
                          2022-10-13T10:58:01.996020+00:00
                           DBG:tm:cleanup_uac_timers: RETR/FR timers
                          reset<br>
                          2022-10-13T10:58:01.996202+00:00  <b>DBG:tm:insert_timer_unsafe:
                            [2]: 0x7f5549793b98 (12)</b><br>
                          2022-10-13T10:58:01.996317+00:00 <b> DBG:tm:t_unref:
                            UNREF_UNSAFE: [0x7f5549793b18] after is 0</b><br>
                          2022-10-13T10:58:01.996488+00:00
                           DBG:core:destroy_avp_list: destroying list
                          (nil)<br>
                          2022-10-13T10:58:01.996673+00:00
                           DBG:core:receive_msg: cleaning up<br>
                          <br>
                          2022-10-13T10:58:07.651091+00:00<b>
                             DBG:tm:timer_routine: timer
                            routine:2,tl=0x7f5549793b98 next=(nil),
                            timeout=12</b><br>
                          2022-10-13T10:58:07.651332+00:00
                           DBG:tm:wait_handler: removing 0x7f5549793b18
                          from table<br>
                          2022-10-13T10:58:07.651425+00:00
                           DBG:tm:delete_ce<b>ll: delete transaction
                            0x7f5549793b18</b><br>
                          2022-10-13T10:58:07.651513+00:00
                           DBG:tm:wait_handler: done<br>
                          <br>
                        </div>
                        <div>Can you tell me how I can i fix this?
                          Transaction marked safe for deletion...</div>
                        <div>Regards, Ivan</div>
                      </div>
                      <br>
                      <div class="gmail_quote">
                        <div dir="ltr" class="gmail_attr">ср, 12 окт.
                          2022 г. в 13:11, Bogdan-Andrei Iancu <<a href="mailto:bogdan@opensips.org" target="_blank">bogdan@opensips.org</a>>:<br>
                        </div>
                        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                          <div> <font face="monospace">Perfect !!!</font><br>
                            <pre cols="72">Bogdan-Andrei Iancu

OpenSIPS Founder and Developer
  <a href="https://www.opensips-solutions.com" target="_blank">https://www.opensips-solutions.com</a>
OpenSIPS Summit 27-30 Sept 2022, Athens
  <a href="https://www.opensips.org/events/Summit-2022Athens/" target="_blank">https://www.opensips.org/events/Summit-2022Athens/</a></pre>
                            <div>On 10/12/22 1:09 PM, Ryzhik Ivan wrote:<br>
                            </div>
                            <blockquote type="cite">
                              <div dir="ltr">I found a solution. hex
                                strings are reversed).
                                <div>Thank you very much!</div>
                              </div>
                              <br>
                              <div class="gmail_quote">
                                <div dir="ltr" class="gmail_attr">ср, 12
                                  окт. 2022 г. в 12:59, Ryzhik Ivan <<a href="mailto:ryzhik.ivan@gmail.com" target="_blank">ryzhik.ivan@gmail.com</a>>:<br>
                                </div>
                                <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                                  <div dir="ltr">and one more research:
                                    $T_id returns hex encoded
                                    label.hashid
                                    <div>but my attempts failed:</div>
                                    <div>got $T_id = 6545e285.3fe4</div>
                                    <div>Send: {"jsonrpc": "2.0",
                                      "method": "t_reply", "id": 1,
                                      "params": {"code": "487",
                                      "reason": "Terminating",
                                      "trans_id": "16356:1699078789",
                                      "to_tag": "<null>"}}</div>
                                    <div>Got:
                                      b'{"jsonrpc":"2.0","error":{"code":404,"message":"Transaction
                                      not found"},"id":1}'<br>
                                      <br>
                                    </div>
                                  </div>
                                  <br>
                                  <div class="gmail_quote">
                                    <div dir="ltr" class="gmail_attr">ср,
                                      12 окт. 2022 г. в 11:13, Ryzhik
                                      Ivan <<a href="mailto:ryzhik.ivan@gmail.com" target="_blank">ryzhik.ivan@gmail.com</a>>:<br>
                                    </div>
                                    <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                                      <div dir="ltr">Thank you, Bogdan.
                                        <div>I got stuck with tm
                                          documentation. </div>
                                        <div>  1) MI t_reply command has
                                          named parameters, ok, no
                                          problem. </div>
                                        <div>  2) trans_id - transaction
                                          identifier (has the
                                          hash_entry:label format)  -
                                          what is this? if i use $T_id i
                                          got reply "Invalid trans_id".</div>
                                        <div>  3) Where can I get to_tag
                                          from script level on initial
                                          invite?</div>
                                        <div>      ...</div>
                                        <div>     
                                          t_reply_with_body(183,
                                          "Session progress",
                                          $(var(body){re.subst,$var(re)})
                                          );<br>
                                                avp_db_query("insert
                                          into moh (callid, timeout,
                                          tid,totag) values ('$ci',
                                          $var(wait_time), '$T_id',
                                          '??????')"); <br>
                                                ...</div>
                                        <div><br>
                                        </div>
                                        <div>Regards, Ivan.</div>
                                      </div>
                                      <br>
                                      <div class="gmail_quote">
                                        <div dir="ltr" class="gmail_attr">вт, 11 окт.
                                          2022 г. в 12:35, Bogdan-Andrei
                                          Iancu <<a href="mailto:bogdan@opensips.org" target="_blank">bogdan@opensips.org</a>>:<br>
                                        </div>
                                        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                                          <div> <font face="monospace">Hi
                                              Ivan,<br>
                                              <br>
                                              you can use timer_route,
                                              but as there is no way to
                                              send a reply for a
                                              particular transaction
                                              from script level (only to
                                              the currently processed
                                              request), you will have to
                                              trigger the MI cmds from
                                              the timer route, which is
                                              a bit hackish ....<br>
                                              <br>
                                              Regards,<br>
                                            </font>
                                            <pre cols="72">Bogdan-Andrei Iancu

OpenSIPS Founder and Developer
  <a href="https://www.opensips-solutions.com" target="_blank">https://www.opensips-solutions.com</a>
OpenSIPS Summit 27-30 Sept 2022, Athens
  <a href="https://www.opensips.org/events/Summit-2022Athens/" target="_blank">https://www.opensips.org/events/Summit-2022Athens/</a></pre>
                                            <div>On 10/11/22 11:47 AM,
                                              Ryzhik Ivan wrote:<br>
                                            </div>
                                            <blockquote type="cite">
                                              <div dir="ltr">Hi, Bogdan!
                                                <div>What d' you think,
                                                  can we use timer_route
                                                  instead of an external
                                                  script?</div>
                                                <div>Regards, Ivan.</div>
                                              </div>
                                              <br>
                                              <div class="gmail_quote">
                                                <div dir="ltr" class="gmail_attr">пн,
                                                  10 окт. 2022 г. в
                                                  17:04, Bogdan-Andrei
                                                  Iancu <<a href="mailto:bogdan@opensips.org" target="_blank">bogdan@opensips.org</a>>:<br>
                                                </div>
                                                <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
                                                  <div> <font face="monospace">Hi
                                                      Ryzhik,<br>
                                                      <br>
                                                      Without a
                                                      t_relay() it makes
                                                      not much sense to
                                                      have an dialog
                                                      structure at all -
                                                      the dialog module
                                                      in opensips is
                                                      actually design
                                                      for proxied calls,
                                                      not for UAC calls.<br>
                                                      <br>
                                                      IMO, you should
                                                      keep it a
                                                      transaction level,
                                                      by sending replies
                                                      back only. When
                                                      getting the
                                                      INVITE, put its
                                                      call-id into a DB
                                                      table (to keep
                                                      only the "active"
                                                      session) together
                                                      with a lifetime /
                                                      expiration time.
                                                      When getting a
                                                      CANCEL, update the
                                                      table (set
                                                      lifetime to 0), to
                                                      know it is
                                                      terminated. And
                                                      use an simple
                                                      external script
                                                      that keeps
                                                      scanning the DB
                                                      for (1) sending
                                                      487 Terminated via
                                                      MI if the record
                                                      has 0 lifetime or
                                                      (2) send a 408
                                                      Timeout via MI if
                                                      the lifetime
                                                      exceeded.<br>
                                                      In a similar way
                                                      you can handle the
                                                      BYE - send back
                                                      200OK for the BYE
                                                      and set 0 in
                                                      lifetime, to send
                                                      a 487 canceled
                                                      back <br>
                                                      <br>
                                                      Regards,<br>
                                                    </font>
                                                    <pre cols="72">Bogdan-Andrei Iancu

OpenSIPS Founder and Developer
  <a href="https://www.opensips-solutions.com" target="_blank">https://www.opensips-solutions.com</a>
OpenSIPS Summit 27-30 Sept 2022, Athens
  <a href="https://www.opensips.org/events/Summit-2022Athens/" target="_blank">https://www.opensips.org/events/Summit-2022Athens/</a></pre>
                                                    <div>On 10/10/22
                                                      4:33 PM, Ryzhik
                                                      Ivan wrote:<br>
                                                    </div>
                                                    <blockquote type="cite">
                                                      <div dir="ltr">Hello!
                                                        <div>My opensips
                                                          version is 3.1
                                                          with tm,dialog
                                                          and rtpengine
                                                          modules.</div>
                                                        <div>On incoming
                                                          INVITE i'm
                                                          creating an
                                                          early dialog
                                                          with 183
                                                          replies and
                                                          i'm playing
                                                          audio to
                                                          caller with
                                                          rtpengine, no
                                                          t_relay() on
                                                          this step, OS
                                                          is acting as
                                                          UAS endpoint.<br>
                                                          If the caller
                                                          cancels the
                                                          invite with a
                                                          CANCEL message
                                                          - all works
                                                          great.<br>
                                                          But some users
                                                          terminate
                                                          dialog with
                                                          BYE message.<br>
                                                          1) on BYE with
                                                          to-tag OS
                                                          can't find
                                                          dialog with
                                                          match_dialog(),
                                                          because to-tag
                                                          presents.<br>
                                                          2) if i use
                                                          load_dialog_ctx($ci)
                                                          -  it is
                                                          possible to
                                                          handle BYE.<br>
                                                          3) in early
                                                          dialog
                                                          termination
                                                          with BYE we
                                                          also need to
                                                          send final
                                                          response to
                                                          the INVITE
                                                          transaction. <br>
                                                          <br>
                                                          Maybe I did
                                                          something
                                                          wrong, but I
                                                          can't handle
                                                          the final
                                                          response to
                                                          INVITE in this
                                                          case.<br>
                                                        </div>
                                                      </div>
                                                      <br>
                                                      <fieldset></fieldset>
                                                      <pre>_______________________________________________
Users mailing list
<a href="mailto:Users@lists.opensips.org" target="_blank">Users@lists.opensips.org</a>
<a href="http://lists.opensips.org/cgi-bin/mailman/listinfo/users" target="_blank">http://lists.opensips.org/cgi-bin/mailman/listinfo/users</a>
</pre>
                                                    </blockquote>
                                                    <br>
                                                  </div>
                                                </blockquote>
                                              </div>
                                            </blockquote>
                                            <br>
                                          </div>
                                        </blockquote>
                                      </div>
                                    </blockquote>
                                  </div>
                                </blockquote>
                              </div>
                            </blockquote>
                            <br>
                          </div>
                        </blockquote>
                      </div>
                    </blockquote>
                    <br>
                  </div>
                </blockquote>
              </div>
            </blockquote>
            <br>
          </div>
        </blockquote>
      </div>
    </blockquote>
    <br>
  </div>

_______________________________________________<br>
Users mailing list<br>
<a href="mailto:Users@lists.opensips.org" target="_blank">Users@lists.opensips.org</a><br>
<a href="http://lists.opensips.org/cgi-bin/mailman/listinfo/users" rel="noreferrer" target="_blank">http://lists.opensips.org/cgi-bin/mailman/listinfo/users</a><br>
</blockquote></div></div>