
Research
/Security News
Weaponizing Discord for Command and Control Across npm, PyPI, and RubyGems.org
Socket researchers uncover how threat actors weaponize Discord across the npm, PyPI, and RubyGems ecosystems to exfiltrate sensitive data.
@fickou/cma-cgm-codeco
Advanced tools
Générateur de messages CODECO (EDI) pour CMA CGM - format SMDG21
Un générateur TypeScript robuste pour créer des messages CODECO (Container Discharge/Loading Order) conformes aux standards EDI UN/EDIFACT D.95B et aux spécifications SMDG21.
Ce projet développe une solution complète de génération de messages CODECO pour l'échange standardisé d'informations sur les mouvements de conteneurs entre les terminaux portuaires et les systèmes de gestion. Il implémente les spécifications du format EDI CODECO utilisé dans l'industrie maritime internationale.
CODECO (Container Discharge/Loading Order) est un message EDI standardisé défini par les Nations Unies dans le cadre UN/EDIFACT qui permet de communiquer les informations relatives aux mouvements de conteneurs dans les ports. Cette implémentation suit les directives SMDG (Ship Management and Cargo Data Group) version 21.
cma-cgm-codeco/
├── src/
│ ├── index.ts # API principale et générateur de messages
│ ├── interface.ts # Définitions des types et énumérations
│ └── validator.ts # Système de validation robuste
├── dist/ # Code compilé (généré par build)
├── package.json # Configuration NPM et dépendances
├── tsconfig.json # Configuration TypeScript
└── README.md # Documentation du projet
index.ts
- Générateur PrincipalcreateMessage()
: API principale de générationcreateMessageStream()
: Génération de streams pour fichiers/HTTPformatDateHelper()
: Utilitaire de formatage de datesinterface.ts
- Définitions de TypesMessage
: Structure complète du message CODECOContainerMessage
: Informations par conteneurMessageType
, EquipmentStatus
, ContainerIndicator
, SealingPartyCoded
MessageOptions
: Options de générationvalidator.ts
- Système de Validationnpm install
npm run build
import {
createMessage,
createMessageStream,
MessageType,
EquipmentStatus,
ContainerIndicator,
SealingPartyCoded
} from './dist/index.js';
// Configuration du message
const message = {
controlRef: "12345",
senderId: "MGEHLDTER",
receiverId: "CMACGM",
navireName: "MSC_OSCAR",
containers: [
{
reference: "MSCU9876543",
status: EquipmentStatus.export,
indicator: ContainerIndicator.full,
bookingRef: "BK2024001",
sealNumber: "SEAL789456",
sealingPartyCoded: SealingPartyCoded.Carrier,
movementAt: new Date('2024-12-20T14:30:00Z')
}
]
};
// Options de génération
const options = {
generatedAt: new Date(),
syntaxType: 2 // UNOA:2
};
// Génération du message CODECO
try {
const codecoLines = createMessage(MessageType.gateIn, message, options);
const codecoMessage = codecoLines.join('\n');
console.log(codecoMessage);
} catch (error) {
console.error('Erreur de génération:', error.message);
}
import { validateData, validateDataSafe, messageSchema } from './dist/validator.js';
// Validation avec exception
try {
validateData(message);
console.log('✅ Message valide');
} catch (error) {
console.error('❌ Validation échouée:', error.message);
}
// Validation sécurisée (sans exception)
const errors = validateDataSafe(message);
if (errors.length === 0) {
console.log('✅ Message valide');
} else {
console.error('❌ Erreurs trouvées:', errors);
}
La bibliothèque supporte maintenant la génération de streams pour une intégration facilité avec les systèmes de fichiers et les réponses HTTP.
import { createMessageStream } from './dist/index.js';
import { writeFile, createWriteStream } from 'fs';
// Génération de stream non compressé (avec sauts de ligne)
const streamOptions = {
generatedAt: new Date(),
syntaxType: 2,
compress: false // Par défaut : false
};
const stream = createMessageStream(MessageType.gateIn, message, streamOptions);
// Utilisation 1: Écriture directe dans un fichier
const fileStream = createWriteStream('codeco-message.edi');
stream.pipe(fileStream);
// Utilisation 2: Réponse HTTP Express.js
app.get('/codeco/:messageId', (req, res) => {
const stream = createMessageStream(MessageType.gateOut, message, {
compress: true // Sans sauts de ligne pour HTTP
});
res.setHeader('Content-Type', 'application/edi-x12');
res.setHeader('Content-Disposition', 'attachment; filename="codeco.edi"');
stream.pipe(res);
});
// Utilisation 3: Lecture complète du stream
async function getMessageContent() {
const stream = createMessageStream(MessageType.gateIn, message, streamOptions);
let content = '';
for await (const chunk of stream) {
content += chunk.toString();
}
return content;
}
compress: false
(défaut) : Les segments EDI sont séparés par des sauts de ligne (\n
)compress: true
: Les segments sont concaténés sans séparateur pour un format compact// Mode non compressé - Lisible
const uncompressed = createMessageStream(MessageType.gateIn, message, { compress: false });
// Résultat:
// UNB+UNOA:2+...+12345'
// UNH+12345+...+12345'
// BGM+34+12345+5'
// ...
// Mode compressé - Compact pour transmission
const compressed = createMessageStream(MessageType.gateIn, message, { compress: true });
// Résultat:
// UNB+UNOA:2+...+12345'UNH+12345+...+12345'BGM+34+12345+5'...
Type | Code | Description | Usage |
---|---|---|---|
Gate In | 34 | Entrée de conteneur | Arrivée au terminal |
Gate Out | 36 | Sortie de conteneur | Départ du terminal |
Statut | Code | Description |
---|---|---|
Export | 2 | Conteneur à l'export |
Import | 3 | Conteneur à l'import |
Transbordement | 6 | Conteneur en transit |
Indicateur | Code | Description |
---|---|---|
Vide | 4 | Conteneur vide |
Plein | 5 | Conteneur chargé |
Partie | Code | Description |
---|---|---|
Transporteur | CA | Carrier |
Douanes | CU | Customs |
Expéditeur | SH | Shipper |
Opérateur Terminal | TO | Terminal Operator |
Inconnu | AB | Unknown/Other |
Code | Format | Exemple | Utilisation |
---|---|---|---|
102 | YYYYMMDD | 20241220 | Dates simples |
203 | YYYYMMDDHHMM | 202412201430 | Dates avec heure |
303 | YYYYMMDDHHMMSS | 20241220143045 | Horodatage précis |
610 | WWYYYY | 512024 | Semaine/année |
Un message CODECO complet suit cette structure EDI standardisée :
UNB+UNOA:2+MGEHLDTER+CMACGM+241220:1430+12345' # En-tête interchange
UNH+12345+CODECO:D:95B:UN:SMDG21+12345' # En-tête message
BGM+34+12345+5' # Début de message
TDT+20++1++:172:20' # Transport
NAD+MS+MGEHLDTER' # Expéditeur
NAD+CA+MSC_OSCAR:160:20' # Navire
EQD+CN+MSCU9876543+4210:102:5++2+5' # Équipement
RFF+BN:BK2024001' # Référence
DTM+203:20241220143000:203' # Date/heure
LOC+165+MGEHL:139:6+MGEHLDTER:TER:ZZZ' # Localisation
MEA+AAE+G+KGM:24280' # Poids
SEL+SEAL789456+CA' # Scellé
CNT+1:1' # Compteur
UNT+13+12345' # Fin message
UNZ+1+12345' # Fin interchange
controlRef
: Référence de contrôle (max 14 caractères)senderId
, receiverId
: Identifiants des parties (max 35 caractères)navireName
: Nom du navire (max 35 caractères)containers
: Liste non vide de conteneursreference
: Référence conteneur (max 11 caractères, format ISO)status
: Statut valide (export/import/transbordement)indicator
: Indicateur valide (plein/vide)bookingRef
: Référence de réservation (max 35 caractères)sealNumber
: Numéro de scellé (max 20 caractères)sealingPartyCoded
: Partie responsable validemovementAt
: Date de mouvement valideLe système de validation produit des messages d'erreur en français, détaillés et précis :
Validation échouée :
message.controlRef est obligatoire
message.containers[0].reference ne peut dépasser 11 caractères
message.containers[0].status doit être parmi: 2, 3, 6
message.containers[1].movementAt doit être une date valide
Le projet utilise TypeScript avec une configuration stricte pour assurer la qualité du code :
{
"compilerOptions": {
"target": "es2016",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
"outDir": "dist"
}
}
src/
npm run build
pour générer dist/
Le projet maintient un nombre minimal de dépendances :
dayjs
pour la manipulation des datestypescript
pour la compilationProjet privé CMA CGM - Tous droits réservés
Ce logiciel est la propriété de CMA CGM et est destiné à un usage interne uniquement. Toute reproduction, distribution ou modification sans autorisation expresse est interdite.
FAQs
Générateur de messages CODECO (EDI) pour CMA CGM - format SMDG21
We found that @fickou/cma-cgm-codeco demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
/Security News
Socket researchers uncover how threat actors weaponize Discord across the npm, PyPI, and RubyGems ecosystems to exfiltrate sensitive data.
Security News
Socket now integrates with Bun 1.3’s Security Scanner API to block risky packages at install time and enforce your organization’s policies in local dev and CI.
Research
The Socket Threat Research Team is tracking weekly intrusions into the npm registry that follow a repeatable adversarial playbook used by North Korean state-sponsored actors.