# Helpers JavaScript server-side

## `decodeURI` <a href="#getalleventdata" id="getalleventdata"></a>

Décode tous les caractères encodés dans l’URI fourni. Renvoie un **string** qui représente l’URI décodé. Renvoie `undefined` lorsqu’il est fourni avec une entrée invalide.

**Syntaxe**

```javascript
decodeUri(encoded_uri);
```

**Exemple**

```javascript
const decodeUri = require('decodeUri');

const decodedUrl = decodeUri(data.encodedUrl);
if (decodedUrl) {
  // ...
}
```

| Paramètre         | Type     | Description                                                                                                                                           |
| ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`encoded_uri`** | *string* | Un URI qui a été encodé par [`encodeUri()`](https://developers.google.com/tag-platform/tag-manager/server-side/api#encodeuri) ou par d’autres moyens. |

## `decodeUriComponent` <a href="#decodeuricomponent" id="decodeuricomponent"></a>

Décode tous les caractères encodés dans le composant URI fourni. Renvoie un **string** qui représente le composant URI décodé. Renvoie `undefined` si l’entrée est invalide.

**Syntaxe**

```javascript
decodeUriComponent(encoded_uri_component);
```

**Exemple**

```javascript
const decodeUriComponent = require('decodeUriComponent');

const decodedQuery = decodeUriComponent(data.query);
if (decodedQuery) {
  // ...
}
```

| Paramètre                   | Type     | Description                                                                                                                                                                       |
| --------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`encoded_uri_component`** | *string* | Un composant URI qui a été encodé par [`encodeUriComponent()`](https://developers.google.com/tag-platform/tag-manager/server-side/api#encodeuricomponent) ou par d’autres moyens. |

## `encodeUri` <a href="#getalleventdata" id="getalleventdata"></a>

Renvoie un Uniform Resource Identifier (URI) encodé en échappant les caractères spéciaux. Renvoie un **string** qui représente la chaîne fournie encodée en tant qu’URI.

**Syntaxe**

```javascript
encodeUri(uri);
```

**Exemple**

```javascript
const encodeUri = require('encodeUri');
const sendHttpGet = require('sendHttpGet');

sendHttpGet('https://www.example.com/' + encodeUri(pathInput));
```

| Paramètre | Type     | Description     |
| --------- | -------- | --------------- |
| `uri`     | *string* | Un URI complet. |

## `encodeUriComponent` <a href="#encodeuricomponent" id="encodeuricomponent"></a>

Renvoie un Uniform Resource Identifier (URI) encodé en échappant les caractères spéciaux. Renvoie un **string** qui représente la chaîne fournie encodée en tant qu’URI.

**Syntaxe**

```javascript
encodeUriComponent(str);
```

**Exemple**

```javascript
const encodeUriComponent = require('encodeUriComponent');
const sendHttpGet = require('sendHttpGet');

sendHttpGet('https://www.example.com/?' + encodeUriComponent(queryInput));
```

| Paramètre | Type     | Description            |
| --------- | -------- | ---------------------- |
| **`str`** | *string* | Un composant d’un URI. |

## `fromBase64` <a href="#frombase64" id="frombase64"></a>

Décode une chaîne encodée en base64. Renvoie `undefined` si l’entrée est invalide.

**Syntaxe**

```javascript
fromBase64(base64EncodedString);
```

**Exemple**

```javascript
const fromBase64 = require('fromBase64');

const greeting = fromBase64('aGVsbG8=');
if (greeting === 'hello') {
  // ...
}
```

| Paramètre                 | Type     | Description               |
| ------------------------- | -------- | ------------------------- |
| **`base64EncodedString`** | *string* | Chaîne encodée en base64. |

## `generateRandom` <a href="#generaterandom" id="generaterandom"></a>

Renvoie un **number** aléatoire (entier) dans la plage donnée.

**Syntaxe**

```javascript
generateRandom(min, max);
```

**Exemple**

```javascript
const generateRandom = require('generateRandom');

const randomValue = generateRandom(0, 10000000);
```

| Paramètre | Type     | Description                                             |
| --------- | -------- | ------------------------------------------------------- |
| **`min`** | *number* | Valeur minimale possible de l’entier renvoyé (incluse). |
| **`max`** | *number* | Valeur maximale possible de l’entier renvoyé (incluse). |

## `getAllEventData` <a href="#getalleventdata" id="getalleventdata"></a>

Renvoie une copie des données de l’événement.

**Syntaxe**

```javascript
getAllEventData();
```

**Exemple d’utilisation**

```javascript
const getAllEventData= require('getAllEventData');
const eventModel = getAllEventData();
// construire le corps de la requête à partir des propriétés de l’événement 
const body = {
    crm_id:eventModel.user.id,
    currency:eventModel.currency
};
```

{% hint style="info" %}
Notez que les données de l’événement peuvent contenir davantage de propriétés que celles envoyées initialement en raison des propriétés système ajoutées automatiquement sur [web events](/fr/developers/tracking-and-integrations/tracking/about-events/js-sdk-event-specificity.md) et [app sdk events](/fr/developers/tracking-and-integrations/tracking/about-events/mobile-sdk-event-specificity.md#event-specificity-for-mobile-app).
{% endhint %}

**Exemple de données :**

Si vous envoyez cet événement web :

```javascript
cact('trigger', 'search', {
  "search_term": "blue t-shirt",
  "user": {
    "id": "12345",
    "email": "anakin.skywalker@domain.com",
    "consent_categories": ["1","3"]
  }
);
```

Alors la fonction getAllEventData() renverra cet objet :

```json
{
   "event_name": "search",
   "search_term": "blue t-shirt",
   "user": {
      "id": "12345",
      "email": "anakin.skywalker@domain.com",
      "consent_categories": ["1","3"]
   },
   "url": "https://www.mywebsite.com/path1/path2/", //Ajouté automatiquement si manquant
   "path": "/path1/path2/", //Ajouté automatiquement
   "referrer": "https:///www.google.fr", //Ajouté automatiquement
   "title": "Titre de ma page", //Ajouté automatiquement si manquant
   "context": {
      "event_id": "202110130000000000", //Ajouté automatiquement
      "generatorVersion": "10.0", //Ajouté automatiquement
      "containerVersion": "3.1", //Ajouté automatiquement
      "event_timestamp": "1639044446636", //Ajouté automatiquement
      "page": { //Ajouté automatiquement
         "title": "Page de recherche", //Ajouté automatiquement
         "url": "https://shop.com/search?q=...", //Ajouté automatiquement
         "lang": "en", //Ajouté automatiquement
         "referrer": "https:///www.google.fr", //Ajouté automatiquement
         "viewport": { //Ajouté automatiquement
            "width": 320, //Ajouté automatiquement
            "height": 568 //Ajouté automatiquement
         }
      },
      "device": { //Ajouté automatiquement
         "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36",//Ajouté automatiquement
         "ip": "102.3.4.56",//Automatiquement copié depuis l'en-tête de la requête
         "lang": "fr",//Ajouté automatiquement
         "cookie": "_fbp=123; _fbc=456; _ga=789",//Ajouté automatiquement
         "timezone": "Europe/Paris"//Ajouté automatiquement
      }
   }
}
```

## `getCookieValues` <a href="#getcookievalues" id="getcookievalues"></a>

Renvoie un tableau contenant les valeurs de tous les cookies portant le nom donné.

**Syntaxe**

```
getCookieValues(name[, noDecode]);
```

**Exemple**

```javascript
const getCookieValues = require('getCookieValues');
const facebook_fbp = getCookieValues('fbp')[0];
if (facebook_fbp ) {  // ...}
```

***

**Paramètres**

| Paramètre      | Type      | Description                                                                                                       |
| -------------- | --------- | ----------------------------------------------------------------------------------------------------------------- |
| **`name`**     | *string*  | Nom du cookie.                                                                                                    |
| **`noDecode`** | *booléen* | Si `true`, les valeurs du cookie ne seront pas décodées avant d’être renvoyées. La valeur par défaut est `false`. |

## `getEventData` <a href="#geteventdata" id="geteventdata"></a>

Renvoie une copie de la valeur au chemin donné dans les données de l’événement. Renvoie `undefined` s’il n’y a pas de données d’événement ou s’il n’y a aucune valeur au chemin donné.

**Syntaxe**

```
getEventData(keyPath);
```

**Exemple**

```javascript
const getEventData = require('getEventData');

const campaignId = getEventData('campaign.id');
const itemId = getEventData('items.0.id');
const referrer = getEventData('page_referrer');
```

**Paramètres**

| Paramètre     | Type | Description                                                                                                                                                                                                                              |
| ------------- | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`keyPath`** | *de* | Le chemin de la clé, où les composants du chemin sont séparés par des points. Les composants du chemin peuvent être des clés dans un objet ou des indices dans un tableau. Si `keyPath` n’est pas une chaîne, il est converti en chaîne. |

## `getRemoteAddress` <a href="#getremoteaddress" id="getremoteaddress"></a>

Renvoie une **string** représentation de l’adresse IP à l’origine de la requête, par ex. `62.123.65.780` pour IPv4 ou `2001:0db8:85a3:0:0:8a2e:0370:1234` pour IPv6

**Syntaxe**

```
getRemoteAddress();
```

## `getTimestamp` <a href="#gettimestamp" id="gettimestamp"></a>

**Obsolète.** Préférez [getTimestampMillis](https://developers.google.com/tag-platform/tag-manager/server-side/api#gettimestampmillis).

Renvoie une **number** qui représente l’heure actuelle en millisecondes depuis l’époque Unix, comme renvoyé par `Date.now()`.

**Syntaxe**

```
getTimestamp();
```

## `getTimestampMillis` <a href="#gettimestampmillis" id="gettimestampmillis"></a>

Renvoie une **number** qui représente l’heure actuelle en millisecondes depuis l’époque Unix, comme renvoyé par `Date.now()`.

**Syntaxe**

```
getTimestampMillis();
```

## `getType` <a href="#gettype" id="gettype"></a>

Renvoie une chaîne décrivant le type de la valeur donnée.

| Type d’entrée | Valeur renvoyée |
| ------------- | --------------- |
| *string*      | 'string'        |
| *number*      | 'number'        |
| *booléen*     | 'boolean'       |
| *null*        | 'null'          |
| *undefined*   | 'undefined'     |
| *Array*       | 'array'         |
| *Object*      | 'object'        |
| *Function*    | 'function'      |

**Syntaxe**

```
getType(value);
```

**Exemple**

```javascript
const getType = require('getType');

const type = getType(value);
if (type === 'string') {
  // Gérer l’entrée de type chaîne.
} else if (type === 'number') {
  // Gérer l’entrée numérique.
} else {
  logToConsole('Type d’entrée non pris en charge : ', type);
}
```

**Paramètres**

| Paramètre   | Type | Description      |
| ----------- | ---- | ---------------- |
| **`value`** | *de* | Valeur d’entrée. |

## `logToConsole` <a href="#logtoconsole" id="logtoconsole"></a>

Consigne ses arguments dans la console.

Ces journaux sont visibles dans la console de Destination Builder.

**Exemple**

```
const logToConsole = require('logToConsole');

const product_color= "red";
const product_price= 10;
logToConsole('color is: ', product_color, ' and price is: ', product_price);
```

**Syntaxe**

```
logToConsole(argument1[, argument2, ...]);
```

**Paramètres**

La fonction prend un ou plusieurs arguments, chacun étant converti en chaîne si nécessaire, puis consigné dans la console.

## `makeInteger` <a href="#makeinteger" id="makeinteger"></a>

Convertit la valeur donnée en un **number** (entier).

**Syntaxe**

```
makeInteger(value);
```

**Paramètres**

| Paramètre   | Type       | Description            |
| ----------- | ---------- | ---------------------- |
| **`value`** | *any type* | La valeur à convertir. |

## `makeNumber` <a href="#makenumber" id="makenumber"></a>

Convertit la valeur donnée en un **number**.

**Syntaxe**

```
makeNumber(value);
```

**Paramètres**

| Paramètre   | Type       | Description            |
| ----------- | ---------- | ---------------------- |
| **`value`** | *any type* | La valeur à convertir. |

## `makeString` <a href="#makestring" id="makestring"></a>

Renvoie la valeur donnée sous forme de **string**.

**Syntaxe**

```
makeString(value);
```

**Paramètres**

| Paramètre   | Type       | Description            |
| ----------- | ---------- | ---------------------- |
| **`value`** | *any type* | La valeur à convertir. |

## `parseUrl` <a href="#parseurl" id="parseurl"></a>

Renvoie un objet contenant toutes les parties d’un URL donné, similaire à la `URL` object.

Cette API renverra `undefined` pour tout URL mal formé. Pour les URL correctement formatés, les champs absents de la chaîne d’URL auront la valeur d’une chaîne vide, ou dans le cas de `searchParams`, un objet vide.

L’objet renvoyé aura les champs suivants :

```
{  
    href: string,  
    origin: string, 
    protocol: string,  
    username: string,  
    password: string,  
    host: string,  
    hostname: string,  
    port: string,  
    pathname: string,  
    search: string,  
    searchParams: Object<string, (string|Array)>,  
    hash: string,
}
```

**Syntaxe**

```
parseUrl(url);
```

**Exemple**

```
const parseUrl = require('parseUrl');const urlObject = parseUrl('https://abc:xyz@example.com:8080/foo?param=val%2Cue#bar');
```

**Paramètres**

| Paramètre | Type     | Description                     |
| --------- | -------- | ------------------------------- |
| **`url`** | *string* | L’URL complet qui sera analysé. |

## `sha256` <a href="#sha256" id="sha256"></a>

Calcule le digest SHA-256 de l’entrée et appelle un callback avec le digest encodé en base64, sauf si l’ `options` objet spécifie un autre encodage de sortie.

Cette signature et ce comportement de l’API correspondent à l’ [`sha256`](https://developers.google.com/tag-platform/tag-manager/templates/api#sha256) API pour les conteneurs web ; toutefois, les modèles personnalisés dans les conteneurs serveur doivent utiliser l’ [`sha256Sync`](https://developers.google.com/tag-platform/tag-manager/server-side/api#sha256sync) API pour un code plus simple.

**Syntaxe**

```
sha256(input, onSuccess, options = undefined);
```

**Exemple**

```
const encodeUriComponent = require('encodeUriComponent');const sendHttpGet = require('sendHttpGet');const sha256 = require('sha256');sha256('inputString', (digest) => {  sendHttpGet('https://example.com/collect?id=' + encodeUriComponent(digest));});sha256('inputString', (digest) => {  sendHttpGet('https://example.com/collect?id=' + encodeUriComponent(digest));}, {outputEncoding: 'hex'});
```

**Paramètres**

| Paramètre       | Type       | Description                                                                                                                                                                                |
| --------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **`input`**     | *string*   | La chaîne à hacher.                                                                                                                                                                        |
| **`onSuccess`** | *function* | Appelé avec le digest résultant, encodé en base64, sauf si l’ `options` objet spécifie un autre encodage de sortie.                                                                        |
| **`options`**   | *object*   | *Optionnel* objet options pour spécifier l’encodage de sortie. Si indiqué, l’objet doit contenir la clé `outputEncoding` avec pour valeur l’une des options suivantes : `base64` ou `hex`. |

## `sha256Sync` <a href="#sha256sync" id="sha256sync"></a>

Calcule et renvoie le digest SHA-256 de l’entrée, encodé en base64, sauf si l’ `options` objet spécifie un autre encodage de sortie.

**Syntaxe**

```
sha256Sync(input, options = undefined);
```

**Exemple**

```
const encodeUriComponent = require('encodeUriComponent');const sendHttpGet = require('sendHttpGet');const sha256Sync = require('sha256Sync');const digestBase64 = sha256Sync('inputString');const digestHex = sha256Sync('inputString', {outputEncoding: 'hex'});sendHttpGet('https://example.com/collect?id=' + encodeUriComponent(digestBase64));sendHttpGet('https://example.com/collect?id=' + encodeUriComponent(digestHex));
```

**Paramètres**

| Paramètre     | Type     | Description                                                                                                                                                                                |
| ------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **`input`**   | *string* | La chaîne à hacher.                                                                                                                                                                        |
| **`options`** | *object* | *Optionnel* objet options pour spécifier l’encodage de sortie. Si indiqué, l’objet doit contenir la clé `outputEncoding` avec pour valeur l’une des options suivantes : `base64` ou `hex`. |

## `signHmac` <a href="#signhmac" id="signhmac"></a>

Génère une signature HMAC pour le payload donné, en utilisant `sha256` et `base64` l’encodage par défaut, sauf si l’ `options` objet spécifie autre chose. Les objets passés en tant que payload sont automatiquement `JSON.stringify`'d. Renvoie un **string**.

**Syntaxe**

```javascript
signHmac(payload, secret, options = undefined);
```

**Exemple**

```javascript
const signHmac = require('signHmac');

// Signer une chaîne avec les options par défaut (sha256 + base64)
const signature = signHmac('my payload', 'mySecretKey');

// Signer avec un algorithme et un encodage personnalisés
const signatureHex = signHmac('my payload', 'mySecretKey', { alg: 'sha1', outputEncoding: 'hex' });

// Signer un objet (automatiquement JSON.stringify'd)
const objectSignature = signHmac({ key: 'value' }, 'mySecretKey');
```

**Paramètres**

| Paramètre     | Type             | Description                                                                                                                 |
| ------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------- |
| **`payload`** | *string\|object* | Les données à signer. Les objets sont automatiquement convertis en chaînes JSON.                                            |
| **`secret`**  | *string*         | La clé secrète utilisée pour la génération du HMAC.                                                                         |
| **`options`** | *object*         | *Optionnel* objet options pour personnaliser l’algorithme et l’encodage de sortie. Voir les détails des options ci-dessous. |

**Options**

| Property             | Type     | Default    | Description                                                                                                                                          |
| -------------------- | -------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`alg`**            | *string* | `'sha256'` | L’algorithme de hachage. Valeurs prises en charge : `'sha256'`, `'sha1'`, `'sha512'`, `'sha384'`, `'md5'` et d’autres algorithmes de digest OpenSSL. |
| **`outputEncoding`** | *string* | `'base64'` | L’encodage de sortie. Valeurs prises en charge : `'base64'`, `'base64url'`, `'hex'`, `'binary'` (`latin1`).                                          |

## `toBase64` <a href="#tobase64" id="tobase64"></a>

Encode une chaîne en base64.

**Syntaxe**

```
toBase64(input);
```

**Exemple**

```
const toBase64 = require('toBase64');const base64Hello = toBase64('hello');
```

**Paramètres**

| Paramètre   | Type     | Description       |
| ----------- | -------- | ----------------- |
| **`input`** | *string* | Chaîne à encoder. |

## `JSON` <a href="#json" id="json"></a>

Renvoie un objet qui fournit des fonctions JSON.

La `parse()` La fonction analyse une chaîne JSON pour construire la valeur ou l’objet décrit par la chaîne. Si la valeur ne peut pas être analysée (JSON mal formé), la fonction renverra `undefined`. Si la valeur d’entrée n’est pas une chaîne, l’entrée sera convertie en chaîne.

La `stringify()` la fonction convertit l’entrée en chaîne JSON. Si la valeur ne peut pas être analysée (par ex. l’objet a un cycle), la méthode renverra `undefined`.

**Syntaxe**

```
JSON.parse(yourString);
JSON.stringify(yourObject);
```

**Exemple**

```
const JSON = require('JSON');
// La chaîne d’entrée JSON est convertie en objet.
const object = JSON.parse('{"foo":"bar"}');
// L’objet d’entrée est converti en chaîne JSON.
const str = JSON.stringify({foo: 'bar'});
```

***

## `Math` <a href="#math" id="math"></a>

Un objet fournissant `Math` fonctions.

**Syntaxe**

```
const Math = require('Math');
// Récupérer la valeur absolue.
const absolute = Math.abs(-5);
// Arrondir l’entrée à l’inférieur à l’entier le plus proche.
const roundedDown = Math.floor(4.6);
// Arrondir l’entrée à l’entier supérieur le plus proche.
const roundedUp = Math.ceil(2.1);
// Arrondir l’entrée à l’entier le plus proche.
const rounded = Math.round(4.2);
// Renvoyer le plus grand argument.
const biggest = Math.max(1, 4);
// Renvoyer le plus petit argument.
const smallest = Math.min(4, 5);
// Renvoyer le premier argument élevé à la puissance du deuxième argument.
const powerful = Math.pow(4, 2);
// Renvoyer la racine carrée de l’argument.
const unsquared = Math.sqrt(81);
```

**Paramètres**

Les paramètres des fonctions Math sont convertis en nombres.

## `sendHttpGet` <a href="#sendhttpget" id="sendhttpget"></a>

Effectue une requête HTTP GET vers l’URL spécifiée et appelle un callback avec la réponse une fois que la requête se termine ou expire.

**Syntaxe**

```javascript
sendHttpGet(url[, callback[, options]]);
```

**Exemple**

```javascript
const sendHttpGet = require('sendHttpGet');
// Envoie une requête GET et désigne la réponse// selon la réponse du GET 
sendHttpGet('https://example.com/collect', function(statusCode, headers, body) {
    if (statusCode != 200) {yourCallbackFunction();}
}, {
    headers: {key: 'value'},
    timeout: 500
});
```

**Paramètres**

| Paramètre      | Type       | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| -------------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`url`**      | *string*   | L’URL de la requête.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| **`callback`** | *function* | <p>Un callback facultatif à invoquer à la fin de la requête, en cas d’erreur ou de délai d’attente.<br><br>Il est invoqué avec le <strong>code de statut de la réponse</strong>, le <strong>en-têtes de réponse</strong>, et le <strong>corps de la réponse</strong> (ou undefined s’il n’y avait pas de corps de réponse).<br>Si la requête a échoué (par ex. URL invalide, aucune route vers l’hôte, échec de négociation SSL, etc.), le callback sera invoqué avec un <strong>code de statut de réponse de zéro</strong>, <strong>aucun en-tête</strong>, et un <strong>corps undefined</strong>.<br>Si l’ <code>'timeout'</code> option était définie et que la requête a expiré, le callback sera invoqué avec un <strong>code de statut de réponse de -1</strong>, <strong>aucun en-tête</strong>, et un <strong>corps undefined</strong>.</p> |
| **`options`**  | *object*   | Options de requête facultatives. Les options prises en charge sont **headers**, **timeout**. Des options avancées peuvent être ajoutées dans **extraOptions**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |

#### **Options**

* **headers**: En-têtes supplémentaires de requête représentés sous forme d’objet.
* **timeout**: Le délai d’attente, en millisecondes, avant l’abandon de la requête.
* **extraOptions**: Options avancées (ex. : {strictSSL:true})

## `sendHttpRequest` <a href="#sendhttprequest" id="sendhttprequest"></a>

Effectue une requête HTTP vers l’URL spécifiée et appelle un callback avec la réponse une fois que la requête se termine ou expire.

**Syntaxe**

```
sendHttpRequest(url[, callback[, options[, body]]]);
```

**Exemple**

```javascript
const sendHttpRequest = require('sendHttpRequest');
const body = {
    user_type:'vip',
    account:'123'
};
// Envoie une requête POST 
sendHttpRequest('https://example.com/collect', function(statusCode, headers, body) {
    // votre code de callback...
}, {
    headers: {
        token: '123456789'
    },
    method: 'POST',
    timeout: 1000
},  JSON.stringify(body));
```

**Paramètres**

| Paramètre      | Type       | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| -------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`url`**      | *string*   | L’URL de la requête.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| **`callback`** | *function* | <p>Un callback facultatif à invoquer à la fin de la requête, en cas d’erreur ou de délai d’attente.<br><br>Il est invoqué avec le <strong>code de statut de la réponse</strong>, le <strong>en-têtes de réponse</strong>, et le <strong>corps de la réponse</strong> (ou undefined s’il n’y avait pas de corps de réponse).<br>Si la requête a échoué (par ex. URL invalide, aucune route vers l’hôte, échec de négociation SSL, etc.), le callback sera invoqué avec un <strong>code de statut de réponse de zéro</strong>, <strong>aucun en-tête</strong>, et un <strong>corps undefined</strong>.<br>Si l’option 'timeout' était définie et que la requête a expiré, le callback sera invoqué avec un <strong>code de statut de réponse de -1</strong>, <strong>aucun en-tête</strong>, et un <strong>corps undefined</strong>.</p> |
| **`options`**  | *object*   | Options de requête facultatives. Les options prises en charge sont : **headers**, **method**, et **timeout**. Les clés d’options inconnues sont ignorées. Des options avancées peuvent être ajoutées dans **extraOptions.**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| **`body`**     | *string*   | Corps de requête facultatif.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |

**Options**

* **headers**: En-têtes supplémentaires de requête.
* **method**: La méthode de requête, par défaut 'GET'.
* **timeout**: Le délai d’attente, en millisecondes, avant l’abandon de la requête.
* **extraOptions**: Options avancées (ex. : {strictSSL:true})

## `md5Sync`

Calcule et renvoie le `md5` digest de l’entrée.

**Syntaxe**

```
md5Sync(input);
```

**Exemple**

```javascript
const md5Sync= require('md5Sync');
const email = {};
email.md5 = md5Sync(user.user_email);
sendHttpGet('https://example.com/collect?e5=' + email.md5);
```

## `templateDataStorage` <a href="#templatedatastorage" id="templatedatastorage"></a>

La `templateDataStorage` helper permet le stockage et la récupération temporaires de données, telles que des jetons API, pendant l’exécution du script. Il est particulièrement utile pour mettre en cache des données réutilisables afin de réduire les appels API redondants. Les données stockées dans `templateDataStorage` persistent sur le serveur exécutant le modèle. Comme les modèles s’exécutent sur plusieurs serveurs, et que chaque serveur peut avoir plusieurs instances, il n’est pas garanti que les données stockées soient accessibles pour toutes les exécutions ultérieures du modèle.

**Syntaxe**

```javascript
templateDataStorage.setItemCopy(key, value);
templateDataStorage.getItemCopy(key);
templateDataStorage.removeItemCopy(key);
```

**Exemple : gestion des jetons API**

```javascript
const sendHttpRequest = require('sendHttpRequest');
const templateDataStorage = require('templateDataStorage');

const tokenKey = 'apiToken';

function fetchNewToken(callback) {
  sendHttpRequest('https://example.com/api/token', function (status, _, body) {
    if (status === 200) {
      const { accessToken, expiresIn } = JSON.parse(body);
      const tokenData = { token: accessToken, expiry: Date.now() + expiresIn * 1000 };
      templateDataStorage.setItemCopy(tokenKey, tokenData);
      callback(accessToken);
    } else {
      callback(null);
    }
  }, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ clientId: 'id', clientSecret: 'secret' }) });
}

function sendEvent(eventData) {
  const cachedToken = templateDataStorage.getItemCopy(tokenKey);
  const token = cachedToken && cachedToken.expiry > Date.now() ? cachedToken.token : null;

  sendHttpRequest('https://example.com/api/events', function (status) {
    if (status === 401) {
      fetchNewToken(function (newToken) {
        if (newToken) {
          sendHttpRequest('https://example.com/api/events', () => {}, { method: 'POST', headers: { Authorization: `Bearer ${newToken}` }, body: JSON.stringify(eventData) });
        }
      });
    }
  }, { method: 'POST', headers: { Authorization: `Bearer ${token}` }, body: JSON.stringify(eventData) });
}

sendEvent({ eventName: 'purchase', value: 100 });
```

| Method                        | Description                                                                                 |
| ----------------------------- | ------------------------------------------------------------------------------------------- |
| **`setItemCopy(key, value)`** | Stocke une valeur sous la clé spécifiée. Écrase la valeur si la clé existe déjà.            |
| **`getItemCopy(key)`**        | Récupère la valeur associée à la clé spécifiée. Renvoie `undefined` si la clé n’existe pas. |
| **`removeItemCopy(key)`**     | Supprime la valeur associée à la clé spécifiée.                                             |

| Paramètre   | Type     | Description                                           |
| ----------- | -------- | ----------------------------------------------------- |
| **`clé`**   | *string* | L’identifiant unique des données à stocker/récupérer. |
| **`value`** | *de*     | Les données à stocker (pour `setItemCopy`).           |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.commandersact.com/fr/fonctionnalites/destinations/destination-builder/javascript-destination-builder/serverside-js-helpers.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
